DataTables和绑定源

时间:2009-08-26 14:05:18

标签: c# winforms data-binding bindingsource

我试图理解以下两个例子之间的区别。

首先,这就是我目前如何将数据分配给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应用程序。

2 个答案:

答案 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