是否有可能进行数据绑定的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 =真。我也试着InRole =“检查”。结果是一样的。我似乎无法找到一种方法进行数据绑定,并自动拥有的复选框选中/取消。

目前我通过设定选择=真在DataBound事件适当的项目解决的问题。好像有一个清晰的解决方案只是超出了我的把握。

感谢您

有帮助吗?

解决方案

编辑:有没有办法通过标记来做到这一点。该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;

其他提示

我给这个自定义控制,腻的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);
            }
        }
    }
}

有使用标记是不可能的。你可以做的是对的CheckBoxList绑定像你想它的工作 - 与DataValueField的布尔,然后简单地将其添加为OnDataBound事件。

protected void myCheckBoxList_DataBound(object sender, EventArgs e)
    {
        foreach (ListItem item in myCheckBoxList.Items)
        {
            item.Selected = bool.Parse(item.Value);
        }
    }

该溶液中并通过Jose巴西利奥提出的一个之间的不同之处在于这一个适用于所有种类的数据绑定的方法。例如使用新ModelBinding特征在V4.5与SelectMethod结合。

我想你会告诉什么属性将其绑定到......在这种情况下,“InRole”控制。

我打了与它周围好像有noway绑定到复选框的选择,你必须自己做。我能够绑定到文本和清单的值只似乎对付列表中的每个复选框的标签。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top