【问题标题】:Populating a CheckBoxList with checked options programmatically以编程方式使用选中的选项填充 CheckBoxList
【发布时间】:2012-12-06 09:09:41
【问题描述】:

我觉得我在这里缺少一些关于 asp.net 页面生命周期的非常基本的东西。

我有一个 CheckBoxList(虽然 ListBox 也会发生同样的事情)

    <asp:CheckBoxList runat="server" ID="cblCountriesAccessible" DataTextField="Text" />

我正在向它添加一堆 ListItems

        var lbData = new List<ListItem>();
        lbData.Add(new ListItem("x", "", true));
        lbData.Add(new ListItem("y", "", false));

然后将它们绑定到 CheckBoxList

    cblCountriesAccessible.DataSource = lbData;
    cblCountriesAccessible.DataBind();

并且每次列表中的项目显示为未选中(或在列表框中未选中) 如果我将 ListItems 直接添加到标记中的控件,它们会显示为选中或未选中。

    <asp:ListItem Text="x" Value="" Selected="True" />

我在选择没有执行的代码中做错了什么?我尝试在 Checked 设置为 true 的情况下绑定 CheckBoxes,但同样的事情发生了。

编辑:好的,我没有正确设置 Selected。我现在正在使用

        var lbData = new List<ListItem>();
        var l1 = new ListItem("yy", "", true) {Selected = true};
        var l2 = new ListItem("xx", "", true) {Selected = false};

        lbData.Add(l1);
        lbData.Add(l2);

他们仍然没有按检查加载

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    您可以创建ListItem 更改其Selected 属性并添加到集合中。

    ListItem li1 = new ListItem("x", "", true);
    ListItem li2 = new ListItem("x", "", true); 
    li1.Selected = true; 
    li2.Selected = true;
    cblCountriesAccessible.Items.Add(li1);
    cblCountriesAccessible.Items.Add(li2);
    

    【讨论】:

    • ListItem 没有 Checked 属性,只有 Selected,它是在构造函数中设置的。我试过用 Checked = true 制作 CheckBoxes 而不是 ListItems,但这也没有用
    • Its Selected not Checked, 更新了我的代码请看一下。
    • Selected 已在构造函数的第三个参数中设置。如果您在 Page_Load 中运行代码,您能否尝试一下,看看它们是否显示为选中状态?也许我的设置有点奇怪。
    • 根据文档,第三个参数实际上是指定是否启用该项目,而不是它是否被选中:msdn.microsoft.com/en-US/library/ec0w4405(v=vs.110).aspx
    • 啊,我明白了,删除数据绑定就可以了。只需将项目直接添加到连接中即可。绑定会放弃选择仍然很奇怪。
    【解决方案2】:

    ListItem.EnabledListItem.Selected 不同。根据这个 MSDN 页面 (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listitem.enabled.aspx)

    启用只是确定是否可以选择它。使用此重载创建项目时,它不会选择它。

    根据此页面 (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkboxlist.aspx):“要确定 CheckBoxList 控件中的选定项,请遍历 Items 集合并测试集合中每个项的 Selected 属性。”

    我过去曾使用 LINQ 完成此操作,方法是预先确定我的项目列表,然后遍历它们。

    这里有一些未经测试的代码,应该会给你一个想法。这基本上是我对 Win Forms 做同样事情的方式,所以你的用法可能会略有不同:

    For each item in Items
        CheckedListBox.Items.Add(item.Name,Item.value,True)
    Next
    
    dim selectedItems as list(of Item) = items.where(function (x) x.selected = True)
    
    for each item in CheckedListBox.items
        item.Selected = selectedItems.contains(item.Value)
    next
    

    【讨论】:

    • 好的,这行得通。当您进行 DataBind 时,Selected 属性似乎已被转储。如果您循环浏览刚刚绑定的项目,那么设置它工作的 Selected 属性。对于额外的布朗尼点,谁能解释为什么?
    • @Mikey,因为呈现的 HTML 是一个输入列表,它只有 Checked 属性将其设置为“已选择”。换句话说,控件必须绑定到数据,构建自身,然后将其公开为复选框列表。要解决此问题,请改用中继器。
    【解决方案3】:
    public string GetListItems()
    {
        System.Collections.Generic.List<string> items = new System.Collections.Generic.List<string>();
    
        foreach (ListItem item in lstfunction.Items)
        {
            if (item.Selected)
            {
                items.Add(item.Value);
            }
        }
    
        return String.Join(", ", items.ToArray());
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      相关资源
      最近更新 更多