【问题标题】:How to force datagridview to reorder rows after change to datasource更改为数据源后如何强制datagridview重新排序行
【发布时间】:2015-09-15 02:03:31
【问题描述】:

我有一个List<MyClass>,它是BindingSource 的数据源。 BindingSource 又是我的datagridview 的数据源。

当我更改基础列表中的值并调用 datagridview.Refresh() 时,值的更改会反映出来。

但是,当我对基础列表进行排序时,更改不会反映在我的 datagridview 中。我希望/希望datagridview 中的行按照我的基础列表的顺序排列。

我尝试过BindingSource.RestetBindings(),但它不起作用,并且还有其他我不喜欢的含义。

我不认为我应该对 DGV 中的实际行进行排序,但我可能错了吗?对数据源进行排序然后还要对 DGV 进行排序似乎很愚蠢。

【问题讨论】:

  • 它很笨拙,但我在 WPF ListView 控件中遇到了同样的问题。解决方案是将 ItemsSource 设置为 null,然后重新分配您的 DataSource。不优雅,但很有效。

标签: c# winforms data-binding datagridview


【解决方案1】:

似乎工作正常:

public class Person : IComparable<Person> {
    public int Id { get; set; }
    public String Name { get; set; }

    public int CompareTo(Person other) {
        return Name.CompareTo(other.Name);
    }
}

DataGridView dgv = new DataGridView();
List<Person> pList = new List<Person>();
BindingSource pSource = new BindingSource();
public MyForm() {
    pList.Add(new Person { Id = 1, Name = "Bob" });
    pList.Add(new Person { Id = 2, Name = "Alan" });
    pSource.DataSource = pList;
    dgv.DataSource = pSource;

    FlowLayoutPanel p = new FlowLayoutPanel { Dock = DockStyle.Fill };
    p.Controls.Add(btn);
    p.Controls.Add(dgv);
    Controls.Add(p);
    btn.Click += btn_Click;
}

void btn_Click(object sender, EventArgs e) {
    pList.Sort();
    dgv.Refresh();
}

【讨论】:

  • 我在我的应用程序中得到了这个:DataGridView control cannot be sorted if it is bound to an IBindingList that does not support sorting.。确实,我还没有为我的底层类定义排序方法。
  • 我可以使用 lambda 表达式对我的列表进行排序,但是虽然列表被重新排序(我输出到文本框),但它对 DGV 没有影响,即使在调用 DGV.Refresh() 之后也是如此.
  • 我不完全在那里,但在我的数据源上使用Sort 似乎有效。我不明白为什么 Sort 有效,但 OrderBy 无效 - 是的,我正在覆盖原始列表(如:list = list.OrderBy(....)
  • OrderBy 创建一个新的Enumerable 对象,而Sort 已就地完成。如果您想使用OrderBy,则必须从原始列表中删除所有项目,然后以新顺序重新添加项目。
  • 实际上,正如您所说,list = list.OrderBy(...) 使您认为更新局部变量会更新 DataSource 属性。如果您认为某些东西应该起作用,请发布一个展示该行为的完整代码的小示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2017-05-27
  • 2012-04-15
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多