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:\

现在我发现的所有例子似乎都在说我应该这样做。

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 应用程序。

4

2 回答 2

2

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

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

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

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

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

于 2009-08-26T14:25:43.020 回答
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" }
        };
    }

您可以编写自己的类来实现数据绑定接口。工作量很大。这是一本关于这个主题的好书:

使用 Windows Forms 2.0 进行数据绑定:使用 .NET 编写智能客户端数据应用程序

于 2009-08-26T20:15:31.820 回答