【问题标题】:Can't mark checkbox as true in dataGridView无法在 dataGridView 中将复选框标记为 true
【发布时间】: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


【解决方案1】:

如果您在初始化组件和加载方法中的 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;
            }
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多