【问题标题】:Looping through checkbox in GridView to check if checkbox's checked循环遍历 GridView 中的复选框以检查复选框是否被选中
【发布时间】:2014-03-02 22:49:51
【问题描述】:

我有一个 gridview ,在 gridview 的一列中我有 2 个具有不同 ID 的复选框 所以我在单击按钮(更新按钮)后执行 foreach 循环以循环行并检查是否选中了该特定行的复选框,然后我想在单击按钮后一起更新所有行

我在 Page_Load() 中填充了 gridview,foreach 循环根据行数进入正确的循环数,但它不会进入我的 If 语句以检查复选框是否被选中

这是我的代码:

    protected void btnUpdate_Click(object sender, EventArgs e)
{
    int count = 0;
    foreach (GridViewRow row in GridView1.Rows)
    {
        count++;
        if (((CheckBox)row.FindControl("showBbtn")).Checked & ((CheckBox)row.FindControl("showCbtn")).Checked) // if 2 buttons are checked show error popout 
        {
            Response.Write(@"<script language='javascript'>alert('You can only select Yes or No')</script>");
        }
        else
        {
            if (((CheckBox)row.FindControl("showCbtn")).Checked) // Won't enter
            {
                //Do something here.
            }
            if (((CheckBox)row.FindControl("showBbtn")).Checked) // Won't enter
            {
                // Do something here.
            }

        }


    }

    Response.Write(count);
}

这就是我填充网格视图的方式:

 protected void Page_Load(object sender, EventArgs e)
{
    BindQuestion(); // Foreach loop count is according to the number of rows
    if (!Page.IsPostBack)
    {
       // BindQuestion(); // Can enter the if loop but the foreach loop count is only 1.
    }
}

我的aspx:

 <asp:TemplateField HeaderText="Display">
            <ItemTemplate>
                <asp:CheckBox ID="showCbtn" runat="server" Text = "Yes"  />
                <br />
                <asp:CheckBox ID="showBbtn" runat="server" Text = "No"  />
            </ItemTemplate>
        </asp:TemplateField>

【问题讨论】:

  • 我认为你应该只使用一个复选框。如果选中则更新行,否则不更新。
  • 我使用了 2 个复选框,因为我想让他们选择 Yes 或 No,然后我会将 Yes 或 No 更新到该特定记录的数据库中,现在的问题是,它不会输入 if声明,我想更新整个gridview
  • 如果您希望最终用户显示是和否选项,并且用户应该能够选择其中任何一个,那么您可以使用单选按钮。
  • 问题是每次只更新一行,而不是点击更新按钮后每一行都更新
  • 表示如果选中任何复选框,则基于该选中值您需要更新整个 GridView 记录?

标签: c# asp.net gridview checkbox foreach


【解决方案1】:

你的 If 条件有问题。你给的&符号不正确,应该是两个&&符号。替换

if (((CheckBox)row.FindControl("showBbtn")).Checked & ((CheckBox)row.FindControl("showCbtn")).Checked)  

if (((CheckBox)row.FindControl("showBbtn")).Checked && ((CheckBox)row.FindControl("showCbtn")).Checked) 

并在 ispostback 中添加 BindQuestion()。

【讨论】:

  • 我试过了,不影响结果,还是一样如果我将它放在 ispostback 之外,则不要在 else {} 中进入 2 IF 循环
  • 如果我放入 ispostback ,它将进入 IF 循环但只会运行一次,这意味着我一次只能更新 1 行,而不是在单击更新按钮后更新每一行
  • 嗨@Raghubar 我认为他的问题的解决方案是使用 XML ,我们可以在一个实例中发送所有更新的值。你说什么?
  • 是的,如果使用 XML,那么对于 All 更新它需要连接数据库一次。
  • @user2601570 你想做什么,你的实际问题是什么?
【解决方案2】:

这可能对你有帮助

 foreach (GridViewRow gr in grdCreateDues.Rows)
            {
                CheckBox chkC = gr.FindControl("showCbtn") as CheckBox; 
                CheckBox chkB = gr.FindControl("showBbtn") as CheckBox; 

                GridViewRow Row = ((GridViewRow)chk.Parent.Parent);

                if (chkC.Checked)
                {
                    // update tblGridtable set xzy = @xyz  
                }
                else if (chk.B.Checked)
                {
                     // update tblGridtable set abc = @abc     
                }

            }

【讨论】:

    【解决方案3】:

    这个方法也行

    var checkBox = (CheckBox)item.FindControl("ckbActive");
    

    【讨论】:

    • 避免纯代码答案。考虑提供更详细的解决方案说明。
    【解决方案4】:

    试试这个:-

    CheckBox chbx = GridView1.HeaderRow.FindControl("CheckBox1") as CheckBox;
    
    if (chbx != null && chbx.Checked)
    {
    Condition
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2015-12-28
      • 2021-07-16
      相关资源
      最近更新 更多