gpt4 book ai didi

.net - 如何让一个用户组件成为WinForms中数据绑定(bind)的数据源?

转载 作者:行者123 更新时间:2023-12-04 05:57:24 26 4
gpt4 key购买 nike

我已经创建了一个组件来从网络服务中获取数据。 Web 服务返回一个 ADO.NET 数据集。

我希望此组件成为与其他控件绑定(bind)的数据源。要获取的数据将是数据集。

因此,我向组件添加了一个属性 DataSet。

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

我为组件实现了 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; }
}

...
}

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

...

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

...

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

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

我什至尝试在组件的构造函数中创建一个数据集,而不是替换 DataSet 属性中的数据集,我只是这样做

_dataSet.Reset ();
_dataSet.Merge (value);

还是没有效果。

我是否需要调用某个事件或方法来让数据集传达它已更新?

我在这里错过了什么?

最佳答案

是的,有您需要的事件! DataGridView 通过根据底层 DataSource 的 ListChanged 事件(您可以通过实现 IBindingList 引发)自动更新其内容来做出响应。 IList 不支持此事件,如果没有它,DataGridView 将不会显示新填充的数据,除非您在每次更改时将 DataGridView 的 DataSource 属性重新分配给您的底层组件,而您不想这样做如果您经常进行更改(这很昂贵)

我不得不自己在这里吸取这个惨痛的教训: Updating 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;

关于.net - 如何让一个用户组件成为WinForms中数据绑定(bind)的数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8976444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com