通過自訂欄位類型實現SharePoint列表的父子關係

來源:互聯網
上載者:User
文章目錄
  • 執行個體
  • 建立“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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.