2009-06-26 2 views
0

Je descends une table de jeu de données fortement typée dans un datagridview. puis en ajoutant une colonne de zones de liste déroulante pour laisser les clés étrangères être sélectionnées par nom au lieu de l'ID. Il y a peut-être un moyen plus simple de le faire.Pourquoi mon DataGridviewColumn n'accepte-t-il pas les modifications à ce stade?

puis-je transformer la colonne typeID en colonne de liste déroulante tout en étant capable de renvoyer la source de données à mon type de table de jeu de données fortement typé? Ai-je besoin de le récupérer à partir de la source de données ou est-ce que les modifications apportées à datagridview sont automatiquement renvoyées à l'ensemble de données?

Quel est le problème avec ce code?

FormDg fDg; 
    internal DsTech.TechObjectsDataTable ShowDg(IWin32Window owner, Db db) 
    { 
     fDg = new FormDg(); 

     fDg._dg.DataSource = db.getDs().TechObjects; 
     var TypeSelecter = new DataGridViewComboBoxColumn(); 
     var types = db.getdsObjectTypes(); 
     TypeSelecter.DataSource = types; 
     TypeSelecter.DisplayMember = "type"; 
     TypeSelecter.Name = "Types"; 
     TypeSelecter.ValueMember = "ID"; 
     fDg._dg.Columns["typeID"].DisplayIndex=fDg._dg.Columns.Count-1; 
     fDg._dg.Columns.Add(TypeSelecter); 
     fDg._dg.ReadOnly = false; 
     Application.DoEvents(); 
     for (int i = 0; i < fDg._dg.RowCount; i++) 
     { 
      if ((fDg._dg.Rows[i].Cells["typeID"].Value is DBNull) == false) 
       //Line below does not work 
       UpdateTypesRow(i,(int)fDg._dg.Rows[i].Cells["typeID"].Value); 
     } 
     fDg._dg.CellEndEdit += new DataGridViewCellEventHandler(_dg_CellEndEdit); 


     if (fDg.ShowDialog(owner) == DialogResult.OK) 
     { 
      return (DsTech.TechObjectsDataTable)fDg._dg.DataSource; 
     } 
     else return null; 

    } 

Bien que ce code fonctionne très bien

void _dg_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     if (fDg._dg.Columns[e.ColumnIndex].Name == "Types") 
     { 
      fDg._dg.Rows[e.RowIndex].Cells["typeID"].Value = fDg._dg.Rows[e.RowIndex].Cells["Types"].Value; 
      //update typeID column 

     } 
     else if (fDg._dg.Columns[e.ColumnIndex].Name == "typeID") 
     { 
      //update types column 
      UpdateTypesRow(e.RowIndex,(int) fDg._dg.Rows[e.RowIndex].Cells["typeID"].Value); 
     } 
    } 

Voici le code que je factoré 2 en juste au cas où je lisais mal et ils étaient en fait différents

void UpdateTypesRow(int rowIndex, int value) 
    { 
     fDg._dg.Rows[rowIndex].Cells["Types"].Value = value; 
    } 

Répondre

0

En utilisant vbforums. com J'ai trouvé des exemples en utilisant des sources de liaison et j'ai veillé à ajouter la zone de liste déroulante avant de définir la propriété de source de données de datagridview et j'ai réussi à l'obtenir. The Thread and code in c#

Questions connexes