2009-08-10 16 views
1

Ich habe eine DataGridView, die DataSource mit Objekten verbunden ist. Alles funktioniert OK (ich kann diese Objekte bearbeiten und die Änderung bleibt bestehen), bis ich das Objekt auswählen möchte, das mit der Combobox verbunden ist (in der Datenbank ist es über einen Fremdschlüssel verbunden).Wählen Spalte aus anderen Tabelle/Objekt

Ich kann die Combobox füllen, so dass die richtigen Werte angezeigt werden (dh der Name des Benutzers). Dazu wähle ich die Datenquelle für diese bestimmte Spalte aus. Es erlaubt mir, die angezeigten Eigenschaften sowie den Wert zu wählen (aber ich kann den Wert nicht auf das GANZE gewählte Objekt einstellen). Wenn das Objekt gespeichert wird, tritt der Fehler jedoch auf. DataGridView versucht, den Wert des ausgewählten Objekts (Eigenschaft dieses "fremden Objekts") zu speichern, nicht jedoch das Objekt selbst.

Wie kann ich DataGridView dazu verleiten, das ausgewählte Objekt und nicht nur das seiner Eigenschaft zu speichern?

Antwort

1

Dies ist eines der häufigsten Probleme. Sie können dies nicht mit der ursprünglichen DataGridViewComboboxColumn tun. Ich habe vor einiger Zeit eine Lösung gefunden - Sie müssen sie unterklassifizieren. Hier ist der Code:

public class DataGridViewBusinessComboBoxColumn : DataGridViewComboBoxColumn 
    { 
     public DataGridViewBusinessComboBoxColumn() 
     { 
      CellTemplate = new DataGridViewBusinessComboBoxCell(); 
     } 
    } 

    public class DataGridViewBusinessComboBoxCell : DataGridViewComboBoxCell 
    { 
     private System.ComponentModel.PropertyDescriptor displayProp; 

     private CurrencyManager ListManager 
     { 
      get 
      { 
       BindingMemberInfo bmi = new BindingMemberInfo(base.DisplayMember); 
       if (DataGridView != null) 
       { 
        return (CurrencyManager) 
          DataGridView.BindingContext[DataSource, bmi.BindingPath]; 
       } 
       return null; 
      } 
     } 

     private System.ComponentModel.PropertyDescriptor DisplayProp 
     { 
      get 
      { 
       if (displayProp == null) 
       { 
        displayProp = ListManager.GetItemProperties().Find(DisplayMember, 
                     true); 
       } 
       return displayProp; 
      } 
     } 

     protected override object GetFormattedValue(object value, int rowIndex, 
                ref DataGridViewCellStyle cellStyle, 
                TypeConverter valueTypeConverter, 
                TypeConverter formattedValueTypeConverter, 
                DataGridViewDataErrorContexts 
                 context) 
     { 
      if (value == null || value == cellStyle.DataSourceNullValue) 
       return ""; 

      return base.GetFormattedValue(DisplayProp.GetValue(value), 
              rowIndex, ref cellStyle, valueTypeConverter, 
              formattedValueTypeConverter, context); 
     } 

     public override object ParseFormattedValue(object formattedValue, 
                DataGridViewCellStyle cellStyle, 
                TypeConverter formattedValueTypeConverter, 
                TypeConverter valueTypeConverter) 
     { 
      foreach (object item in ListManager.List) 
      { 
       if ((string) DisplayProp.GetValue(item) == (string) formattedValue) 
        return item; 
      } 

      return base.ParseFormattedValue(formattedValue, cellStyle, 
              formattedValueTypeConverter, valueTypeConverter); 
     } 
} 
Verwandte Themen