dataGridView ComboBox Gestionnaire d'Événement de Problème
Je vais avoir un problème avec la manipulation d'un indice événement a changé pour une zone de liste déroulante qui se trouve à l'intérieur d'un dataGridView. J'écris une méthode pour gérer la zone de liste déroulante de sélection du changement à l'aide d'un délégué:
ComboBox.SelectedIndexChanged -= delegate { ComboBoxIndexChanged(); };
ComboBox.SelectedIndexChanged += delegate { ComboBoxIndexChanged(); };
ou un Gestionnaire d'événements:
comboBox.SelectedIndexChanged += new EventHandler(ComboBoxIndexChanged);
mais les deux méthodes ne fonctionnent pas comme prévu. C'est, lorsque vous cliquez sur votre sélection à l'intérieur de la zone de liste déroulante (contenues dans le dataGridView), il prend plusieurs clics pour la cause de mon ComboBoxIndexChanged(); la méthode de fonction de propre, que si elle décide de fonction. Quelle est la meilleure façon de surmonter/allez-sur la définition d'un événement sur un indexedChange d'une zone de liste déroulante dans un dataGridView?
Le code que j'utilise actuellement dans le contexte, est comme suit:
private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
try
{
if (this.dataGridView.CurrentCell.ColumnIndex == (int)Column.Col)
{
ComboBox comboBox = e.Control as ComboBox;
if (comboBox != null)
{
comboBox.SelectedIndexChanged += new EventHandler(ComboBoxIndexChanged);
}
}
return;
}
catch (Exception Ex)
{
Utils.ErrMsg(Ex.Message);
return;
}
}
et l'événement ComboBoxIndexChanged est:
private void ComboBoxIndexChanged(object sender, EventArgs e)
{
//Do some amazing stuff...
}
J'ai lu un fil similaire sur StackOverFlow qui affirme qu'il y a un problème à traiter avec la zone de liste déroulante événement de changement de cette façon, mais je ne peux pas obtenir la solution de travail. Le poste peut être trouvé ici: "SelectedIndexChanged" événement dans ComboBoxColumn sur Datagridview. Il dit:
"Les choses se compliquent car ils ont optimisé le DataGridView en avoir un seul contrôle de l'édition pour toutes les lignes. Voici comment j'ai géré une situation similaire:
Premier crochet un délégué à la EditControlShowing événement:
myGrid.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(
Grid_EditingControlShowing);
...
Puis dans le gestionnaire, crochet jusqu'à la EditControl de l'événement SelectedValueChanged:
void Grid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
ComboBox combo = e.Control as ComboBox;
if (combo != null)
{
//the event to handle combo changes
EventHandler comboDelegate = new EventHandler(
(cbSender, args) =>
{
DoSomeStuff();
});
//register the event with the editing control
combo.SelectedValueChanged += comboDelegate;
//since we don't want to add this event multiple times, when the
//editing control is hidden, we must remove the handler we added.
EventHandler visibilityDelegate = null;
visibilityDelegate = new EventHandler(
(visSender, args) =>
{
//remove the handlers when the editing control is
//no longer visible.
if ((visSender as Control).Visible == false)
{
combo.SelectedValueChanged -= comboDelegate;
visSender.VisibleChanged -= visibilityDelegate;
}
});
(sender as DataGridView).EditingControl.VisibleChanged +=
visibilityDelegate;
}
}"
Ce problème que j'ai avec c'est que "VisSender" n'est pas définie donc l'événement "VisibleChanged" ne peut pas être utilisé.
Toute l'aide auprès de vous les mecs, est comme toujours, le plus apprécié.
Oui. En fonction de la zone de liste déroulante de la valeur de cette effets d'autres éléments dans le dataGridView.
Pouvez-vous poster quelques de la balise pertinente?
J'ai peut-être missunderstood vous. Je clique sur la zone de liste déroulante de la colonne dans le dataGridView (DGV), il tombe, je sélectionne un nouvel indice l'indice est alors utilisé (via un gestionnaire d'Événement) pour régler quelques autres trucs. La DGV a de nombreuses de nombreuses lignes (qui peut être ajouté au moment de l'exécution par l'utilisateur), j'ai donc besoin d'un Gestionnaire d'événements à traiter avec thtese de nombreuses modifications en conséquence. Merci.
Si la liste déroulante est déclarée dans votre balisage, il faut attribuer le gestionnaire d'événements. La technique que vous utilisez uniquement pour créer dynamiquement des GridViews.
OriginalL'auteur MoonKnight | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Sons que vous souhaitez que les modifications soient validées dès que l'utilisateur change de la zone de liste déroulante, sans avoir à cliquer hors de la cellule. Pour ce faire, vous aurez besoin de forcer le commettre lorsque le changement se produit (à l'aide de
CommitEdit
, il est aussi un exemple sur la page MSDN). Ajoutez ceci à votreDataGridView
:Ensuite, vous pouvez simplement écouter de la
CellValueChanged
et éviter d'avoir à essayer et vous inscrire à la ComboBoxValueChanged événement sur le contrôle de l'édition.Si vous travaillez avec cascade zone de liste déroulante, puis il est ultime
OriginalL'auteur SwDevMan81