Domanda

Vorrei manipolare una cellula del mio DataGridView quando si sta convalidando in modo che se l'utente inserisce un valore che non è valido per il database, ma può essere facilmente convertito in dati validi, il programma cambierà il valore ad un appropriato uno.

Sono in grado di convalidare il mio valore correttamente, ma quando provo a cambiarlo a qualcosa di valido ho un DataError. Ecco il mio codice:

        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 riga Cell.Value = righe [0] [ "batch"];. non sta facendo quello che mi aspetto che faccia

È stato utile?

Soluzione

L'evento CellValidating si verifica appena prima di quando la modalità di foglie DataGridView di modifica; è un evento che si riferisce a / coinvolge il controllo di modifica (DataGridView.EditingControl). Non si dovrebbe mai tentare di cambiare il valore della cella nel gestore per questo evento, perché a meno che non si annulla l'evento (in questo caso l'utente è bloccato in modalità di modifica), il valore della cella è impostato il valore dal controllo di modifica immediatamente dopo il finiture eventi. Questo, quindi, annulla qualsiasi azione che si esegue nel gestore.

Quello che devi fare, invece è cambiare il valore nel controllo di modifica (ricordando di non annullare l'evento). Ad esempio, per un DataGridViewTextBoxCell, è necessario utilizzare il seguente al posto della vostra linea problematica:

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

Si dovrebbe trovare che questo risolve il problema.

Altri suggerimenti

In generale, è meglio utilizzare il CellParsing evento ogni volta che è necessario convertire / modificare il valore in una cella. Da all'interno di tale evento, si può indicare che il valore per l'utente non è valido impostando il valore ErrorText della cella o riga.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top