我试图理解以下两个例子之间的区别。
首先,这就是我目前如何将数据分配给WinForm应用程序中的控件。
lkuCounty.Properties.DataSource = Person.CountyList();
lkuCounty.Properties.PopulateColumns();
lkuCounty.Properties.DisplayMember = "CountyName";
lkuCounty.Properties.ValueMember = "CountyID";
lkuCounty.Properties.Columns[0].Visible = false;
lkuCounty.Properties.Columns[2].Visible = false;
lkuCounty.Properties.Columns[3].Visible = false;
这似乎有效但我会承认,如果稍微偏离,我可能缺乏通过查看代码来体验的经验。另外值得注意的是,Person.CountyList()
实际上会返回DataTable
:\
现在我发现all of the examples似乎在说我应该这样做。
memberBindingSource.DataSource = Person.CountyList();
lkuCounty.Properties.DataSource = memberBindingSource;
lkuCounty.Properties.PopulateColumns();
lkuCounty.Properties.DisplayMember = "CountyName";
lkuCounty.Properties.ValueMember = "CountyID";
lkuCounty.Properties.Columns[0].Visible = false;
lkuCounty.Properties.Columns[2].Visible = false;
lkuCounty.Properties.Columns[3].Visible = false;
使用BindingSource有好处吗?以其他方式做这件事是否有负面影响?
对于上下文,这是使用SQL 2005的C#中的WinForm CRUD应用程序。
答案 0 :(得分:2)
对于标准DataSet / DataTables,BindingSource仅在控件和实际数据源之间提供另一层间接。
但是,大多数数据感知控件只能绑定到某些数据源(实现IList,IListSource,IBindingList或IBindingListView的数据源)。如果您需要将自定义对象用作数据源,则会出现问题,因为所述对象需要至少实现其中一个接口。
因此,您可以在业务对象中实现整个IList接口 - 或者您可以从List类继承您的对象并将其绑定到BindingSource,然后绑定到您的Control。
长与短:除非您确定数据源始终是DataTables等,否则请使用BindingSource。它确实增加了一些性能开销,但它可以让你的生活更轻松。
BindingSource中还内置了一些非常好的状态管理功能,如果您的应用程序是有状态的,它将非常方便。而不是你编写自定义状态处理代码,只需让BindingSource为你处理事情!
答案 1 :(得分:1)
您可以直接绑定到任何对象,如第一个示例中所示。但是,该对象需要实现许多数据绑定接口,以便智能地响应控件触发的事件。
例如,将Person列表绑定到DataGridView。现在,单击列标题以对列进行排序。它不起作用,因为List没有实现所需的接口。使用DataTable尝试相同的操作。列排序神奇地起作用。这是因为DataTable实现了数据绑定所需的所有接口。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
private void Form1_Load(object sender, EventArgs e)
{
//does not sort...
dataGridView1.DataSource = new List<Person>
{
new Person{ Age=11, Name="Jimmy" },
new Person{ Age=12, Name="Suzie" }
};
}
您可以编写自己的类来实现数据绑定接口。这是很多工作。这是一本关于这个主题的好书:
Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET