2011-08-12 2 views
0

J'ai un DataGridView lié à une liste [de parties]. Le dernier élément de la liste est toujours une 'partie fictive', qui est là pour créer une ligne supplémentaire dans la grille afin que l'utilisateur puisse commencer à taper dans la première cellule pour ajouter une partie à la liste. Dès que l'utilisateur tape plus de x caractères dans cette cellule particulière, un nouveau DataGridView avec des résultats de recherche apparaît sous la cellule où il tape (un peu regarder les suggestions de Google), et il peut sélectionner l'une des correspondances pour ajouter la partie à la liste. Je le fais en manipulant l'événement EditControlShowing, qui assigne le «contrôle d'édition» à une variable TextBox qui a un gestionnaire pour TextChanged.DataGridView NullReferenceException sur InitializeEditingControlValue après avoir perdu le focus

Le bug:

Je veux que la mise au point pour passer à la deuxième DataGridView (résultats de recherche) si l'utilisateur appuie sur la touche flèche vers le bas. Le gestionnaire EditControlShowing fonctionne correctement la première fois, déplace le focus vers le second DataGridView et laisse le premier DataGridView dans un état fonctionnel "apparemment", c'est-à-dire que tous les autres gestionnaires d'événements fonctionnent. Mais la deuxième fois que le gestionnaire EditControlShowing se déclenche, DataGridView lève le NullReferenceException sur InitializeEditingControlValue. Parce que c'est l'appel de DataGridView qui lance l'erreur, le débogueur m'amène à "Application.Run" dans mon code, ce qui n'est pas utile. Cependant, j'ai déterminé que l'appel qui provoque l'entrée de DataGridView dans cet état, et le point où l'exception est levée, est lorsque je vole le premier DataGridView en appelant Focus() sur le second DataGridView (ou tout autre contrôle d'ailleurs). Si toutefois je laisse l'utilisateur changer de focus sur DataGridView (par exemple en cliquant avec la souris), le DataGridView reste correct.

Est-ce que quelqu'un sait pourquoi détourner l'attention d'un DataGridView au cours d'un gestionnaire pour EditControlShowing devrait se comporter différemment par la suite?

J'ai essayé CancelEdit, Refresh, Activer/Désactiver etc ...

Toutes les suggestions sur me aider à trouver ce qui se passe dans le DataGridView? Je ne peux pas repérer quelque chose d'évident en l'inspectant à des points d'arrêt avant et après. Je ne sais même pas comment trouver quel objet est nul comme son propre code DataGridView ...

Merci beaucoup.

Répondre

0

OK, je résolus cela en utilisant BeginInvoke dans le gestionnaire d'événements TextChanged (code est à Boo, mais devrait donner un sens):

//The event handler 
private def CellAsTextBoxTextChanged(sender as object, e as EventArgs): 
    ... 
    self.BeginInvoke(ShowPartSelectionArea, currentCell, _CellAsTextBox.Text) 

//The method which amongst other things, sets the focus to another control 
private def ShowPartSelectionArea(currentCell as DataGridViewCell, searchString as string): 
    ... 
    AnotherDataGridView.Focus() 
    ... 

J'avais déjà essayé d'utiliser BeginInvoke directement au point d'appeler mise au point() sur l'autre contrôle, comme ceci:

private def CellAsTextBoxTextChanged(sender as object, e as EventArgs): 
    ... 
    ShowPartSelectionArea(currentCell, _CellAsTextBox.Text) 

private def ShowPartSelectionArea(currentCell as DataGridViewCell, searchString as string): 
    ... 
    self.BeginInvoke(AnotherDataGridView.Focus()) 
    ... 

Mais celui-ci n'a pas fonctionné, peut-être parce que la première façon permet effectivement la cellule du DataGridView pour terminer tout ce qu'il fait alors que la deuxième voie ne fonctionne pas.

Donc, pour toute personne confrontée au même problème, je vous conseille de jouer avec où dans la pile d'appels vous utilisez BeginInvoke.

Questions connexes