如何让用户组件成为WinForms中数据绑定的数据源?

Sté*_*écy 2 .net data-binding components winforms

我创建了一个从Web服务获取数据的组件.Web服务返回ADO.NET数据集.

我希望这个组件成为与其他控件绑定的数据源.源数据将是数据集.

所以,我在组件中添加了一个属性DataSet.

private DataSet _dataSet;
public DataSet DataSet
{
    get { return _dataSet; }
    set
    {
        if (_dataSet == value)
            return;
        _dataSet = value;
        OnPropertyChanged (this, new PropertyChangedEventArgs ("DataSet"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我为组件实现了IListSource.

public partial class MyComponent : Component, INotifyPropertyChanged, IListSource
{
    ...

    IList IListSource.GetList()
    {
        return DataSet == null ? null : ((IListSource)DataSet).GetList();
    }

    bool IListSource.ContainsListCollection
    {
        get { return DataSet != null && ((IListSource)DataSet).ContainsListCollection; }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

在从Web服务接收数据的方法中,我执行以下操作:

...

DataSet = response.DataSet;    // Copy dataset from web service to the component.

...
Run Code Online (Sandbox Code Playgroud)

然后我用表单创建了一个新的WinForms项目.在这个表单上,我添加了我的组件和DataGridView.设置它们之间的绑定.

运行应用程序后,将调用Web服务并接收数据集.但是,UI不显示数据.

我甚至尝试在组件的构造函数中创建数据集,而不是替换DataSet属性中的数据集

_dataSet.Reset ();
_dataSet.Merge (value);
Run Code Online (Sandbox Code Playgroud)

仍然没有效果.

是否有我需要调用的事件或方法让数据集进行通信更新?

我在这里错过了什么?

Chr*_*low 7

是的,你需要一个活动!DataGridView通过自动更新其内容与基础DataSource的ListChanged事件(您可以通过实现IBindingList引发)来响应.IList不支持此事件,如果没有它,DataGridView将不会显示新填充的数据,除非您每次更改时将DataGridView的DataSource属性重新分配给您的底层组件,如果您经常更改则不希望这样做(这很贵).

我必须在这里学习这个痛苦的教训: 更新DGV IList

如果我在这里偏离基地,请告诉我,但这感觉就像你的问题所在.

编辑:这可能如何工作的一个例子 -

  private DataSet _dataSet;
  public DataSet DataSet
  {
     get { return _dataSet; }
     set
     {
        if (_dataSet == value)
           return;
        _dataSet = value;
        ListChanged(this, new ListChangedEventArgs(ListChangedType.Reset, 0));
     }
  }

  public event ListChangedEventHandler ListChanged;
Run Code Online (Sandbox Code Playgroud)