WebControl中的自定义ListItemCollection

时间:2018-05-16 07:11:01

标签: c# data-binding web-controls

我正在为SharePoint开发Feature,但我是非常新的asp / ascx。

System.Web.UI.WebControls.CheckBoxList是我需要的,但我需要自定义ListItemCollection Items System.Web.UI.WebControls.ListControl,因为我需要向ListItem添加属性。

我写了以下内容:

namespace My.SharePoint.Controls
{
    public class CheckBoxListWithSelectBox : CheckBoxList
    {
        private DialogFieldItemCollection items;

        private ICustomResourcer _recourcer;

        public void SetCustomResourcer(ICustomResourcer resourcer)
        {
            _recourcer = resourcer;
        }

        public new DialogFieldItemCollection Items
        {
           get
           {
               if (this.items == null)
               {
                   this.items = new DialogFieldItemCollection();
                   if (base.IsTrackingViewState)
                   {
                       this.items.TrackViewState();
                   }
               }
               return this.items;
           }
        }

        protected override void Render(HtmlTextWriter writer)
        {
           writer.Write("<tr><td><img width='1' height='3' style='display: block;' alt='' src='/_layouts/15/images/blank.gif?rev=40' data-accessibility-nocheck='true'/></td></tr>");

           writer.Write("<tr>");
           writer.Write("<td width='11'><img width='11' height='1' style='display: block;' alt='' src='/_layouts/15/images/blank.gif?rev=40' data-accessibility-nocheck='true'/></td>");
           writer.Write("<td width='99%' class='ms-authoringcontrols'><table>");

           IEnumerable<DialogFieldItem> selectedItems = from i in Items.Cast<DialogFieldItem>()
                                                        where i.Selected
                                                        select i;

           foreach (DialogFieldItem field in selectedItems)
           {
               writer.Write(BuildTr(field, field.Position));
           }

           IEnumerable<DialogFieldItem> unSelectedItems = from i in Items.Cast<DialogFieldItem>()
                                                          where !i.Selected
                                                          select i;

           int selectedItemCount = selectedItems.Count();

           for (int j = 0; j < unSelectedItems.Count(); j++)
           {
               writer.Write(BuildTr(unSelectedItems.ElementAt(j), selectedItemCount + j));
           }

           writer.Write("</table></td></tr>");
        }


        private string BuildTr(DialogFieldItem item, int index)
        {
           StringBuilder sb = new StringBuilder();

           sb.Append("<tr>");

           sb.Append("<td>");
           sb.Append("<input type='checkbox' ");
           if (item.Selected)
           {
               sb.Append("checked='checked' ");
           }
           sb.Append($"name='ShouldDisplay{HttpUtility.HtmlEncode(item.Value)}' ");
           sb.Append($"id='ShouldDisplay{HttpUtility.HtmlEncode(item.Value)}' ");
           sb.Append($"onclick=''");
           sb.Append("></input>");
           sb.Append($"<label for='ShouldDisplay{HttpUtility.HtmlEncode(item.Value)}'>{HttpUtility.HtmlEncode(item.Text)}</label>");
           sb.Append("</td>");
           sb.Append("<td>&nbsp;</td>");
           sb.Append("<td>");
           sb.Append($"<select title='{_recourcer.GetString("wss", "viewedit_position_param")}' onchange='Reorder(this, {index}, {Items.Count})' name='ViewOrder{index}'>");

           for (int i = 0; i < Items.Count; i++)
           {
               sb.Append($"<option value='{i + 1}_{HttpUtility.HtmlEncode(item.Value)}'");
               if (i == index)
               {
                   sb.Append("selected='selected' ");
               }
               sb.Append($">{i + 1}</option>");
           }

           sb.Append("</select>");
           sb.Append("</td>");
           sb.Append("</tr>");

           return sb.ToString();
        }
    }
}

它有效,输出正确,但是当数据从客户端提交回服务器时,Items变量为空。我想数据绑定丢失但我不知道如何做什么,没有在网上找到任何信息(不知道到底要找什么)。

0 个答案:

没有答案