none
Validar filas Repetidas Datagrid RRS feed

  • Pregunta

  • Hola a todos, Quisiera pedir de su apoyo por favor.

    Tengo un DataGrid en el cual se ingresan cuantas filas sean necesarias,pero antes de que guarde los datos quisiera evitar que se ingresen dos filas repetidas ,trabajo en Windows Forms C# Gracías de antemano. 

    viernes, 11 de enero de 2019 23:32

Respuestas

  • Hola jaime sequen:

    Si las filas las envias para persistir a una base de datos, linea por linea, con una sentencia insert, y la misma, tiene una restricción de unicidad por Nº factura, y serie, te insertará la primera, pero la segunda te devolverá un error.

    Eso visto desde el lado de la base de datos.

    También puedes mandar un procedure, o una sentencia Merge, de manera que inserte sino existe y update si existe.

    Merge

    https://docs.microsoft.com/es-es/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

    Otra opción visto desde c#, es no insertar en el DataGridView, si el registro ya existe.

    Te pongo un ejemplo, donde utilizamos linq para obtener un registro del datagrid coincidente con los textbox, que tu quieras. y si existe, puedes no hacer nada, o ponerte sobre el mism, y si no existe, lo anexas, para luego persistirlo.

       DataTable dt;
            int contador = 4;
           
            public Form1()
            {
                InitializeComponent();
                dt = new DataTable();
                dt.Columns.Add("id", typeof(int));
                dt.Columns.Add("NumeroFactura", typeof(int));
                dt.Columns.Add("Serie", typeof(string));
                dt.Rows.Add(1, 1, "AS1");
                dt.Rows.Add(2, 2, "AS2");
                dt.Rows.Add(3, 3, "AS1");
                dt.Rows.Add(4, 4, "AS1");
                DGTabla.DataSource = dt;
                /*inicializada tabla */
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                var record = DGTabla.Rows.Cast<DataGridViewRow>().
                    FirstOrDefault(c => (Convert.ToString(c.Cells["NumeroFactura"].Value) == textBoxNumFactura.Text) 
                        & (Convert.ToString(c.Cells["Serie"].Value) == textBoxSerie.Text));
    
                if (record == null)
                {
                    contador++;
                    dt.Rows.Add(contador, Convert.ToInt32(textBoxNumFactura.Text), textBoxSerie.Text);
                    // to do...guardar en bbdd cuando sea menester.
                }
                else
                    MessageBox.Show("Registro Existe");
    
    
    
            }

    FirstOrDefault

    https://docs.microsoft.com/es-es/dotnet/api/system.linq.enumerable.firstordefault?view=netframework-4.7.2

    Mediante linq tambien puedes utilizar el método any para saber si existe, que te devuelve un boolean

    Any

    https://docs.microsoft.com/es-es/dotnet/api/system.linq.enumerable.any?view=netframework-4.7.2

    lunes, 14 de enero de 2019 18:37

Todas las respuestas

  • Hola jaime sequen:

    Si trabajas en Windows Forms, deberías de introducir tu pregunta en el formo de C# (link)

    Además, para obtener mejores resultados, te diría que reformules tu pregunta.

    Contando más detalles, del tipo, por ejemplo, si el dataGrid esta enlazado a alguna colección a través de datasource o directamente se alimentan sus datos.

    Y cuando quieres evitar que se ingresen dos filas repetidas, en tus datos. sería conveniente, saber hacia donde van esos datos, y como los guardas. Tecnología (Ado, Ado.net, Entity Framework...).

    Es más si, pegas el código de persistencia, seguro que se puede echar una ayudita mejor.

    sábado, 12 de enero de 2019 6:37
  • Hola Javi Fernández agradezco mucho tus sugerencias y pido una disculpa es solo que no tengo mucha experiencia en el campo y se me dificulta redactar claramente mi pregunta.                                           Tratare de explicarte mejor el inconveniente que trato de resolver.

    Al usuario se le muestra un Datagridview el cual no se llena con base de datos solamente es para ingresar cuantos datos sean necesarios por el usuario, lo que quisiera es que al momento de que el usuario aga click para guardar las filas ingresadas, antes se verifique en el Datagridview que no allá dos filas con los mismos datos.

    ejemplo:

     No.Fila       NumeroFactura       Serie

        1               788                         A51                                                                                                                      2               789                         A52                                                                                                                      3               788                         A51

    Las filas 1 y 3 estan repetidas,eso es lo que trato de evitar,espero que me puedas ayudar.                      Estoy trabajando con windows forms C# Ado.net 



    jaimesequen














    lunes, 14 de enero de 2019 13:56
  • Hola jaime sequen:

    Si las filas las envias para persistir a una base de datos, linea por linea, con una sentencia insert, y la misma, tiene una restricción de unicidad por Nº factura, y serie, te insertará la primera, pero la segunda te devolverá un error.

    Eso visto desde el lado de la base de datos.

    También puedes mandar un procedure, o una sentencia Merge, de manera que inserte sino existe y update si existe.

    Merge

    https://docs.microsoft.com/es-es/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

    Otra opción visto desde c#, es no insertar en el DataGridView, si el registro ya existe.

    Te pongo un ejemplo, donde utilizamos linq para obtener un registro del datagrid coincidente con los textbox, que tu quieras. y si existe, puedes no hacer nada, o ponerte sobre el mism, y si no existe, lo anexas, para luego persistirlo.

       DataTable dt;
            int contador = 4;
           
            public Form1()
            {
                InitializeComponent();
                dt = new DataTable();
                dt.Columns.Add("id", typeof(int));
                dt.Columns.Add("NumeroFactura", typeof(int));
                dt.Columns.Add("Serie", typeof(string));
                dt.Rows.Add(1, 1, "AS1");
                dt.Rows.Add(2, 2, "AS2");
                dt.Rows.Add(3, 3, "AS1");
                dt.Rows.Add(4, 4, "AS1");
                DGTabla.DataSource = dt;
                /*inicializada tabla */
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                var record = DGTabla.Rows.Cast<DataGridViewRow>().
                    FirstOrDefault(c => (Convert.ToString(c.Cells["NumeroFactura"].Value) == textBoxNumFactura.Text) 
                        & (Convert.ToString(c.Cells["Serie"].Value) == textBoxSerie.Text));
    
                if (record == null)
                {
                    contador++;
                    dt.Rows.Add(contador, Convert.ToInt32(textBoxNumFactura.Text), textBoxSerie.Text);
                    // to do...guardar en bbdd cuando sea menester.
                }
                else
                    MessageBox.Show("Registro Existe");
    
    
    
            }

    FirstOrDefault

    https://docs.microsoft.com/es-es/dotnet/api/system.linq.enumerable.firstordefault?view=netframework-4.7.2

    Mediante linq tambien puedes utilizar el método any para saber si existe, que te devuelve un boolean

    Any

    https://docs.microsoft.com/es-es/dotnet/api/system.linq.enumerable.any?view=netframework-4.7.2

    lunes, 14 de enero de 2019 18:37