复选框列表列表动态添加数据后项计数始终为 0

本文关键字:列表 动态 添加 数据 复选框 | 更新日期: 2023-09-27 18:14:31

我在aspx代码中有以下代码。我想添加ListItem复选框到ColumnsList并在单击按钮时查找所有选中的复选框。

但是当我尝试在按钮上获取所选项目时,单击列列表计数变为 0。

<asp:checkboxlist runat="server" EnableViewState="true" id="ColumnsList"/>

在代码隐藏中,我将数据添加到我的列列表中,如下所示

public override void OnLoad()
{
    if(!this.IsPostBack)
    {
       this.ColumnsList.Items.Add(new ListItem { Text= "Text1",  Value = "value1"    });
       this.ColumnsList.Items.Add(new ListItem { Text= "Text2",  Value = "value2"  });
    }
}

这是按钮点击监听器

private void Button_Click(object sender, EventArgs eventArgs)
{
    // Count is 0 instead of 2
    var count = this.ColumnsList.Items.Count;
    foreach(ListItem item in this.ColumnsList.Items)
    {
        var selected = item.Selected;
        // add selected to a list..etc
    }
}           

注意:应用程序部署在共享点 2010 中。

复选框列表列表动态添加数据后项计数始终为 0

我试图模拟您正在尝试的内容,这是逐步的解决方案。

步骤1 override OnLoad():您可以使用 Page_Load()将项添加到ComboBoxList控件的方法,例如 下面。不要忘记在创建新ListItemTextValue属性之间放置comma

protected void Page_Load(object sender, EventArgs e)
{
    if(!this.IsPostBack)
    {
        this.ColumnsList.Items.Add(new ListItem { Text= "Text1",  Value = "value1" });
        this.ColumnsList.Items.Add(new ListItem { Text = "Text2", Value = "value2" }); 
        this.ColumnsList.Items.Add(new ListItem { Text = "Text3", Value = "value3" });
        this.ColumnsList.Items.Add(new ListItem { Text = "Text4", Value = "value4" });
    }
}

第 2 步:在此之后,我创建了一个像您这样的按钮单击事件,但是 在那里只写了一行,以获得所选项目的计数 所 示。

protected void Button1_Click(object sender, EventArgs e)
{
    var count = this.ColumnsList.Items.Cast<ListItem>().Count(li => li.Selected);
}

注意:检查按钮点击事件。 this.ColumnsList.Items.Count将返回 ComboBoxList 中存在的项目计数,循环item.Selected将告诉您是否选择了该项目。但是,var selected将为您提供最后一项的状态,因为您正在覆盖每个项的值。

我最终将加载列表的代码从页面加载移动到 OnInit,如下所示,它起作用了。

protected override void OnInit(EventArgs e)
{
  this.ColumnsList.Items.Add(new ListItem { Text= "Text1",  Value = "value1"    });
  this.ColumnsList.Items.Add(new ListItem { Text= "Text2",  Value = "value2"  });

}

您的代码在我的解决方案中运行良好,但以下情况除外:

OnLoad 的实现没有覆盖参数 EventArgs。在我的解决方案中,需要在 OnLoad(( 中声明 EventArgs 参数。

protected override void OnLoad(EventArgs e)
{
   //base.OnLoad(e);
   if(!this.IsPostBack)
   {
       this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1"    });
       this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2"  });
   }
}

最后,逗号分隔符Text='text' Value='value'Text='text', Value='value'其他任何东西都可以正常工作。

编辑:这是我的按钮实现。

protected void Button_Click(object sender, EventArgs e)
{
    foreach (ListItem itemList in ColumnsList.Items)
    {
       if (itemList.Selected)
       {
          // selected
       }
    }
}

当您需要重新创建或重新创建动态控件时,您应该在 PreInit evet 上添加动态数据:

protected override void OnPreInit(EventArgs e)
{
    if(!this.IsPostBack)
    {
       this.ColumnsList.Items.Add(new ListItem { Text= "Text1", Value = "value1" });
       this.ColumnsList.Items.Add(new ListItem { Text= "Text2", Value = "value2" });
    }
}

有关页面生命周期的详细信息。