web-dev-qa-db-fra.com

Validation DataGridView et modification de la valeur des cellules

Je voudrais manipuler une cellule dans mon DataGridView lors de la validation afin 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 peux valider ma valeur correctement, mais lorsque j'essaye de la changer en quelque chose de valide, j'obtiens une 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 cell.Value = lignes [0] ["Lot"]; ne fait pas ce que je m'attends à ce qu'il fasse.

24
Micah

L'événement CellValidating se produit juste avant le moment où DataGridView quitte le mode é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 cellule dans le gestionnaire de cet événement, car à moins que vous n'annuliez l'événement (auquel cas l'utilisateur est bloqué en mode édition), la valeur de cellule est définie sur la valeur du contrôle d'édition immédiatement après la l'événement se termine. Par conséquent, cela annule toute action que vous effectuez dans le gestionnaire.

Ce que vous devez faire à la place est de modifier la valeur dans le contrôle d'édition (en vous rappelant 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 constater que cela résout votre problème.

43
Bradley Smith

En général, il est préférable d'utiliser l'événement CellParsing chaque fois que vous devez convertir/modifier la valeur d'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.

5
drwatsoncode