当前位置:  开发笔记 > 后端 > 正文

ASP.NET CheckBoxList DataBinding问题

如何解决《ASP.NETCheckBoxListDataBinding问题》经验,为你挑选了3个好方法。

是否有可能DataBind ASP.NET CheckBoxList,以便数据中的字符串值成为复选框的标签,bool值检查/取消选中该框?

在我的asp.net webform上,我有一个像这样的CheckBoxList:


在后面的代码我有这个代码:

var usersInRole = new List 
{ 
  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来解决问题.似乎有一个更清晰的解决方案,超出我的掌握.

谢谢



1> Jose Basilio..:

编辑:通过标记没有办法做到这一点.DataValueField不确定复选框项是否已检查.它检索或存储要在回发中使用的值.该DataValueField跨越CheckBoxLists,RadioButtonLists,列表控件等常见

这是预先选择复选框的唯一方法.

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

foreach(ListItem item in chkListRoles.Items)
 item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole;


看起来像是ASP.NET中的一个奇怪的遗漏.为什么他们也没有DataCheckedField属性呢?
还要感谢我José,我将使用那个lambda ;-)

2> sshow..:

在厌倦了OnItemDataBound绑定之后,我为此做了一个自定义控件.它将允许您绑定Selected属性.您可以RadioButtonList通过更改自定义控件的派生来轻松地进行相同的控制.

要使用它,只需DataCheckedField在标记中创建控件时添加属性即可.请记住在web.config文件中引用自定义控件.

标记


控制代码

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> Niklas Jonss..:

使用标记是不可能的.您可以做的是将复选框列表绑定,就像您希望它一样 - 使用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绑定.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有