Пользовательская коллекция ListItemCollection в WebControl - PullRequest
0 голосов
/ 16 мая 2018

Я разрабатываю Feature для SharePoint, но я совершенно новый 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 пуста. Я предполагаю, что привязка данных отсутствует, но я не знаю, как / что делать, не нашел никакой информации в Интернете (точно не знаю, что искать).

...