Progmatically Checking" CheckBoxCell"在DataGridView中

时间:2016-02-29 21:17:17

标签: c# sql datagridview

目前我的应用程序将从用户可以选择的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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

希望这段代码有意义,它可以毫无问题地运行,但是即使代码确实按照部分标记复选框为真,但事实并非如此。

我为 chk.Value = 1

尝试了以下替代方案
  1. chk.Value = TrueValue;
  2. chk.Selected = true;
  3. chk.Value = true;
  4. 由于这是一个多用户数据库,我不能简单地将布尔值存储在预先确定的列表中,因此为什么首先获取并填充预定列表,然后我尝试执行他们之前的操作选择。

    注意 :我不太清楚我上面做的事情是解决这个问题的最好办法,所以作为奖励,如果有人对我如何嵌套使用声明或我如何接近这一点有任何提示,我们将不胜感激。

1 个答案:

答案 0 :(得分: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();
}