2010-03-31 3 views
0

J'essaie de lier une table de structures à un DataGridView. Le chargement et l'affichage de la table fonctionnent correctement, mais je ne peux pas modifier une valeur et la récupérer dans la table. Voici ce que je fais.Bound DataGridView ne pas mettre à jour la source de données

J'ai un type de données "primitive", réel défini par

public struct MyReal:IMyPrimative 
{ 
    public Double m_Real; 
    //... 
    public MyReal(String val) 
    { 
     m_Real = default(Double); 
     Init(val); 
    } 
    //... 
} 

Il se sert dans une structure:

public struct MyReal_Record : IMyRecord 
{ 
    public MyReal Freq { get; set;} 
    MyReal_Record(String[] vals) 
    { 
     Init(vals); 
    } 
} 

Et la structure est utilisée pour définir une table à l'aide d'une liaison générique Liste

public class MyTable<S> : BindingList<S> where S: struct, IMyRecord 
{ 
    public Type typeofS; 
    public MyTable() 
    { 
     typeofS = typeof(S); 
     // ... 
    } 

Cette table est utilisée comme source de liaison pour une grille, dynamiquement. Tout cela fonctionne très bien et je peux créer RTable, l'initialiser et l'afficher dans une grille. La grille permet l'édition et a des événements définis pour CellParsing et CellFormatting qui ressemblent à:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (e.DesiredType != typeof(String)) 
      return; 
     e.Value = e.Value.ToString(); 
    } 

    private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e) 
    { 
     if (e.DesiredType != typeof(MyReal)) 
      return; 
     e.Value = new MyReal(e.Value.ToString()); 
     e.ParsingApplied = true; 
     this.dataGridView1.UpdateCellValue(e.ColumnIndex, e.RowIndex); 
    } 

Lorsque je modifier une valeur dans une cellule, je peux changer le texte. En quittant la cellule, CellParsing se déclenche et le gestionnaire d'événements est appelé. Tout semble être correct dans le gestionnaire de CellParsing. e.DesiredType est MyReal. e.Value est une chaîne avec la nouvelle valeur. Une fois le nouveau MyReal créé à partir de la chaîne, e.Value est défini correctement. RowIndex et ColumnIndex sont corrects. ReadOnly est défini sur false. Cependant, lorsque je quitte la cellule, le système restaure la valeur d'origine dans la cellule. Je pensais que UpdateCellValue remplacerait la valeur dans le dataSource mais il me semble qu'il manque quelque chose.

Qu'est-ce que j'ai manqué?

Merci, Max

Répondre

0

J'ai trouvé la réponse sur un autre forum (social.msdn.microsoft.com) grâce à Aland Li.

« Quand on lie une liste d'objets à un contrôle, les objets de la liste doit être de type de référence, pas le type de valeur. En d'autres termes, Real_Record doit défini comme classe.

Si Real_Record est de la valeur type, une copie de l'élément Real_Record dans la liste est transférée à DataGridView pour initialiser la liaison.Lorsque la valeur Real est modifiée, la copie de Real_Record est modifiée, mais l'ancien élément de la liste n'est pas modifié. "

Si quelqu'un sait comment contourner cette limitation, j'aimerais l'entendre. Max

Questions connexes