2009-08-26 134 views
1

我想了解以下两个示例之间的区别。数据表和绑定源

首先,这是我目前如何将数据分配给我的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

回答

2

对于标准数据集/数据表在C#一个WinForm CRUD应用程序,BindingSource的仅仅提供您的控制和实际的数据源之间的间接的另一层。然而,大多数数据感知控件只能绑定到某些数据源(那些实现IList,IListSource,IBindingList或IBindingListView)的数据源。如果您需要使用自定义对象作为数据源,则会出现问题,因为所述对象需要至少实现其中一个接口。

因此,您可以在业务对象中实现整个IList接口 - 也可以从List类继承对象,并将其绑定到BindingSource,然后将其绑定到Control(s)。

长和短:除非您确定您的数据源将始终是DataTables之类,请使用BindingSource。它确实增加了轻微的性能开销,但它可以让你的生活变得更容易。

BindingSource还内置了一些非常好的状态管理功能,如果您的应用程序是有状态的,它非常方便。而不是编写自定义状态处理代码,只需让BindingSource为您处理事情!

+0

那么将会为业务对象上实现一个IList接口?此外,有状态的,你的意思是需要知道数据是否已被修改? – 2009-08-26 17:47:33

1

您可以直接绑定到任何对象,如第一个示例中所示。但是,该对象需要实现许多数据绑定接口,才能对控件触发的事件进行智能响应。

例如,将人员列表绑定到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