【问题标题】:DataTables and a Binding Source数据表和绑定源
【发布时间】:2009-08-26 14:05:17
【问题描述】:

我试图了解以下 2 个示例之间的区别。

首先,这是我目前在我的 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 应用程序。

【问题讨论】:

    标签: c# winforms data-binding bindingsource


    【解决方案1】:

    对于标准 DataSets/DataTables,BindingSource 仅在您的控件和实际数据源之间提供另一层间接。

    但是,大多数数据感知控件只能绑定到某些数据源(实现 IList、IListSource、IBindingList 或 IBindingListView 的那些)。如果您需要使用自定义对象作为数据源,则会出现问题,因为该对象需要实现这些接口中的至少一个。

    因此,您可以在业务对象中实现整个 IList 接口 - 或者您可以从 List 类继承您的对象并将其绑定到 BindingSource,然后将其绑定到您的控件。

    长与短:除非您确定您的数据源将始终是 DataTables 等,否则请使用 BindingSource。它确实会增加一点性能开销,但可以让您的生活更轻松。

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

    【讨论】:

    • 在业务对象上实现 IList 接口需要什么?另外,有状态的意思是需要知道数据是否已被修改?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 2011-03-12
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      相关资源
      最近更新 更多