是否可以对DataBind一个ASP.NET CheckBoxList,使得数据中的字符串值成为复选框的标签,并且bool值检查/取消选中该框?
在我的asp.net webform上,我有一个像这样的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 =“Checked”。结果是一样的。我似乎无法找到DataBind的方法,并自动选中/取消选中复选框。
目前,我通过为DataBound事件中的相应项设置selected = true来解决问题。似乎有一个更清晰的解决方案,超出了我的掌握。
谢谢
答案 0 :(得分:38)
编辑:通过标记无法做到这一点。 DataValueField不确定复选框项是否已检查。它检索或存储要在回发中使用的值。 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;
答案 1 :(得分:9)
在厌倦了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);
}
}
}
}
答案 2 :(得分:5)
使用标记是不可能的。您可以做的是将复选框列表绑定,就像您希望它一样 - 使用DataValueField中的bool,然后将其添加为OnDataBound事件。
protected void myCheckBoxList_DataBound(object sender, EventArgs e)
{
foreach (ListItem item in myCheckBoxList.Items)
{
item.Selected = bool.Parse(item.Value);
}
}
这个解决方案与Jose Basilio提出的解决方案之间的区别在于,这个解决方案适用于所有类型的数据绑定方法。例如,使用v4.5中的新ModelBinding功能与SelectMethod绑定。
答案 3 :(得分:0)
我认为你必须告诉控件将它绑定到哪个属性...在本例中为“InRole”。
我玩了它,似乎现在要绑定到复选框的选择,你必须自己做。我能够绑定到清单的文本和值,它们似乎只处理列表中每个复选框的标签。
答案 4 :(得分:0)
使用 DataList
可能是另一种选择
<asp:DataList ID="dataListRoles" runat="server">
<ItemTemplate>
<asp:CheckBox runat="server" Text='<%# Eval("UserName ") %>' Checked='<%# Eval("IsInRole") %>' />
</ItemTemplate>
</asp:DataList>