es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

DataGridView añadiendo una nueva fila cuando no debería, comportamiento extraño.

En C#, tengo un objeto de tipo Human con propiedades Id, Name, Address … basado en eso, he creado una lista de Humans y hice
humansBindingSource.DataSource = Humans
después de eso lo conecté a DataGridView
dgvHumans.DataSource = humansBindingSource

Todo esto funciona como debería, pero algo extraño sucede cuando hago clic para agregar una nueva fila en la parte inferior, en una situación en la que escribo algo en DataGridView en el campo Nombre y luego borro todas las letras ingresadas porque cambié de opinión y no voy a agregar uno nuevo y hago clic en la línea anterior, esa fila queda con Id = 0, Nombre = null, Dirección = null y también se agrega un nuevo objeto a la lista… no debería ser así, debería cancelar esa entrada como en el caso cuando se hace clic en la fila para una nueva entrada y luego se hace clic en cualquier fila anterior. Espero haber logrado explicar cuál es el problema.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema que estás experimentando con el DataGridView al agregar una nueva fila en la parte inferior y luego eliminar los valores en el campo Nombre es que el DataGridView está creando una nueva instancia del objeto Humano con valores predeterminados (Id = 0, Nombre = null, Dirección = null) y agregándolo a la lista Humans.

    Para evitar este comportamiento, puedes manejar el evento RowValidating del DataGridView y verificar si la nueva fila tiene algún valor. Si no lo tiene, puedes cancelar el evento y evitar que se agregue la nueva fila a la lista.

    Aquí tienes un ejemplo de código que demuestra este enfoque:

    private void dgvHumans_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
    {
        // Verificar si la nueva fila tiene algún valor
        DataGridViewRow row = dgvHumans.Rows[e.RowIndex];
        bool tieneValores = false;
        foreach (DataGridViewCell celda in row.Cells)
        {
            if (celda.Value != null && celda.Value.ToString() != "")
            {
                tieneValores = true;
                break;
            }
        }
    
        // Si la nueva fila no tiene valores, cancela el evento para evitar que se agregue a la lista
        if (!tieneValores)
        {
            e.Cancel = true;
        }
    }
    

    Al manejar el evento RowValidating de esta manera, puedes evitar el problema de agregar un nuevo objeto Humano con valores predeterminados a la lista cuando el usuario elimina los valores en el campo Nombre.

Comments are closed.