繁体   English   中英

通过更改更新数据绑定的GridView

[英]Updating a Databound GridView with changes

我在数据绑定到对象列表的窗体上有一个DataGridView。 我有几列,包括一个复选框列。 要求是在给定时间集合中只有一个项目的数据绑定布尔属性可以设置为true。 数据对象名为“间隔”,相关属性为“程序”:

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无法正确更新。 它将保留先前的复选框处于选中状态,并在跳出单元格或将鼠标悬停在另一个复选框之后,然后将更新该特定复选框。

如何获取数据网格视图以准确显示对象的状态。 我相信您,DataGridView! 你骗了我。 我...我再也不会相信你再说了什么。

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

尝试这个

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;
        }
    }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM