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