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)
仍然没有效果.
是否有我需要调用的事件或方法让数据集进行通信更新?
我在这里错过了什么?
是的,你需要一个活动!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)