如何在asp.net的面板中选中是否选中所有复选框?

时间:2012-03-28 12:25:07

标签: asp.net

我动态地将复选框添加到面板。

for (int intControlIndex = 0; intControlIndex < dsTagsList.Tables[0].Rows.Count; intControlIndex++)
{
   chkList1 = new CheckBox();
   chkList1.Text = dsTagsList.Tables[0].Rows[intControlIndex][0].ToString();
   chkList1.ID = "Chk" + intControlIndex;
   chkList1.Font.Name = "Verdana";
   chkList1.Height = 20;
   chkList1.ForeColor = System.Drawing.Color.Black;
   chkList1.Font.Size = 10;
   panelTags.Controls.Add(chkList1);
   panelTags.Controls.Add(new LiteralControl("<br>"));
}

如何查看选中的复选框? 请告诉我....

3 个答案:

答案 0 :(得分:3)

我会遍历面板中的所有控件,检查控件是否为复选框,如果是,则对其进行操作。

foreach(Control child in panelTags.Controls)
{
    if(!(child is CheckBox))
        continue;

    if((child as CheckBox).Checked)
    {
        // Do 'is checked' something
    }
    else
    {
        // Do 'is not checked' something
    }
}

或者更好的是,使用按类型过滤可枚举的LINQ OfType

foreach(CheckBox child in panelTags.Controls.OfType<CheckBox>())
{
    if(child.Checked)
    {
        // Do 'is checked' something
    }
    else
    {
        // Do 'is not checked' something
    }
}

LINQ语句让我们进一步查询列表 如果您只想对选中的复选框执行操作。

// Add to Usings
using System.Linq;

foreach(CheckBox child in panelTags.Controls
                              .OfType<CheckBox>()
                              .Where(chk => chk.Checked))
{
    // Do 'is checked' something
}

我能想到的其他一些事情可能会导致问题:

  1. foreach之前是否正在调用Page_Load?由于您可能会在回发中运行此功能,因此Page_Loadthe control properties are loaded with information recovered from view state and control state时。

  2. 是否在if(!IsPostBack)内创建了复选框,以防止添加多个控件?

  3. 在添加复选框之前,您是否在调用panelTags.Controls.Clear();,这将删除从页面返回的所有数据&gt;

答案 1 :(得分:0)

您可以尝试这样的事情:

void ReadCheckBoxControls(Control parent)
    {
        foreach (Control child in parent.Controls)
        {
            if (child.GetType().ToString().Equals("System.Web.UI.WebControls.CheckBox") && child.ID.IndexOf("Chk") == 0)
            {
                CheckBox CB = (CheckBox)child;
                if (CB.Checked == true) { 
                 // Your code here
                }
                else {
                 // Your code here
                }
            }
            if (child.Controls.Count > 0)
            {
                ReadCheckBoxControls(child);
            }
        }
    }

您可以这样调用此方法:

ReadCheckBoxControls(this.panelTags);

我希望这可以帮助你,祝你好运。

答案 2 :(得分:0)

实际上你添加的控件动态失去了存在,所以你必须重新定义 他们......在page_load的页面pre_int

比你能做到这一点..

 for (int intControlIndex = 0; intControlIndex < dsTagsList.Tables[0].Rows.Count; intControlIndex++)
    {
      CheckBox chkList1 = (CheckBox)panelTags.findcontrol("Chk" + intControlIndex);

      if(chkList1 != null)
        {
           if(chkList1.checked)
             {
               do something..
             }
        }
    }

样本见此..

 protected void Page_Load(object sender, EventArgs e)
    {        
            AddCheckBoxes();
    }

    public void AddCheckBoxes()
    {
        for (int i = 0; i < 5; i++)
        {
            CheckBox chkbox = new CheckBox();
            chkbox.ID = "chk" + i.ToString();
            chkbox.Text = "check box " + i.ToString();               
            pan.Controls.Add(chkbox);
        }
    }
    protected void btn_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 5; i++)
        {
            CheckBox chkbox = (CheckBox)pan.FindControl("chk" + i.ToString());            
            if(chkbox.Checked)
                lblselected.Text += "check box " + i.ToString() +" ; ";

        }
    }

和Html是

 <div>
    <asp:Panel ID="pan" runat="server">

    </asp:Panel>

    <asp:Button ID="btn" runat="server" Text="Show selected" onclick="btn_Click" />

    Selected : <asp:Label ID="lblselected" runat="server"></asp:Label>
    </div>