我想对复选框进行编程,以便在选择行时,程序将读取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;
}
}
}
但现在我无法弄清楚如何反转过程,即当我取消选中一个时,所有具有相同的第一列值必须取消选中,而只是重新检查,因为该值仍在数组中。我对完全不同的方法持开放态度。
非常感谢, 尼古拉斯
答案 0 :(得分:0)
我不清楚你的问题,也许你正在寻找这个?
在检查ChkBox循环中使用此代码而不是旧代码。
MariaDB []> select id from mytab;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
+----+
15 rows in set (0.00 sec)
MariaDB []> SELECT id
-> FROM mytab
-> ORDER BY IF(id=18,155,id*10);
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 18 |
| 16 |
| 17 |
| 19 |
+----+
15 rows in set (0.00 sec)
MariaDB []>
使用ChkBox.Checked = !ChkBox.Checked ,它会在复选框中反转值。 如果这是真的,它将变得虚假。如果它是假的,它将成为现实。
答案 1 :(得分:0)
请给出另一个例子,不确定你是如何在你的代码中实现的,所以这里就是......
例如,您的gridview如下所示:
<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的示例数据,用于演示基于所选复选框属性和列[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”的行应自动设置为所选复选框的属性。
如果我误解了你的要求,请告诉我。你可以申请你的代码并让我知道它是否有效:-)欢呼。