【问题标题】:Updating a Databound GridView with changes使用更改更新数据绑定 GridView
【发布时间】:2014-07-19 01:37:11
【问题描述】:

我在数据绑定到对象列表的表单上有一个 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 没有正确更新。它将保留先前的复选框处于选中状态,并且在将单元格选中或将鼠标悬停在另一个复选框上之后,它将更新该特定复选框。

如何让数据网格视图准确地显示我的对象的状态。我信任你,DataGridView!你骗了我。我……我再也不能相信你说的任何话了。

【问题讨论】:

    标签: c# winforms checkbox datagridview inotifypropertychanged


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      试试这个

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

      【讨论】:

      • 看起来它也可以工作。就我而言,通常是 WPF 开发人员,我正在尽最大努力将 UI 的显式争吵保持在绝对最低限度。
      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多