2009-08-10 4 views
1

J'ai un DataGridView auquel DataSource est connecté aux objets. Tout fonctionne bien (je peux éditer ces objets et la modification est persistante) jusqu'à ce que je veuille choisir en utilisant l'objet connecté combobox (dans la base de données, il est connecté via une clé étrangère).Choix de la colonne de l'autre table/objet

Je peux remplir la liste déroulante afin que les valeurs correctes soient affichées (par exemple, le nom de l'utilisateur). Je fais cela en sélectionnant la source de données pour cette colonne particulière. Il me permet de choisir les propriétés affichées ainsi que la valeur (mais je ne peux pas définir la valeur à l'objet choisi WHOLE). Toutefois, lorsque l'objet est enregistré, l'erreur se produit. DataGridView tente d'enregistrer la valeur de l'objet sélectionné (propriété de cet "objet étranger"), mais pas l'objet lui-même. Comment puis-je convaincre DataGridView de sauvegarder l'objet sélectionné et pas seulement celui de sa propriété?

Répondre

1

Ceci est l'un des problèmes courants. Vous ne pouvez pas faire cela avec DataGridViewComboboxColumn d'origine. J'ai trouvé une solution il y a quelque temps - vous devez la sous-classer. Voici le 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); 
     } 
}