ASP.NET CheckBoxList DataBinding Question
Возможно ли DataBind ASP.NET CheckBoxList, чтобы строковое значение в данных стало меткой этого флажка, а значение bool проверяет/отменяет флажок?
На моей веб-форме asp.net у меня есть CheckBoxList, как это:
<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" />
В коде позади у меня есть этот код:
var usersInRole = new List<UserInRole>
{
new UserInRole { UserName = "Frank", InRole = false},
new UserInRole{UserName = "Linda", InRole = true},
new UserInRole{UserName = "James", InRole = true},
};
chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();
Я как бы надеялся, что флажки будут проверяться, когда InRole = true. Я также попробовал InRole = "Проверено". Результаты были одинаковыми. Кажется, я не могу найти способ DataBind и автоматически отмечать или не проверять флажки.
В настоящее время я решаю проблему, установив для нее выбранные = true для соответствующих элементов в событии DataBound. Похоже, есть более чистое решение, которое выходит за рамки моего понимания.
Спасибо
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: Нет способа сделать это через разметку. DataValueField не определяет, проверяется ли элемент флажка или нет. Он извлекает или сохраняет значение, которое будет использоваться в postbacks. DataValueField является общим для CheckBoxLists, RadioButtonLists, ListControl и т.д.
Это единственный способ предварительно установить флажки, как вы уже узнали.
chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();
foreach(ListItem item in chkListRoles.Items)
item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole;
Ответ 2
Я сделал для этого специальный контроль, устав от привязки OnItemDataBound
.
Это позволит вам привязать атрибут Selected
. Вы можете легко сделать один и тот же элемент управления для RadioButtonList
, изменив то, что получает пользовательский элемент управления.
Чтобы использовать это, просто добавьте атрибут DataCheckedField
при создании элемента управления в вашей разметке. Не забудьте ссылаться на пользовательские элементы управления в файле web.config.
Разметка
<myControls:SimpleCheckBoxList runat="server" ID="chkListRoles"
DataCheckedField="InRole"
DataTextField="UserName"
DataValueField="UserId" />
Код для управления
public class SimpleCheckBoxList : System.Web.UI.WebControls.CheckBoxList
{
public string DataCheckedField
{
get
{
string s = (string)ViewState["DataCheckedField"];
return (s == null) ? String.Empty : s;
}
set
{
ViewState["DataCheckedField"] = value;
if (Initialized)
OnDataPropertyChanged();
}
}
protected override void PerformDataBinding(IEnumerable dataSource)
{
if (dataSource != null)
{
if (!this.AppendDataBoundItems)
this.Items.Clear();
if (dataSource is ICollection)
this.Items.Capacity = (dataSource as ICollection).Count + this.Items.Count;
foreach (object dataItem in dataSource)
{
ListItem item = new ListItem()
{
Text = DataBinder.GetPropertyValue(dataItem, DataTextField).ToString(),
Value = DataBinder.GetPropertyValue(dataItem, DataValueField).ToString(),
Selected = (DataCheckedField.Length > 0) ? (bool)DataBinder.GetPropertyValue(dataItem, DataCheckedField) : false
};
this.Items.Add(item);
}
}
}
}
Ответ 3
Невозможно использовать разметку. Что вы можете сделать, так это привязать checkboxlist, как вы хотели, чтобы он работал - с bool в DataValueField, а затем просто добавьте это как событие OnDataBound.
protected void myCheckBoxList_DataBound(object sender, EventArgs e)
{
foreach (ListItem item in myCheckBoxList.Items)
{
item.Selected = bool.Parse(item.Value);
}
}
Разница между этим решением и предложением, предложенным Хосе Базилио, заключается в том, что он работает со всеми типами методов привязки данных. Например, привязка с помощью SelectMethod с использованием новой функции ModelBinding в версии 4.5.
Ответ 4
Я бы подумал, что вам нужно будет указать контроль над тем, какое свойство привязать его к... в этом случае "InRole".
Я играл с ним и, похоже, теперь есть привязка к выбору флажка, вы должны сделать это сами. Я смог привязать текст и значения контрольного списка, который, по-видимому, имеет дело с меткой каждого флажка в списке.