【发布时间】:2019-11-21 18:33:31
【问题描述】:
我有一个 dataGridView,其中填充了 EF 数据库中的数据:
efcontext.Users.Load();
dataGridView1.DataSource = ctx.Users.Local.ToBindingList();
然后我向它添加一列
DataGridViewCheckBoxColumn newCol = new DataGridViewCheckBoxColumn();
DataGridViewCheckBoxCell cell = new DataGridViewCheckBoxCell();
cell.IndeterminateValue = false;
cell.TrueValue = true;
cell.FalseValue = false;
newCol.CellTemplate = cell;
newCol.HeaderText = "Select";
newCol.Name = "selected";
newCol.Visible = true;
newCol.ValueType = typeof(bool);
dataGridView1.Columns.Add(newCol);
稍后在程序中,我想遍历每一行并将一些行标记为选中。 我用这段代码来做:
for (int i = 0; i < dataGridView1.RowCount; i++)
{
DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)dataGridView1.Rows[i].Cells["selected"];
if(something)
{
chk.Value = true;
}
else
{
chk.Value = false;
}
但这并没有改变任何东西。之后我尝试刷新 dataGridView,也没有使用true,而是使用了chk.TrueValue,但这也没有用。如何将复选框标记为真?
这不仅仅是标记复选框的视觉方面的问题,因为在检索到这些行后,所有这些行都是错误的,所以问题在于该单元格的值及其图形表示。
更新 1: 我不需要更改 EF 中的实体,只需要更改 dataGridView 中的单元格值。
【问题讨论】:
-
您添加的列是未绑定的列。您希望具体更改什么,复选框检查状态外观或实体中的属性?
-
@RezaAghaei 我希望复选框检查状态发生变化。因为我只需要获取选择了哪些行的值并将它们发送到其他地方。
-
虽然您不需要为
DataGridViewCheckBoxColumn设置单元格模板,但代码按预期工作并检查记录。您需要确保代码正在运行,并确保您使用的标准是正确的。 -
我试过这段代码。仅在将所有复选框添加到新列后执行 for 部分才对我有用。基本上,我在 windows 窗体的 InitializeComponent 方法之后执行了数据源部分。我已经将 for 部分放在了 load 方法中。但我不认为这是正确的做法。更好的解决方案是向您的类添加一个布尔值并仅使用数据源属性
-
@matteocracco 谢谢,这就是问题所在! dataGridView 绑定在 _Load 中,我已将检查循环从 _Load 移动到 _Shown,现在正在标记复选框。如果您想将其放入答案中,我将很乐意接受。
标签: c# winforms datagridview