Question

Je voudrais manipuler une cellule dans mon DataGridView quand il est de valider de sorte que si l'utilisateur entre une valeur non valide pour la base de données, mais il est facilement converti en données valides, le programme va changer la valeur à une appropriée une.

Je suis en mesure de valider ma valeur correctement, mais lorsque je tente de changer quelque chose valide je reçois un 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 suivante Cell.Value = lignes [0] [ "batch"];. ne fait pas ce que je pense à faire

Était-ce utile?

La solution

L'événement se produit CellValidating juste avant lorsque le mode d'édition de feuilles de DataGridView; il est un événement qui se rapporte à / implique le contrôle d'édition (DataGridView.EditingControl). Vous ne devriez jamais tenter de changer la valeur de la cellule dans le gestionnaire pour cet événement, parce que si vous annulez l'événement (dans ce cas, l'utilisateur est bloqué en mode d'édition), la valeur de la cellule est réglée sur la valeur de la commande d'édition immédiatement après la finitions de l'événement. Ceci, par conséquent, annule toute action que vous effectuez dans le gestionnaire.

Qu'est-ce que vous avez à faire à la place est de changer la valeur dans le contrôle d'édition (ne pas annuler se rappeler l'événement). Par exemple, pour un DataGridViewTextBoxCell, vous utilisez 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.

Autres conseils

En général, il est préférable d'utiliser le la valeur de ErrorText de la cellule ou de la ligne.

scroll top