1

次の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

今、私が見つけたすべての例は、私がこれを行うべきだと言っているようです.

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 を実装するもの) にのみバインドできます。これは、カスタム オブジェクトをデータ ソースとして使用する必要がある場合に問題を引き起こします。これは、カスタム オブジェクトがこれらのインターフェイスの少なくとも 1 つを実装する必要があるためです。

したがって、ビジネス オブジェクトに IList インターフェイス全体を実装するか、List クラスからオブジェクトを継承して BindingSource にバインドし、それを Control にバインドすることができます。

長所と短所: データ ソースが常に DataTable などであることが確実でない限り、BindingSource を使用します。わずかなパフォーマンスのオーバーヘッドが追加されますが、作業が大幅に楽になります。

また、BindingSource には非常に優れた状態管理機能が組み込まれており、アプリケーションがステートフルな場合に非常に便利です。カスタムの状態処理コードを記述する代わりに、BindingSource に処理を任せてください。

于 2009-08-26T14:25:43.020 に答える
1

最初の例のように、任意のオブジェクトに直接バインドできます。ただし、そのオブジェクトは、コントロールによって起動されたイベントにインテリジェントに応答するために、多くのデータ バインディング インターフェイスを実装する必要があります。

たとえば、List of 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" }
        };
    }

データ バインディング インターフェイスを実装する独自のクラスを作成できます。大変な作業です。このテーマに関する素晴らしい本は次のとおりです。

Windows Forms 2.0 でのデータ バインディング: .NET でのスマート クライアント データ アプリケーションのプログラミング

于 2009-08-26T20:15:31.820 に答える