2010-11-19 4 views
0

Ich habe das folgende Business-Objekt:C# Datagridview Mitglied der Liste <DataTable> innerhalb Objekt gebunden

public class MyObject 
{ 
    // Some public properties that are bound to text boxes, etc on the form 
    public string Customer { get; set; } 
    public int JobNumber { get; set; } 

    // Each DataTable in this list consists of a single column of doubles 
    // representing the error in a series of measurements (ex. -.0002, -.0003, .0002, etc) 
    public List<DataTable> MeasurementErrors {get; set; } 

    public MyObject 
    { 
    // Code in here creates the first DataTable with the first measurement (always zero) 
    // and adds it to the MeasurementErrors list 
    errors = new DataTable(); 
    errors.TableName = "MeasurementErrors"; 
    errors.Columns.Add("Error", typeof(double)); 
    errors.Rows.Add(0.0); 
    MeasurementErrors.Add(errors); // initial table added to the list 
    } 
} 

Ich habe keine Probleme bindenden Kunden und Jobnummer hatte und alle anderen grundlegenden Eigenschaften Boxen auf dem Anmeldeformular zum Text (VS hat eine BindingSource generiert und alle diese Steuerelemente für mich eingerichtet).

Woran ich Probleme habe, ist die Bindung eines DataTables in MeasurementErrors an ein DataGridView-Steuerelement. Die zu bindende Tabelle sollte von einem NumericUpDown-Steuerelement ausgewählt werden. Anschließend wird eine einfache Schaltfläche "Add" (Hinzufügen) zum Generieren einer neuen Tabelle und zum Hinzufügen zu MeasurementErrors (und ggf. einer Löschschaltfläche) verwendet. Wie richte ich die DataSource- und DataMember-Eigenschaften von DataGridView ein, um an MeasurementErrors [Wert von UpDownControl] zu binden?

Ich bin nicht auf die Verwendung von DataTables festgelegt, aber von dem, was ich gelesen habe, ist die bevorzugte Art der Bindung an ein DataGridView.

Antwort

0

Ein List<T> ist nicht bindbar. Verwenden Sie stattdessen eine IList<T> als Eigenschaft Rückgabetyp.

public IList<DataTable> MeasurementErrors { get; set; } 

Plus, es besser empfohlen, eine interne Liste für Listenmitglieder zu verwenden und eine schreibgeschützte Eigenschaft machen, je nach Ihren Bedürfnissen, immer.

public class MyObject { 
    private IList<DataTable> _measurementErrors; 

    public MyObject() { 
     _measurementErrors = new List<DataTable>(); 
    } 

    // This way you make sure to never have a null reference, and don't give 
    // out the control over your list to the user. 
    public IList<DataTable> MeasurementErrors { 
     get { 
      return _measurementErrors; 
     } 
    } 
} 

EDIT # 1

IList scheint nicht serialisierbar zu sein, so dass es einfach aus der resultierenden XML-Datei belassen. Gibt es eine einfache Möglichkeit, diesen IList serialisierbar zu machen?

Wenn die Instanz von IList<T> ein List<T> unter der Haube ist, dann empfehle ich Ihnen Ihre IList<T> zu einem List<T> aus Gründen der Serialisierung Guss zu geben. Und wenn das fehlschlägt, dann erstellen Sie eine neue Liste aus ihrem Inhalt.

var list = myObject1.MeasurementErrors as List<DataTable> ?? new List<DataTable>(myObject1.MeasurementErrors); 

Für weitere Informationen über ?? Operator finden Sie in MSDN: ?? Operator (C# Reference)

Kurz gesagt, es ist die Gleichwertigkeit des Schreibens:

var list = (myObject1.MeasurementErrors as List<DataTable>) == null ? 
      new List<DataTable>(myObject1.MeasurementErrors) : 
      myObject1.MeasurementErrors as List<DataTable>; 

Oder wenn Sie bevorzugen:

var list = myObject1.MeasurementErrors as List<DataTable>; 

if (list == null) 
    list = new List<DataTable>(myObject1.MeasurementErrors); 

Ich hoffe, diese Information ist nicht verwirrender als Hilfe G.

+0

Ich habe meine Liste der DataTables mit IList implementiert und es scheint zu funktionieren, aber dies hat dem Projekt eine weitere Falte hinzugefügt. Davor hatte ich nur eine einzige DataTable. Ich benutzte einen XmlSerializer, um MyObject in einer Datei zu speichern. IList scheint nicht serialisierbar zu sein, daher wird es einfach aus der resultierenden XML-Datei weggelassen. Gibt es eine einfache Möglichkeit, diesen IList serialisierbar zu machen? – JJS

+0

Re: EDIT # 1 - Danke, erstellen eine separate öffentliche Eigenschaft, die ich nicht beabsichtige, tatsächlich mit _MeasurementErrors typecasted zu einer Liste verwendet, um MyObject mit allen Daten zu serialisieren. Jetzt muss ich nur herausfinden, wie die IList-Eigenschaft an die DataGridView gebunden wird, während der Index angegeben wird. – JJS

+0

Sie müssen nicht wirklich eine andere Eigenschaft erstellen, sondern nur Ihre 'MeasurementErrors' eingeben, wenn Sie sie serialisieren. Ich habe nicht viel mit 'Serialisierung' gearbeitet, vielleicht verpasse ich hier etwas. Aber ich bekomme nicht den Sinn, die 'IList' an die 'DataGridView' zu binden, während ein Index angegeben wird. Können Sie nicht einfach 'DataGridView.DataSource = IList '? –