【问题标题】:ASP.NET CheckBoxList DataBinding QuestionASP.NET CheckBoxList 数据绑定问题
【发布时间】:2009-05-18 19:45:46
【问题描述】:

是否可以对 ASP.NET CheckBoxList 进行数据绑定,使数据中的字符串值成为复选框的标签,而布尔值选中/取消选中该框?

在我的 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 = "Checked"。结果是一样的。我似乎找不到 DataBind 的方法并自动选中/取消选中复选框。

目前我通过为 DataBound 事件中的相应项目设置 selected = true 来解决问题。似乎有一个更清洁的解决方案超出了我的掌握。

谢谢

【问题讨论】:

标签: asp.net web-controls


【解决方案1】:

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

【讨论】:

  • 谢谢 Jose,您的回答说明了情况。
  • 在 ASP.NET 中似乎是一个奇怪的遗漏。为什么他们也没有 DataCheckedField 属性?
【解决方案2】:

在厌倦了OnItemDataBound-binding 之后,我为此做了一个自定义控件。 它会让你绑定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);
            }
        }
    }
}

【讨论】:

  • 看起来很有趣,但dataSelectedField 显示错误。有什么建议吗?
  • @MAW74656 尝试将其替换为dataCheckedField。看起来像三年前的错字。请就您的结果提供反馈!
  • 这在 6 年后拯救了我。这对于在我的项目中加载自定义标签也很有帮助:stackoverflow.com/a/2009245/6297313
【解决方案3】:

无法使用标记。您可以做的是像您希望的那样绑定复选框列表 - 使用 DataValueField 中的布尔值,然后简单地将其添加为 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 进行绑定。

【讨论】:

  • 是的,此解决方案适用于 .NET v4.5,而前一个则不适用。
【解决方案4】:

我认为您必须告诉控件将其绑定到哪个属性...在本例中为“InRole”。

我玩过它,似乎没有办法绑定到复选框的选择,你必须自己做。我能够绑定到清单的文本和值,这似乎只处理列表中每个复选框的标签。

【讨论】:

  • 在 *.aspx 文件中,我声明了带有属性 DataValueField="InRole" 的 CheckBoxList。是这个意思吗?
  • 这就是我所说的...我没有滚动看到您在 UI 代码中设置了它...抱歉。
  • 事实是这个值经常被用来做进一步的处理。
【解决方案5】:

使用DataList 可能是另一种选择

<asp:DataList ID="dataListRoles" runat="server">
    <ItemTemplate>
        <asp:CheckBox runat="server" Text='<%# Eval("UserName ") %>' Checked='<%# Eval("IsInRole") %>' />
    </ItemTemplate>
</asp:DataList>

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多