我有一个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
,但这还是行不通的。如何将复选框标记为true?
这不仅是带有标记的复选框的外观方面的问题,因为在检索这些行之后,所有这些行都是假的,因此问题在于此单元格的值及其图形表示形式。
更新1: 我不需要更改EF中的实体,只需更改dataGridView中的单元格值即可。
答案 0 :(得分:2)
如果您在初始化组件之后立即执行数据源部分,并在load方法中执行for部分,则该方法有效
public YourForm()
{
InitializeComponent();
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);
}
表单加载方法中的代码
private void YourForm_Load(object sender, EventArgs e)
{
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;
}
}
}