2009-08-26 6 views
1

Ich versuche, den Unterschied zwischen den folgenden 2 Beispielen zu verstehen.DataTables und eine Bindungsquelle

Erstens, das ist, wie ich derzeit Daten zu einem Steuerelement in meiner WinForm-App zuweisen.

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; 

Dies scheint obwohl ich zugeben werde zu arbeiten, wenn es etwas weg ist fehlt mir wohl die Erfahrung nur auf den Code, indem Sie zu erzählen. Außerdem gibt Person.CountyList() tatsächlich eine DataTable zurück: \

Jetzt wie all of the examples Ich finde scheinen zu sagen, dass ich dies tun sollte.

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; 

Gibt es einen Vorteil für die Verwendung der BindingSource? Gibt es ein negatives, es auf die andere Art zu tun?

Für Kontext, das ist ein SQL 2005

Antwort

2

Für Standard-Datasets/Tables mit WinForm CRUD app in C# ist, stellt die Binding lediglich eine weitere Ebene der Indirektion zwischen Kontrollen und der eigentlichen Datenquelle.

Die meisten datensensitiven Steuerelemente können jedoch nur an bestimmte Datenquellen (dh IList, IListSource, IBindingList oder IBindingListView) gebunden werden. Dies stellt ein Problem dar, wenn Sie ein benutzerdefiniertes Objekt als Datenquelle verwenden müssen, da das Objekt dann mindestens eine dieser Schnittstellen implementieren muss.

So können Sie entweder die gesamte IList-Schnittstelle in Ihrem Geschäftsobjekt implementieren - oder Sie können Ihr Objekt von der List-Klasse erben und an eine BindingSource binden, die Sie dann an Ihre Controls binden.

Die lange und die kurze: Wenn Sie nicht sicher sind, dass Ihre Datenquellen immer DataTables und dergleichen sein werden, verwenden Sie eine BindingSource. Es fügt einen leichten Leistungsaufwand hinzu, aber es kann Ihr Leben viel einfacher machen.

In der BindingSource gibt es auch einige sehr nützliche Funktionen für die Statusverwaltung, die sehr nützlich sind, wenn Ihre Anwendung stateful ist. Anstatt den benutzerdefinierten Statusbehandlungscode zu schreiben, lassen Sie einfach die BindingSource die Dinge für Sie erledigen!

+0

was würde es eine IList-Schnittstelle auf einem Business-Objekt zu implementieren, um? Willst du mit Stateful auch wissen, ob die Daten geändert wurden? –

1

Sie können direkt an jedes Objekt binden, wie im ersten Beispiel. Dieses Objekt muss jedoch viele der Datenbindungsschnittstellen implementieren, damit es intelligent auf die vom Steuerelement ausgelösten Ereignisse reagieren kann.

Binden Sie zum Beispiel eine Liste von Personen an ein DataGridView. Klicken Sie nun auf eine Spaltenüberschrift, um eine Spalte zu sortieren. Es funktioniert nicht, da List die erforderliche Schnittstelle nicht implementiert. Versuchen Sie dasselbe mit einer DataTable. Die Spaltensortierung funktioniert auf magische Weise. Das liegt daran, dass DataTable alle erforderlichen Schnittstellen für die Datenbindung implementiert.

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" } 
     }; 
    } 

Sie können eigene Klassen schreiben, die die Datenbindungsschnittstellen implementieren. Es ist viel Arbeit. Hier ist ein großes Buch über das Thema:

Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET