以编程方式检查 DataGridView 中的“CheckBoxCell”

本文关键字:CheckBoxCell 中的 DataGridView 编程 方式 检查 | 更新日期: 2023-09-27 18:36:50

目前,我的应用程序将从SQL数据库中加载用户可以选择的项目,然后他们可以使用复选框选择哪些项目适用于自己,然后可以保存这些选择并退出窗口;这工作正常。

我需要让我的应用程序获取用户以前保存的选择,然后在网格填充所有选项后选中相关框(因此显示他们的选择)。

到目前为止,我有以下代码:

    private void LoadUserSelection()
    {
        using (SqlConnection conn = new SqlConnection(sys.gvConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand(qry.SelectUsersSelections(), conn))
            {
                cmd.Parameters.AddWithValue("@SiteID", sys.gvSiteID);
                using (SqlDataAdapter da = new SqlDataAdapter())
                {
                    da.SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        conn.Open();
                        da.Fill(dt);
                        conn.Close();
                        foreach (DataGridViewRow row in grdQueues.Rows)
                        {
                            foreach (DataRow dr in dt.Rows)
                            {
                                if (dr["ID"].ToString() == row.Cells["ID"].Value.ToString())
                                {
                                    DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0];
                                    chk.Value = 1;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

希望这段代码有意义,它可以毫无问题地运行,但是即使代码实际上点击了将复选框标记为 true 的部分,它也没有。

我已经尝试了以下 chk 替代方案。值 = 1

  1. 中国.值 = 真值;
  2. 中国.已选择 = 真;
  3. 中国.值 = 真;

由于这是一个多用户数据库,我不能简单地根据预定列表存储布尔值,因此为什么首先获取和填充预定列表,然后我尝试操作他们以前的选择。

注意:我不太确定我在上面所做的甚至是解决这个问题的最佳方法,所以作为奖励,如果有人对我如何嵌套 using 语句或我如何处理这个问题有任何提示,将不胜感激。

以编程方式检查 DataGridView 中的“CheckBoxCell”

使用以下

两个选项之一,您的代码是正确的:

chk.Value = 1;    // Or...
chk.Value = true;

我可以复制此问题的唯一方法是在表单构造函数中手动添加DataGridViewCheckBoxColumn。否则,当该列也是原始DataTable的一部分时,您的代码在我的测试中始终有效。因此,假设该构造函数中的工作流是:

DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn();
// any col Properties manually set
dataGridView1.Columns.Add(col);
dataGridView1.AllowUserToAddRows = false;
dataGridView1.DataSource = LoadAllData();
LoadUserSelection();

您将看到LoadUserSelection按预期正确运行,但由于构造期间的绑定行为,您看不到结果。如果要在其他任何地方调用方法(如Button.Click事件),则可能会看到结果。如果您希望在加载数据后出现这种行为,以下内容对我有用:

this.dataGridView1.DataBindingComplete += DataGridView1_DataBindingComplete;
private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
  this.LoadUserSelection();
}