首页 > 解决方案 > DataGridView 中的 CheckBox 值始终为 true

问题描述

我有一个 WinForm 应用程序,它具有 DataGridView,其中一列带有 CheckBox。用复选框选择几行后,我需要迭代行并检查 CheckBox 是否被勾选。

我已经尝试过 for 和 foreach 循环,但每次 bx 的值都是真的!有趣的是,我有一个按钮可以选择所有按钮,另一个按钮使用代码清除所有按钮,而且它可以工作!

我创建 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。

标签: c#

解决方案


您需要找到您的控件并将其转换为复选框对象并查看它是否被选中。该Checked属性是复选框存储是否选中的真/假值的地方。现在你只是在检查一个单元格的数据,看看它是否有任何值,并且每次都返回 true。我在下面执行的方式是您将如何使用 ASP.NET Webforms GridView 对象执行此操作。我认为这与 Windows 窗体的想法基本相同,只是 DataGridView 可能具有与FindControl您在 ASP.NET Webforms 中用于 GridView 的方法不同的“查找控件”方法。但我敢打赌它可能是一样的。

我出去玩了,不能用 Windows 窗体测试这个确切的功能,但是你需要做什么来使你的逻辑工作背后的想法是完全相同的。

将您的条件更改为以下内容:

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());
            }
        }

推荐阅读