DataGridView中的CheckBox值始终为true

时间:2019-01-31 15:47:48

标签: c#

我有一个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。

2 个答案:

答案 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;
            }
        }