文章目錄
- 執行個體
- 建立“My Child Items”欄位
- 原始碼
- 添加一個新的子項
- 方案套件下載安裝
父子關係在現實情境中很常見。在SharePoint裡,表現為兩個SharePoint列表通過一個位於子列表中的查閱項欄位進行關聯。通過這種形式,就可以在列表間建立一個父子關係。
我們往往需要實現在父列表表單中(DispForm.aspx,EditFrom.aspx,NewForm.aspx)展現子項。為此,我建立了一個SharePoint自訂欄位類型:“ParentChildrenField”。
執行個體
本例的目的是實現一個自訂的選項卡對話方塊的導航,用於替換SharePoint網站預設的頂部導航,為此我建立了兩個SharePoint 列表:Tabs和Sub-Tabs。我建立了一個網站欄“Parent Tab”,類型為查閱項,資料來源於Tabs的“標題”。這個欄被添加到“Sub-Tabs”列表中。
建立“My Child Items”欄位
為了在Tab的表單(Display,Edit和New)中顯示子項(sub-tabs),我建立了一個SharePoint網站欄“My Child Items”,類型為前面定義的“ParentChildrenField”。這個欄被添加到父列表“Tabs”中。通常情況下,添加欄到列表內容類型比直接添加到列表要好。
原始碼
public class ParentChildrenFieldControl : TextField{ int NumOfChildren = 0; LiteralControl literalCtrl; SPList childList = null; Guid listID = SPContext.Current.List.ID; //.ToString(); HyperLink linkAddNew = new HyperLink(); protected override void CreateChildControls() { base.CreateChildControls(); if (this.ControlMode == SPControlMode.Display || this.ControlMode == SPControlMode.Edit || this.ControlMode == SPControlMode.New) { literalCtrl = new LiteralControl(); base.Controls.Add(literalCtrl); base.Controls.Add(linkAddNew); } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); string childListname = this.Field.GetCustomProperty("ChildListName").ToString(); try { try { childList = SPContext.Current.Web.Lists[childListname]; } catch { throw new ConfigurationErrorsException(@"Child List " + childListname + " doesn't exist at the site."); } StringBuilder sb = new StringBuilder(); try { SPQuery query = new SPQuery(childList.DefaultView); query.Query = string.Format(@" <Where> <Eq> <FieldRef Name='{0}' LookupId='true' /> <Value Type='Integer'>{1}</Value> </Eq> </Where>", LookupField.InternalName, this.Item.ID.ToString()); sb.Append(childList.RenderAsHtml(query)); } catch (Exception ex) { sb.Append("<p>There was an error loading the list information:<br />"); sb.Append(ex.Message); sb.Append("</p>"); } literalCtrl.Text = sb.ToString(); // Add new linkAddNew.Text = "Add New"; string navigateUrl = string.Format("/NewForm.aspx?{0}={1}&Source={2}", SPEncode.UrlEncode(LookupField.Title), SPContext.Current.ListItem.ID.ToString(), SPEncode.UrlEncode(this.Page.Request.Url.ToString())); linkAddNew.NavigateUrl = childList.RootFolder.ServerRelativeUrl + navigateUrl; } catch (Exception ex) { literalCtrl.Text = ex.Message; } } SPField _LookupField = null; SPField LookupField { get { if (_LookupField == null) { foreach (SPField field in childList.Fields) { if (field is SPFieldLookup && listID == new Guid(((SPFieldLookup)field).LookupList)) { _LookupField = field; break; } } } return _LookupField; } } protected override void Render(HtmlTextWriter output) { literalCtrl.RenderControl(output); // Add New link if (this.ControlMode == SPControlMode.Display || this.ControlMode == SPControlMode.Edit) linkAddNew.RenderControl(output); } public override void UpdateFieldValueInItem() { this.EnsureChildControls(); try { this.Value = NumOfChildren; this.ItemFieldValue = this.Value; } catch (Exception) { ; } }}
添加一個新的子項
當使用者添加新子項時,我們應該在NewForm.aspx表單中自動為使用者選中“Parent Tab”下拉框中相應的項。這就是為什麼我們要在查詢字串中添加查閱項欄位的名稱和值:“NewForm.aspx?Parent%20Tab=1&Source=...”。
將如下的JavaScript代碼放置在子列表的NewForm.aspx中。最好的位置當然是放在“PlaceHolderBodyAreaClass”裡。
<script type="text/javascript">var qs = location.search.substring(1, location.search.length); var nameVal = qs.split("&")[0].split("="); SetLookupFieldValue(unescape(nameVal[0]), nameVal[1]); function SetLookupFieldValue(fieldName, val) { var theSelect = getTagFromIdentifierAndTitle("select", "Lookup", fieldName); if (theSelect != null) { theSelect.value = val; return; } // if theSelect is null, // it means that the target list has more than 20 items, // and the Lookup is being rendered with an input element var theInput = getTagFromIdentifierAndTitle("input", "", fieldName); theInput.value = val;}function getTagFromIdentifierAndTitle(tagName, identifier, title) { var len = identifier.length; var tags = document.getElementsByTagName(tagName); for (var i = 0; i < tags.length; i++) { var tempString = tags[i].id; if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) return tags[i]; } return null;} </script>方案套件下載安裝
方案套件“ParentChildRelationship.wsp”是用Visual Studio Extensions VseWSS v1.3開發的。開啟“Setup.bat”,設定你的網站集合和網站的URL地址:
set DefaultWebUrl=http://YourWeb set DefaultSiteUrl=http://YourSite
然後運行setup.bat即可完成安裝。卸載時,運行setup.bat -u。
安裝完成後,建立一個網站欄(比如MyChildren),類型為ParentChildrenField。輸入子列表的名稱(不是url)。然後,將該欄添加到父列表中即可。
原始碼 安裝包
參考資料
SharePoint List Parent /Child Relationship