如何告诉Gridviews刷新行的数据绑定项?

时间:2015-03-10 09:51:28

标签: c# winforms telerik radgridview

我使用RadGridView显示项目。在双击时,用户进入详细视图,在那里他可以编辑内容然后返回(两个用户控件都显示为屏幕上的选项卡,因此同时存在)。

我使用工作方法更新网格视图中的已编辑列表,而不重新加载整个gridview:

 dataRow = (GridViewRowInfo)element.Data;
 Worker displayedWorker = (Worker)edataRow.DataBoundItem;
 Worker changedWorkerFromDataBase = GetWorkerFromDataBase(displayedWorker.WorkerNumber).FirstOrDefault();

 List<Worker> tableDataSource = (List<Worker>)MyGridView.DataSource;

 int indexInTableDataSource = tableDataSource.IndexOf(tableDataSource.Where(e => e.WorkerNumber == displayedWorker.WorkerNumber).First());

 tableDataSource[indexInTableDataSource] = changedWorkerFromDataBase;
 dataRow.InvalidateRow();

如上所述,此代码有效,但当我将IndexOf方法更改为:

 int indexInTableDataSource = tableDataSource.IndexOf(displayedWorker);

它不再像预期的那样工作。上面的代码只运行一次,一次保存存储在MyGridView.DataSource中的对象,而dataRow.DataBoundItem中存储的对象被视为不同,导致indexOf返回-1。

这种行为让我感到非常惊讶,特别是因为第一种方法没有问题,我认为该行的dataBound项只是指向GridView数据源内部项目的指针。

因此我的问题是:可以(在更新完成后)我告诉行更新/刷新它的数据绑定项,以便它再次等于gridview中的那个(也称为同一个对象)? / p>

2 个答案:

答案 0 :(得分:1)

首先关闭:如果启用了排序/分组,则数据源中的索引可能与radgridview中的索引不对应(请参阅Childrows vs Rows)。

我使用radgridview和detailview处理过类似的场景。

  • 要通知radgridview更改了属性值,您的Worker类需要实现INotifyPropertyChanged接口。 About INotifyPropertyChanged
  • 将数据源类型从List更改为BindingList,因为此列表包含更改列表时引发的事件。 About BindingList

现在您应该可以更改Worker课程的实例,并且应该立即在您的radgridview中选择更改。

答案 1 :(得分:0)

您的案例中的问题来自这样一个事实:对于网格的DataSource,您使用的是List,它不支持通知。如果你切换到BindingList你会很高兴。这是一个示例:

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        AddGrid();

        BindingList<Worker> lst = new BindingList<Worker>() { new Worker() { ID = 1, Name = "Adam" }, new Worker() { ID = 2, Name = "Eva" } };
        radGridView1.DataSource = lst;
    }

    class Worker
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

    private void radButton1_Click(object sender, EventArgs e)
    {
        Worker displayedWorker = (Worker)radGridView1.CurrentRow.DataBoundItem;
        BindingList<Worker> tableDataSource = (BindingList<Worker>)radGridView1.DataSource;
        int indexInTableDataSource = tableDataSource.IndexOf(displayedWorker);

        Worker changedWorkerFromDataBase = new Worker() { ID = 1, Name = "new name" };
        tableDataSource[indexInTableDataSource] = changedWorkerFromDataBase;
    }

有关List和BindingList之间差异的更多信息,请访问:https://stackoverflow.com/a/2244039/298871