【问题标题】:Programming gridview checkboxes to auto check relevant rows编程 gridview 复选框以自动检查相关行
【发布时间】:2016-08-22 22:29:19
【问题描述】:

我想对复选框进行编程,以便如果选择了一行,程序将读取 gridview 行的第一列中的值,并自动检查在其第一列中也具有该值的所有行。我能够使用一个数组来存储值并遍历每一行,检查这个值是否匹配。如果匹配,则选中该复选框。这行得通,但这是一个非常有限的解决方案。当我尝试反转操作时,它只是自动重新检查该值,因为该值仍在数组中,我不知道如何区分检查或取消检查操作。它完全基于变更事件。

        int count = 0;
        foreach (GridViewRow gvrow in GridView1.Rows)
        {
            CheckBox chk = (CheckBox)gvrow.FindControl("chkRow");

            if (chk.Checked)
            {
                count++;
            }
        }
        string [] dnum = new string[count];
        int counter = 0;

        foreach (GridViewRow row in GridView1.Rows)
        {
            CheckBox myCheckBox = row.FindControl("chkRow") as CheckBox;
            if (myCheckBox.Checked)
            {
                if (counter > 0)
                {
                    int number = counter - 1;
                    if (row.Cells[1].Text != dnum[number])
                    {
                        dnum[counter] = row.Cells[1].Text;
                        counter++;
                    }
                }
                else
                {
                    dnum[counter] = row.Cells[1].Text;
                    counter++;
                }
            }
        }
        return dnum;
    }

数组 dnum 应该返回检查行的第一列值。有了这个,我可以遍历每一行并检查是否需要检查任何复选框。

 foreach (GridViewRow gvrow in GridView1.Rows)
 {
     CheckBox ChkBox = (CheckBox)gvrow.FindControl("chkRow");
     if (ChkBox.Checked == true)
     {
        foreach (string s in first)
        {
           if (gvrow.Cells[1].Text == s)
           {
              ChkBox.Checked = true;
           }
        }
     }

但是现在我无法弄清楚如何反转该过程,即当我取消选中一个时,所有具有相同第一列值的都必须取消选中,而不是重新检查,因为该值仍在数组中。我对完全不同的方法持开放态度。

非常感谢, 尼古拉斯

【问题讨论】:

    标签: c# asp.net gridview checkbox


    【解决方案1】:

    我不清楚你的问题,也许你正在寻找这个?

    在检查 ChkBox 循环中使用此代码而不是旧代码。

    if (gvrow.Cells[1].Text == s)
           {
              ChkBox.Checked = !ChkBox.Checked;
           }
    

    使用 ChkBox.Checked = !ChkBox.Checked,它会反转复选框中的值。 如果是真的,它就会变成假的。如果是假的,就会变成真的。

    【讨论】:

      【解决方案2】:

      将只举另一个例子,不确定你是如何在你的代码中实现的,所以在这里......

      例如,您的网格视图如下:

          <asp:GridView ID="GridView1" runat="server">
              <Columns>
                  <asp:TemplateField>
                      <ItemTemplate>
                          <asp:CheckBox ID="CheckBox1"
                              OnCheckedChanged="CheckBox1_Click"
                              AutoPostBack="True" runat="server" />
                      </ItemTemplate>
                  </asp:TemplateField>
              </Columns>
          </asp:GridView>
      

      在你的代码后面.. 下面的 mockData 数据只是我们 gridview 的示例数据,用于演示基于选定的复选框属性和 column[1] 值对相同值的检查和取消检查。

          protected void Page_Load(object sender, EventArgs e)
          {
              if (!Page.IsPostBack)
              {
                  var mockData = new[] {"1", "1", "2", "1", "3", "2"};
                  GridView1.DataSource = mockData;
                  GridView1.DataBind();
              }
          }
      
          protected void CheckBox1_Click(object sender, EventArgs e)
          {
              var chkBox = (CheckBox) sender;
              var selectedRow = chkBox.Parent.Parent;
              var itemValue = ((GridViewRow)selectedRow).Cells[1].Text; 
      
              foreach (var chkItem in GridView1.Rows.Cast<GridViewRow>()
                  .Where(item => item.Cells[1].Text == itemValue)
                  .Select(item => item.Cells[0].FindControl("CheckBox1")).OfType<CheckBox>())
              {
                  chkItem.Checked = chkBox.Checked;
              }
          }
      }
      

      如果我点击一行中值为“1”的复选框,所有值为“1”的行都应自动设置为选中复选框的属性。

      如果我误解了您的要求,请告诉我。您可以申请您的代码并让我知道它是否有效 :-) 干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 2021-06-07
        • 2020-02-14
        • 1970-01-01
        • 2012-08-12
        • 2012-10-01
        • 2015-11-05
        相关资源
        最近更新 更多