使用更改更新数据绑定GridView

时间:2014-07-19 01:37:12

标签: c# winforms checkbox datagridview inotifypropertychanged

我在表格上有一个DataGridView,它被数据绑定到一个对象列表。我有几个列,包括一个复选框列。要求是集合中只有一个项目可以在给定时间将数据绑定布尔属性设置为true。数据对象名为Interval,有问题的属性是Program:

public bool Program
{
    get { return _program; }
    set
    {
        if (value)
        {
            Parent.Intervals.Except(new[] { this }).ForEach(interval => interval.Program = false);
        }
        _program = value;
        OnPropertyChanged();
    }
 }

我的预期行为是单击数据绑定复选框会将Interval的一个实例的Program属性设置为true,这样做会将所有其他实例上的Program属性设置为false。确实会发生这种情况,但datagridview无法正确更新。它将保留以前的复选框,在选中单元格或鼠标悬停在另一个复选框后,它将更新该特定复选框。

如何获取datagrid视图以准确显示对象的状态。我信任你,DataGridView!你骗了我。我...我永远不会相信你再说一遍。

2 个答案:

答案 0 :(得分:0)

解决方案是使用BindingList。绑定到常规List或其他集合(不是特定于Binding的绑定)时,仅更新选定的行值。但是,BindingList具有额外的好处,即更新所有项目的属性,而不仅仅是所选行。请记住,如果您使用AddRange(来自List)之类的东西,您可能必须修改代码以在初始化时或通过循环添加项目,因为BindingList没有AddRange方法(尽管可以编写扩展方法) )。

答案 1 :(得分:0)

试试这个

private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if ((bool)dg.Rows[e.RowIndex].Cells[CheckBoxColumnIndex].Value)
    {
        var rows = (from DataGridViewRow row in Clients.Rows 
                    where row.Index != e.RowIndex
                    select row).ToArray(); 

        foreach(DataGridViewRow row in rows)
        {
             row.Cells[CheckBoxColumnIndex].Value = false;
        }
    }
 }