利用Module 创建 SharePoint List View

SharePoint 如何给 LIST 增加或者修改视图呢?

首先创建一个Views的Module

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="Views">
  <File Path="Views\Views.xml" Url="Views.xml" Type="Ghostable"/>
</Module>
 <Module Name="Views" >
    <File Path="Views\Elements.xml" Url="Elements_$SharePoint.Feature.Id$.xml" Type="Ghostable" />
 </Module>
</Elements>
 
这里Elements_$SharePoint.Feature.Id$.xml用法可以参照 http://www.cnblogs.com/SharePointGuy/archive/2012/03/19/2407194.html 
 
创建一个VIEWs的XML文件
<?xml version="1.0" encoding="utf-8" ?>
<Views>
  <View Name="{8A3B11DF-46D7-43C5-A40C-72903FCEE515}" Type="HTML" 

DisplayName

="InviteeDetailCustomView" 

ListTitle

="Invitees" Url="/sites/msracc/Lists/Invitees/InviteeDetailCustomView.aspx" Level="1" BaseViewID="1" ContentTypeID="0x" ImageUrl="/_layouts/images/generic.png">
    <Query />
    <ViewFields>
      

<FieldRef Name="Title" /> <FieldRef Name="FieldInternalName" />

    </ViewFields>
    <RowLimit Paged="TRUE">2147483647</RowLimit>
  </View>
</Views>
 
这里可以扩展多个FieldRefs,视图的顺序按照FieldRef的排列顺序显示。
 
 
然后用一个FEATURE将这个文件部署到一个指定的LIST 并创建相应的视图。
   1:  public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
   2:          {
   3:              string featureID = properties.Feature.DefinitionId.ToString();
   4:              string pattern = string.Format(@"^.+_{0}.xml$", featureID);
   5:              var files = SPContext.Current.Site.RootWeb.RootFolder.Files.Cast<SPFile>().Where(f => Regex.IsMatch(f.Name, pattern));
   6:              var deleteFiles = files.Select(f => f.Name);
   7:              foreach (SPFile file in files)
   8:              {
   9:                  XElement xElement = GetRequestFile(file);
  10:                  XNamespace xns = XNamespace.Get("http://schemas.microsoft.com/sharepoint/");
  11:                  var names = xElement.Elements(XName.Get("Module", xns.NamespaceName)).SelectMany(ma => ma.Elements(XName.Get("File", xns.NamespaceName)).Where(f => !f.Attribute("Url").Value.Contains(featureID)).Select(f => f.Attribute("Url").Value));
  12:                  foreach (var name in names)
  13:                  {
  14:                     SPFile f = SPContext.Current.Site.RootWeb.GetFile(name);
  15:                     if (f != null && f.Exists)
  16:                     {
  17:                         f.Delete();
  18:                     }
  19:                  }
  20:              }
  21:              foreach (var f in deleteFiles)
  22:              {
  23:                  SPFile spfile = SPContext.Current.Site.RootWeb.GetFile(f);
  24:                  spfile.Delete();
  25:              }
  26:   
  27:              SPContext.Current.Site.RootWeb.Update();
  28:          }
  29:          public override void FeatureActivated(SPFeatureReceiverProperties properties)
  30:          {
  31:              string featureID = properties.Feature.DefinitionId.ToString();
  32:              string pattern = string.Format(@"^.+_{0}.xml$", featureID);
  33:              var files = SPContext.Current.Site.RootWeb.RootFolder.Files.Cast<SPFile>().Where(f => Regex.IsMatch(f.Name, pattern));
  34:   
  35:              foreach (SPFile file in files)
  36:              {
  37:                  XElement xElement = GetRequestFile(file);
  38:                  XNamespace xns = XNamespace.Get("http://schemas.microsoft.com/sharepoint/");
  39:                  var names = xElement.Elements(XName.Get("Module", xns.NamespaceName)).SelectMany(ma => ma.Elements(XName.Get("File", xns.NamespaceName)).Where(f => !f.Attribute("Url").Value.Contains(featureID)).Select(f => f.Attribute("Url").Value));
  40:                  foreach (var name in names)
  41:                  {
  42:                      UpdateOrAddView(SPContext.Current.Site.RootWeb, name);
  43:                  }
  44:              }
  45:          }
  46:   
  47:          private  void UpdateOrAddView(SPWeb web, string fileName)
  48:          {
  49:              SPFile file = web.RootFolder.Files.Cast<SPFile>().Where(f => f.Name.Equals(fileName)).FirstOrDefault();
  50:              if (file != null && file.Exists)
  51:              {
  52:                  XElement element = GetRequestFile(file);
  53:                  element.Elements().Where(e => e.Name.ToString().Equals("View")).ToList().ForEach(li => UpdateOrAddView(web, li));
  54:              }
  55:          }
  56:   
  57:          private  XElement GetRequestFile(SPFile file)
  58:          {
  59:              XmlReader r = XmlReader.Create(file.OpenBinaryStream());
  60:              XElement element = XElement.Load(r);
  61:              return element;
  62:          }
  63:   
  64:          private  void UpdateOrAddView(SPWeb web, XElement li)
  65:          {
  66:              var list = web.Lists.TryGetList(li.Attribute("ListTitle").Value);
  67:              var fieldRefs = GetFieldsStringCollection(li);
  68:              var rowLimit = uint.Parse(li.Element("RowLimit").Value);
  69:              var isPaged = Boolean.Parse(li.Element("RowLimit").Attribute("Paged").Value);
  70:              var viewDisplayName = li.Attribute("DisplayName").Value;
  71:              if (list != null)
  72:              {
  73:                  SPView view = list.Views.Cast<SPView>().Where(v => v.Title.Equals(viewDisplayName)).FirstOrDefault();
  74:                  if (view != null)
  75:                  {
  76:                      //// Update view
  77:                      view.ViewFields.DeleteAll();
  78:                      view.RowLimit = rowLimit;
  79:                      view.Paged = isPaged;
  80:   
  81:                      foreach (var f in fieldRefs)
  82:                      {
  83:                          view.ViewFields.Add(f);
  84:                      }
  85:                      view.Update();
  86:                  }
  87:                  else
  88:                  {
  89:                      /// Add view
  90:                      list.Views.Add(viewDisplayName,
  91:                                       fieldRefs,
  92:                                       string.Empty,
  93:                                      rowLimit,
  94:                                      isPaged,
  95:                                      false
  96:                                      );
  97:                      list.Update();
  98:                  }
  99:              }
 100:          }
 101:          private  System.Collections.Specialized.StringCollection GetFieldsStringCollection(XElement li)
 102:          {
 103:              var stringCollection = new System.Collections.Specialized.StringCollection();
 104:              var fieldRefs = li.Descendants("FieldRef");
 105:              if (fieldRefs != null)
 106:              {
 107:                  foreach (var f in fieldRefs)
 108:                  {
 109:                      stringCollection.Add(f.Attribute("Name").Value);
 110:                  }
 111:              }
 112:              return stringCollection;
 113:          }

这样视图就可以和LIST通过FEATURE 来进行一个关联了。

posted @ 2012-03-20 11:57  SharePoingGuy  阅读(621)  评论(0编辑  收藏  举报