Validation DataGridView Et Modification De La Valeur De La Cellule

Je voudrais manipuler une cellule dans mon DataGridView quand elle est en cours de validation de sorte que si l'utilisateur entre une valeur qui n'est pas valide pour la base de données, mais qui est facilement convertie en données valides, le programme changera la valeur en une valeur appropriée.

Je suis capable de valider ma valeur correctement mais quand j'essaie de la changer en quelque chose de VALIDE, j'obtiens une erreur DataError. Voici mon code:

        private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        Console.WriteLine("Validating");
        DataGridViewColumn col = this.unit_List_2_GroupsDataGridView.Columns[e.ColumnIndex];
        DataGridViewCell cell = this.unit_List_2_GroupsDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
        if (col == this.batchDataGridViewTextBoxColumn && this.unit_List_2_GroupsDataGridView.IsCurrentCellInEditMode)
        {
            Console.WriteLine("   Batch Column");
            DataRow[] rows = label_EntryDataSet.viewJobBatchList.Select(String.Format("Job={0} AND Display='{1}'"
                , comboBox1.SelectedValue, e.FormattedValue));
            if (rows.Length == 1)
            {
                Console.WriteLine("      Auto Completed item from list: {0}", rows[0]["Batch"]);
                //e.Cancel = true;
                cell.Value = rows[0]["Batch"];
                //this.unit_List_2_GroupsDataGridView.EndEdit();
            }
            else
            {
                Console.WriteLine("     No Autocomplete!");
                int i = 0;
                if (!int.TryParse(e.FormattedValue.ToString(), out i))
                {
                    Console.WriteLine("         Not an integer either");
                    e.Cancel = true;
                }
            }
        }
    }

La ligne qui lit cellule.Value = rows [0] ["Batch"]; ne fait pas ce que je m'attends à faire.

22
demandé sur Micah 2011-01-20 05:36:31

2 réponses

L'événement CellValidating se produit juste avant le moment où le DataGridView quitte le mode d'édition; c'est un événement qui concerne/implique le contrôle d'édition (DataGridView.EditingControl). Vous ne devez jamais tenter de modifier la valeur de la cellule dans le gestionnaire de cet événement, car à moins d'annuler l'événement (auquel cas l'utilisateur est bloqué en mode édition), la valeur de la cellule est définie sur la valeur du contrôle d'édition immédiatement après la fin de l'événement. Ceci annule donc toute action que vous effectuez dans le gestionnaire.

Ce que vous devez faire à la place est de changer la valeur dans le contrôle d'édition (en se souvenant de ne pas annuler l'événement). Par exemple, pour un DataGridViewTextBoxCell, vous utiliseriez ce qui suit au lieu de votre ligne problématique:

unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]);

, Vous devriez trouver que cela résout votre problème.

39
répondu Bradley Smith 2011-01-20 03:04:43

En général, il est préférable d'utiliser l'événement CellParsing chaque fois que vous devez convertir / modifier la valeur dans une cellule. À partir de cet événement, vous pouvez indiquer que la valeur de l'utilisateur n'est pas valide en définissant la valeur ErrorText de la cellule ou de la ligne.

4
répondu ricovox 2013-11-21 14:22:42