【问题标题】:Progmatically Checking "CheckBoxCell" in DataGridView以编程方式检查 DataGridView 中的“复选框单元格”
【发布时间】:2016-02-29 21:17:16
【问题描述】:

目前我的应用程序将从 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.Value = 1

尝试了以下替代方法
  1. chk.Value = TrueValue;
  2. chk.Selected = true;
  3. chk.Value = true;

由于这是一个多用户数据库,我不能简单地将布尔值存储在预先确定的列表中,因此为什么要先获取和填充预先确定的列表,然后我会尝试执行他们之前的选择。

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

【问题讨论】:

    标签: c# sql datagridview


    【解决方案1】:

    使用以下两个选项之一,您的代码是正确的:

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

    【讨论】:

    • 这很有效,谢谢!我忘了提到复选框是以编程方式添加的,所以感谢您的测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2012-10-01
    • 2010-11-02
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多