2010-12-09 5 views
2

Donc mon but est qu'une fois qu'un utilisateur clique sur l'article de la liste déroulante, la cellule appellera automatiquement EndEdit(). La chose la plus étrange est que le code ci-dessous fonctionnera sur les ComboBoxesCells 2nd-n que je descends et sélectionne des valeurs mais JAMAIS le premier. Y a-t-il quelque chose qui me manque ici?Un problème étrange avec DataGridViewComboBoxCell, en essayant d'autocommiter les changements

 protected override void OnCellClick(DataGridViewCellEventArgs e) 
     { 
      base.OnCellClick(e); 

      DataGridViewComboBoxEditingControl control = this.EditingControl as DataGridViewComboBoxEditingControl; 
      if (control != null) 
      { 
        control.DropDownClosed += new EventHandler(control_DropDownClosed); 
      } 
     } 

      void control_DropDownClosed(object sender, EventArgs e) 
      { 
       this.EndEdit(); 
       DataGridViewComboBoxEditingControl control = sender as DataGridViewComboBoxEditingControl; 
       control.DropDownClosed -= new EventHandler(control_DropDownClosed); 
      } 

devrais ajouter que je suis héritant de DataGridView si ce n'est pas évident

Répondre

1

Quand quelque chose comme "La chose la plus étrange est que le code ci-dessous fonctionnera sur les ComboBoxesCells 2-n que je laisse tomber vers le bas et sélectionnez des valeurs de mais JAMAIS le premier "arrive, c'est souvent parce que l'événement se produit avant que quelque chose que vous avez besoin est fait.

Seing votre exemple, je dirais que la première fois, lorsque vous cliquez sur,

DataGridViewComboBoxEditingControl control = this.EditingControl as DataGridViewComboBoxEditingControl; 

vous donne control == null.

Peut-être que vous devriez changer l'événement choisi pour faire vos trucs de Click à SelectedIndexChanged ou SelectedValueChanged?

Espérons que cela aide,

+0

Eh bien, je ne fais que raccorder le gestionnaire d'événements du contrôle quand il n'est pas nul. À la première tentative, le contrôle n'est pas nul et je suis capable de me connecter à l'événement "control_DropDownClosed". Je peux même marquer un point à l'intérieur de l'événement. Lors de la première tentative, EndEdit() rétablit la valeur à ce qu'elle était avant la sélection de l'élément déroulant. Tous les appels suivants à EndEdit() dans cette fonction fonctionnent très bien, donc je suis très confus. – Tom

+1

@Tom J'ai vérifié sur Internet et j'ai trouvé quelqu'un avec le même problème que vous: http://www.visualstudiodev.com/visual-basic-express-edition/datagridviewcomboboxcolumn-70711.shtml Sa solution de contournement était de forcer la valeur en le gestionnaire d'événements OnLeave. – LaGrandMere

+1

Eh bien, j'ai trouvé un moyen de contourner cela aussi, je garde juste la trace de la première fois que j'utilise le contrôle d'édition, si c'est avec force que je réinitialise la valeur après l'appel EndEdit. On se sent comme un hack mais ça marche donc je suis content. – Tom