我有一个WinForm应用程序,该应用程序具有带有CheckBox的一列的DataGridView。 用复选框选择几行后,我需要迭代行并检查CheckBox是否被勾选。
我已经尝试过for和foreach循环,但是每次bx的值都是true时! 有趣的是,我有一个可以选择全部的按钮,另一个可以使用代码清除所有按钮,并且可以正常工作!
我用于创建DataGridView的代码:
ComputerSelection computerSelection = new ComputerSelection();
DataGridViewCheckBoxColumn checkBox = new DataGridViewCheckBoxColumn();
checkBox.ValueType = typeof(bool);
checkBox.Name = "CheckBox";
checkBox.HeaderText = "Select";
computerSelection.compGridView.Columns.Add(checkBox);
computerSelection.compGridView.Columns.Add("Name", "Name");
computerSelection.compGridView.Columns.Add("AgentVersion", "Agent Version");
computerSelection.compGridView.Columns.Add("Status", "Status");
computerSelection.compGridView.Columns.Add("Domain", "Domain");
用于迭代的代码(我搜索的大多数帖子都将该解决方案共享为正确的解决方案):
foreach (DataGridViewRow row in computerSelection.compGridView.Rows)
{
if ((bool)row.Cells["CheckBox"].Value)
{
computerSelection.ComputersList.Add(row.Cells[1].Value.ToString());
}
}
即使未选中此复选框,此代码也始终返回TRUE。我在StackOverFlow上搜索了很多帖子,甚至尝试使用as作为DataGridViewCheckBoxCell都没有成功。
选择所有按钮代码(使用相同的机制:():
private void SelectAllButton_Click(object sender, EventArgs e)
{
for (int i = 0; i < compGridView.Rows.Count; i++)
{
compGridView.Rows[i].Cells[0].Value = true;
}
}
我需要在每次迭代之后,“ row.Cells [1] .Value.ToString()”代码将返回false或true,但并不总是true。
答案 0 :(得分:1)
您需要找到控件并将其强制转换为复选框对象,然后查看是否已选中。 Checked
属性是复选框用于存储是否选中true / false值的地方。现在,您只是在检查一个单元格是否有数据,看它是否具有任何值,并且每次都返回true。我下面的操作方式是如何使用ASP.NET Webforms GridView对象。我认为这与Windows窗体在很大程度上是相同的,只是DataGridView可能具有不同于“查找控件”的方法,而不是您在ASP.NET Webforms中为GridView使用的FindControl
方法。但是我敢打赌,可能是一样的。
我经常出差,并且无法使用Windows Forms测试此确切功能,但是,使逻辑工作所需要做的工作却完全相同。
将您的病情更改为以下内容:
foreach (DataGridViewRow row in computerSelection.compGridView.Rows)
{
// Don't cast as bool. Convert to Checkbox object and see if it is checked.
if (((CheckBox)row.FindControl("CheckBox")).Checked) // row.FindControl might be different but might be the same for Winforms.
{
computerSelection.ComputersList.Add(row.Cells[1].Value.ToString());
}
}
答案 1 :(得分:0)
我找到了方法! 使用CellContentClick事件,然后使用EditedFormattedValue属性,这次的布尔值是REAL。
private void compGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
{
if ((bool)compGridView.Rows[e.RowIndex].Cells[0].EditedFormattedValue)
{
ComputersList.Add(compGridView.Rows[e.RowIndex].Cells[1].Value.ToString());
}
else
{
ComputersList.Remove(compGridView.Rows[e.RowIndex].Cells[1].Value.ToString());
}
}
}
谢谢
编辑: 弄清楚为什么我首先遇到这个问题,这甚至有点可笑。我有一个事件,当关闭表单时,每个复选框的值都变为TRUE!
private void ComputerSelection_FormClosed(object sender, FormClosedEventArgs e)
{
for(int i = 0; i < compGridView.Rows.Count; i++)
{
compGridView.Rows[i].Cells[0].Value = true;
}
}