目前我的应用程序将从用户可以选择的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
尝试了以下替代方案由于这是一个多用户数据库,我不能简单地将布尔值存储在预先确定的列表中,因此为什么首先获取并填充预定列表,然后我尝试执行他们之前的操作选择。
注意 :我不太清楚我上面做的事情是解决这个问题的最好办法,所以作为奖励,如果有人对我如何嵌套使用声明或我如何接近这一点有任何提示,我们将不胜感激。
答案 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();
}