jueves, 22 de abril de 2010

C# - [DataGridView] – Pasar Registros entre Grillas

 

Introducción


El articulo explica de que forma se puede seleccionar registros en el control DataGridView y pasarlos a otro, representando este la selección de las filas por el usuario.

En uno de los DataGridView se listaran productos, y por medio de un checkbox en cada fila, se podrá seleccionar que ítems se desean seleccionar.

Botones que indican la dirección serán los encargados de ejecutar la opción de pasaje.

El diseño de la interfaz puede apreciarse en esta imagen:

form1

 

Carga de la lista de productos


Para esta operación se requerirá la ayuda del DataSet tipado el cual define la estructura de la entidad, pero será responsabilidad de la clase con sufijo DAL, la que cargara la información, proveniente de la base de datos.

private void frmPedidos_Load(object sender, EventArgs e)
{
    //
    // Se recupera los datos de los productos desde la tabla
    //
    dtoProductos datos = ProductoDAL.ProductosGetAll();

    //
    // Se bindean los datos a la grilla
    //
    dgvProductos.AutoGenerateColumns = false;
    dgvProductos.DataSource = datos;
    dgvProductos.DataMember = "Productos";

}

Selección de un ítem en la grilla de origen


Hay que destacar que la operación sobre un DataGridView difiere si esta se encuentra previamente enlazada a datos, o no.

En esta primera operación implica la sección de un producto que pasara a una lista no enlazada a datos, por lo tanto se podrá hacer uso de método Add() de la colección de Rows de la grilla.

private void btnSeleccionar_Click(object sender, EventArgs e)
{
    //
    // Se define una lista temporal de registro seleccionados
    //
    List<DataGridViewRow> rowSelected = new List<DataGridViewRow>();

    //
    // Se recorre ca registro de la grilla de origen
    //
    foreach (DataGridViewRow row in dgvProductos.Rows)
    {
        //
        // Se recupera el campo que representa el checkbox, y se valida la seleccion
        // agregandola a la lista temporal
        //
        DataGridViewCheckBoxCell cellSelecion = row.Cells["Seleccion"] as DataGridViewCheckBoxCell;

        if (Convert.ToBoolean(cellSelecion.Value))
        {
            rowSelected.Add(row);
        }
    }

    //
    // Se agrega el item seleccionado a la grilla de destino
    // eliminando la fila de la grilla original
    //
    foreach (DataGridViewRow row in rowSelected)
    {
        dgvSeleccion.Rows.Add(new object[] {false, 
                                            row.Cells["Descripcion"].Value,
                                            row.Cells["PrecioUnitario"].Value,
                                            row.Cells["UnidadMedida"].Value});

        dgvProductos.Rows.Remove(row);
    }

}

Hay que remarcar también que el uso de la lista temporal no es un capricho, sino que es necesaria ya que mientras se recorre una lista por medio de la instrucción “for each”, no pueden removerse elementos. Por esta razón es que en una operación siguiente se recorre la selección y allí si se procede a incluye los ítems en al grilla de destino y quitarla de la original.

Este punto lo he explicado con mas detalle siguiente articulo:

Eliminar ítems en una lista

 

Selección de un ítem en la grilla de destino


Ahora le toca el turno a la operación contraria, y aquí hay un punto que ya se menciono en el paso previo, la lista de origen esta vinculada a datos de productos con lo cual usar el Rows.Add() no es posible.

Para esta operación se agregaran los datos directo en el origen, en este caso el datatable, que se ha creado dentro del DataSet tipado.

private void btnQuitar_Click(object sender, EventArgs e)
{
    //
    // Se define una lista temporal de registro seleccionados
    //
    List<DataGridViewRow> rowSelected = new List<DataGridViewRow>();

    //
    // Se recorre cada fila de la grilla de seleccion y se determian que registros estan checkeados
    //
    foreach (DataGridViewRow row in dgvSeleccion.Rows)
    {
        DataGridViewCheckBoxCell cellSelecion = row.Cells["SeleccionSel"] as DataGridViewCheckBoxCell;

        if (Convert.ToBoolean(cellSelecion.Value))
        {
            rowSelected.Add(row);
        }
    }

    //
    // Se valida si hay algun registro por eliminar
    //
    if (rowSelected.Count > 0)
    {
        //
        // Se recupera el origen de datos que tiene asignada la grilla de productos
        //
        dtoProductos datos = dgvProductos.DataSource as dtoProductos;

        //
        // Se recorre cada item seleccionado y se arma programaticamente la fila del DataTable
        // se elimina el registro de la grilla de selecciones
        //
        foreach (DataGridViewRow row in rowSelected)
        {

            dtoProductos.ProductosRow productoRow = datos.Productos.NewProductosRow();

            productoRow.Descripcion = Convert.ToString(row.Cells["DescripcionSel"].Value);
            productoRow.PrecioUnitario = Convert.ToDecimal(row.Cells["PrecioUnitarioSel"].Value);
            productoRow.UnidadMedida = Convert.ToString(row.Cells["UnidadMedidaSel"].Value);
            datos.Productos.Rows.Add(productoRow);

            dgvSeleccion.Rows.Remove(row);
        }

        //
        // Se binden los datos nuevamente, pero ahora con los nuevos registros
        // agregados del paso anterior
        //
        dgvProductos.AutoGenerateColumns = false;
        dgvProductos.DataSource = datos;
        dgvProductos.DataMember = "Productos";
    }
}

Es necesario analizar como toma los datos originales convirtiendo el contenido de DataSource de la grilla, en este caso a dtoProductos, ya que este es el tipo de datos utilizado en al carga original.

Se toman los datos originales, se procede a la creación de cada row de forma programática, asignando el valor a cada campo, por ultimo se vuelve a bindear la grilla.

 

[C#]
[VB.NET]

129 comentarios:

  1. Hola:

    Aquí de nuevo con dudas :P, para mi proyecto algo similar solo que no use listas sino las propiedades de Add() y RemoveAt() del DataGridView, sin embargo mi duda entra en el siguiente ámbito: Lo que hice fue en el mismo Form, pero al querer hacerlo en 2, es decir que entres al FormPrincipal y dando click en el Boton agregar te visualiza una ventana donde seleeciono los productos con un CheckBox y al darle click en Aceptar, los productos seleccionados se pasen al DataGrid del Form Principal, sin embargo no lo hace, se queda vacio, a pesar de que tmb ya le cambie los attributos de private a public a los DataGrid.

    Disculpa las molestias y espero puedas orientarme ;).

    Gracias.

    ResponderEliminar
  2. Leandro no tenido problemas para adaptar tu codigo a mi software, tengo la siguienta consulta, le he agregado un textbox al formulario, que quiero que me filtre los datos para buscar del datagridProductos para luego enviarlos al datagridSeleccionados, dataSetSel extraerDatos = cargaHerramietads.herra();
    extraerDatos.Tables[0].DefaultView.RowFilter = ("Descripcion like '" + this.txtBuscar.Text + "%'");
    this.dtgSeleccion.DataSource = extraerDatos.Tables["Herramienta"].DefaultView;

    lo cual consigue el trabajo, pero cuando borro todos los datos del textbox me devuelve todos los datos del dataTabla incluso lo que ya fuero seleccionados.. por favor, me podrias explicar una opcion mejor

    ResponderEliminar
  3. hola Edgar

    En principio te recomandaria que no realices el codigo tan largo usndo siempre

    extraerDatos.Tables[0].DefaultView

    podria asignarlo a una variable auxiliar

    DataView view = extraerDatos.Tables[0].DefaultView;

    view.Filter = string.Format( "Descripcion like '{0}%'", txtBuscar.Text);

    dtgSeleccion.DataSource = view;


    Habria que ver si estas limpiando correctamente el gridview cuando quitas el filtro que habias puesto, pero puede ser un analisis extenso, te recomendaria que realice la pregunta en el foro de MSDN:

    Foro C#

    Alli se podrias revisar el tema, yo participo bastante, puede que yo mismo te responda, o alguno de los muchos usuario activos.

    saludos

    ResponderEliminar
  4. Hola Leandro, gracias por tu ayuda. Necesito hacer esto. teniendo un datagridview (c#) con datos, como puedo agregarle a ese todos los datos de otro datagridview. me explico mejor. tenemos 2 datagridview con datos. como hago para que con un boton, todos los datos del dgv1 vayan a los del dgv2 pero sin borrarlos, osea adicionarlos, agregarlos y que se queden mostrando todos en el dgv2. espero me entendiras y espero tu respuesta muy pronto porque estoy embalao.
    PD. no es agregar item por item o los items seleccionados, es pasar de una, con el click del boton todos los datos del dgv1 al dgv2 y agregarlos a los que ya habian allí

    ResponderEliminar
  5. hola Gabriel

    La tecnica es igual a la explicada en el articulo, solo que en tu caso cuando recorras la grilla no harias una validacion si hay items selecionados, sino que tomarias todos los registros y los pasarias.

    Por supuesto deberias aplicar la tecnica que aqui se refleja en el titulo "Selección de un ítem en la grilla de destino", pero visto al contrario no como un "quitar", sino que en el tuyo sera la seleccion de datos, en el ejemplo una de las grillas estaba enlazada a datos y la otra no, y resulto que la grilla cargada con datatable tipado es la inicial, en tu caso es la otra, la que recibe la seleccion.

    Es por eso que los datos no los agregas directo en la grilla, sino que lo haces al datatable que esta tiene asignado.

    bueno espero esto ayude un poco.
    saludos

    ResponderEliminar
  6. Hombre sisisisi, me has iluminado muchisimo. No sabes lo agradecido que me siento con vos por todas tus ayudas y orientaciones desinteresadas. Mucho ánimo a continuar con tu labor y ya sabes que tenes un buen amigo en Medellín Colombia.
    De nuevo muchas gracias.

    ResponderEliminar
  7. muchas gracias por tus aportes,quisiera que me ayudaras quisiera que cuando paso los datos a otro datagrid poder insertar ciertos campos en una DB.


    muchas gracias

    ResponderEliminar
  8. hola lo mejor

    Habria que analizar si quieres insertar en la misma operacion cuando pasas los items entre las grillas, o si no conviene realizar la operacion en una accion separada cuando la lista de seleccion esta definida, quizas en un boton de aceptar los cambios.

    Algo que no has mencionado es la db que usaras?

    Igualmente la respuesta pueda ser algo larga para dar en este articulo por ahi podrias llevar la consulta para analizar en los foros de MSDN, donde participo, quizas te conteste yo, o algun otro miembro.

    Foro C#

    Foro VB.NET

    alli se podra revisar los aspectos del insert con mas detalle

    pero no olvides mencionas en que lenguaje programas, con que version del framework de .net, y que base de datos utilizaras

    saludos

    ResponderEliminar
  9. hola leandro la verdad quiero hacer lo mismo pero en vez de pasar la informacion a otro datagridview la quiero pasar a un formato que esta hecho en crystal report...como se podria hacer agradezco tu ayuda

    ResponderEliminar
  10. hola andres felipe

    o sea apuntas a algo como esto

    [Crystal Reports] - Exportar DataGridView a Crystal

    En tu caso por ahi no serian todas las rows del grid, sino solo las marcadas.

    saludos

    ResponderEliminar
  11. la verdad muchas gracias la verdad que me ha sido de mucha ayuda tu ayuda....excelente

    ResponderEliminar
  12. Hola una cosnulta como puedo hacer para pasar toda una fila de una gridview de un WindowsForm a un GridView de otro Windows form tu ayuda me servira de mucho mil gracias de ante mano

    ResponderEliminar
  13. hola PROMEX

    Imagino seria pasar informacion de un form padre a uno hijo, si es asi valida este otro articulo:

    [WinForms] – Pasaje de información formulario hijo

    en este veras como pasar por medio del constructor o propiedades informacion al un formulario hijo.


    saludos

    ResponderEliminar
  14. Excelente aporte, me re sirvió para mi proyecto!!! Muchas Gracias Leandro!!!

    ResponderEliminar
  15. Leandro. Que gusto encontrar este blog. Me parece genial que compartas tu conocimiento

    No se como enviarte algunas cosas que me gustaria preguntarte, asi que aprovecho que una de mis dudas va masomenos de la mano con lo que aca publicaste

    Tengo un data grid view y cuando presiono enter cambia el indice de seleccion. Como soluciono esto?

    Mil gracias
    Cristhian

    ResponderEliminar
  16. hola Cristhian

    disculpa la tardanza, recien ahora veo la notificacion, se me mezclo con otros mensajes

    bien mencionas que presioans enter, pero esta accion sobre que control la realizas, porque puede ser algo de la funcionalidad del propio control


    saludos

    ResponderEliminar
  17. hola muchas gracias por los aportes, lo he podido adaptar a mi proyecto, el unico problema q tengo es para regresar las filas del segundo datagrid al primero lo q sucede es q el primero esta enlazado con databinding, pero lo que me este entreteniendo no creo q sea eso lo q no entiendo son estas lineas del codigo

    dtoProductos datos = dgvProductos.DataSource as dtoProductos;

    dtoProductos.ProductosRow productoRow = datos.Productos.NewProductosRow();

    ya que la aplicacion q estoy haciendo es con mysql y ahorita ando algo perdido con acces talves mepuedes hechar una mano
    muchas gracias!!!

    ResponderEliminar
  18. hola Dark Alchemist

    que uses mysql, sql server, access, o ciualquier otra db no deberia afectar a esas lienas que has puesto en al consulta, porque se trata de un dataset tipado que es idnetico sin importar la db que uses

    pero recuerda que para lograr esto necesitas tener un .xsd, o sea un dataset tipado que construyes en base al modelo de tu db

    el problema es que quizas no sea tan directo conectar mysql al Server Explorer del VS para generar el dataset tipado

    por eso analzia este link
    Accediendo a BD MySQL desde Visual Studio


    saludos

    ResponderEliminar
  19. Hola Leandro queria saber si me puedes ayudar en lo siguiente. Tengo un datagridView que lleno con un datarow, lo voy llenado fila por fila (es un detalle de un presupuesto),agrego y quito filas con eso no tengo problemas, ahora cuando quiero hacer una modificacion del detalle listo todo el detalle en el datagridview y me lista normal, tambien puedo quitar filas , pero al momento de agregar otra fila todo el contenido del gatagridview se borra. Como puedo hacer que no se borre. Agradesco mucho tu ayuda por anticipado. (Trabajo en c# aplicacion windows form)

    ResponderEliminar
  20. hola Nico

    no ahs revidado si en la logica de la aplicacion no haces algo que inicializa el datatable sin crear la copia previa de la lista a la cual debes agregar

    o sea cuando manipulas las datarow de seguro usas un datatable para contenerlo y vincularlo al grid, quizas no estes recuperando los datos previos por eso se pierde lo que has registrado

    saludos

    ResponderEliminar
  21. Hola leandro no se si me pudas ayudar en la enumeracion de cada fila traigo los datos de una consulta pero no me enura las filas

    ResponderEliminar
  22. hola jempdulintre

    no se si entendi lo que quieres lograr

    quieres enumeras las filas del grid?

    como se relaciona esto con el articulo?

    y que tiene que ver esta enumeracion con la accion de traer los datos? o es que esa enumeracion corresponde al id de los registors

    saludos

    ResponderEliminar
  23. Hola leandro , vi tu articulo en el foro de msdn , pero mejor te pregunto por medio de tu blog, como puedo adaptar tu código , a un procedimiento almacenado en cual debo de recibir un dato, porque baje el codigo y veo que dentro de la aplicacion haces referencia a la tabla de productos , como le haría yo para adaptarlo porque la verdad no pretendo hacerle una referencia a la tabla dentro de la aplicacion, no se si me puedas ayudar

    ResponderEliminar
  24. hola David

    no se si entendi la pregunta, o sea que uses un procedure o que pongas el query por el cual tomas los datos directo en el codigo no cambia la tecnica del articulo

    quizas usarias algo como ser

    using (SqlConnection cn = new SqlConnection(connstring)) {

    SqlCommand cm = new SqlCommand("NombreStoreProcedure", cn);
    cmd.CommandType = CommandType.StoredProcedure;

    cm.Parameters.AddWithValue("@codigo", tbCodigo.Text);

    DataTable dt = new DataTable();
    MySqlDataAdapter da = new MySqlDataAdapter(cm);
    da.Fill(dt);

    }

    para invocar a un procedure, pero despues el resto es igual

    saludos

    ResponderEliminar
  25. haa ok, 2 preguntas la primera puedo pasar por parametro lo que es txtCodigo , ya que estoy haciendo una clase dentro de la clase llenaria el datagridview y le mandaria por parametro lo que se escribidio en el txtcodigo se puede hacer eso ? , y lo que me tiene intrigado es porque creastes un dataset dentro de la aplicacion, se te hiso mas facil hacerlo por via podemos decirlo "grafica" que por medio de codigo

    ResponderEliminar
  26. hola David

    no recomiendo que en la clase cargues el datagridview, esta es responsabilidad de la presentacion, la clase deberia tomar datos simpel y devolver listas o datatable pero es en el form donde asignas el datasource del grid

    a la funcion de la clase puedes pasarle el textbox.Text como valor para filtrar la query, pero es el string que pasas no el control

    saludos

    ResponderEliminar
  27. Hola leandro mira esto tengo en la clase:

    public static DevolucionesYEnvios LlenarTanquesPendientesXCliente(int cliente)
    {

    con.Open();
    DevolucionesYEnvios devo = new DevolucionesYEnvios();


    cmd = con.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "SP_LeerTanquesNoDevueltos";
    cmd.Parameters.AddWithValue("@IdCliente", SqlDbType.Int).Value = cliente;


    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(devo,"vw_DevolucionTanques");

    con.Close();

    return devo;
    }

    #endregion

    y cuando presiono el contenido de una celda del datagridview que tengo llamado clientes tengo esto:

    private void dgCliente_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
    cont1 = Convert.ToInt32(dgCliente.CurrentRow.Cells["Clave_Cliente"].Value.ToString());


    DevolucionesYEnvios datos = Validaciones.LlenarTanquesPendientesXCliente(cont1);

    dgPendientes.AutoGenerateColumns = false;
    dgPendientes.DataSource = datos;
    dgPendientes.DataMember = "vw_DevolucionTanques";
    }

    el problema que tengo es que no me sale nada en el datagridview de Pendientes

    ResponderEliminar
  28. hola David

    veo que defines AutoGenerateColumns = false;
    pero ademas creas las columasn en timepo de diseño y asignas el DataPropertyName de esta para indciar con que campo mapea?

    has puesto un breakpoint en el codigo he inspeccionado el dataset para ver si se cargo con registros

    saludos

    ResponderEliminar
  29. De hecho hice lo mismo que tu hicistes creo el dataset en la aplicacion, solo adapte el codigo que tu pusistes a lo que necesito no cambie nada !!

    ResponderEliminar
  30. El StoredProcedure me trai lo siguiente:

    Numero_Factura = varchar
    Codigo = varchar
    Tipo = varchar
    Medida = varchar
    Fecha_Servicio = datetime
    Fecha_Recibido = datetime

    ResponderEliminar
  31. Ahora ya me salen vacios los campos !! :(

    ResponderEliminar
  32. hola David

    pro sino carga el datatable entonces claramente alli esta el problema

    deberias validar si el cliente que asignas tiene registros como para devolver

    ademas si lanzas el procedure directo desde la tool de sql server mangement studio este funciona correctamente? porque quizas el problema lo tenga el SP

    saludos

    ResponderEliminar
  33. Contestando la pregunta si envia algo !! ya provee el procedimiento en el sql server y de hecho envia datos

    ResponderEliminar
  34. Utilizo el mismo codigo que tu !!! ahora si como se dice hice un copy y paste no mas

    ResponderEliminar
  35. Sabes leandro acabo de crear un xml para que envie lo que tiene el dataset

    cmd = con.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "SP_LeerTanquesNoDevueltos";
    cmd.Parameters.AddWithValue("@IdCliente", SqlDbType.Int).Value = cliente;

    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(devo,"DevolucionTanques");
    devo.WriteXml("C://dump.xml");


    con.Close();

    return devo;

    y me salen los campos que quiero y ademas cree otro archivo en el cellcontentclick del otro datagridview y tambien me salen los campos, la verdad no se que sea , y la creacion de los xml para saber si esta regresando algo

    ResponderEliminar
  36. hola David

    entonces quiere decir que si se cargan los datos, es mas no necesitas del xml, podrias suar el debug

    DataSet Visualizer

    que pasa si en lugar de un dataset devuelves un datatable simple? solo para reducir problemas o sea hacer
    ds.Fill(dt)

    como esto quizas lleve algo de texto no prefieres que se siga el tema en el foro msdn de c#, me parece un lugar mas adecuado para escribir

    saludos

    ResponderEliminar
  37. hola leandro si en la parte del codigo donde envias la fila a un list<>

    tambien le asignas el row a un dataTable algo como esto:

    foreach (DataGridViewRow row in dgvSeleccion.Rows)
    {
    DataGridViewCheckBoxCell cellSelecion = row.Cells["SeleccionSel"] as DataGridViewCheckBoxCell;

    if (Convert.ToBoolean(cellSelecion.Value))
    {
    rowSelected.Add(row);
    DtablePedido.Rows.Add(row); //<----adiciono mejor a un dataTable
    }
    }

    lo que necesito es para llevarlo a un datatable para poder editarlo y /o borrar filas

    Gracias por tu pronta respuesta

    ResponderEliminar
  38. hola greg_dorian

    no entendi, cual seria el objetivo de agregar al datatable?

    porque esa lista que uso es algo temporal para determinar la seleccion, pero luego se recorre para realizar las operaciones de eliminar, porque dentro de un bloque for no puede eliminar el item que estas recorriendo

    saludos

    ResponderEliminar
  39. Hola Leandro Gracias por responder, pues la idea es que tengo 2 datagrids como tu lo usas pero en el segundo poder realizar edicion de alguno de los campos, por decir algo cambiar la cantidad o el "precio" del datagrid dgvSeleccion, tambien que el dgvSeleccion pueda consultar y agregarle mas registros... y luego de esto llevarlo o grabarlo a base de datos

    ResponderEliminar
  40. otra aclaracion en el evento btnQuitar de hecho tienes un DataTable y armas programaticamente la fila del DataTable para poder eliminar el registro de la grilla de selecciones

    ResponderEliminar
  41. hola greg

    no veo cual es el problema, puedes definir uan columan editable en donde el usuario pueda ingresar un valor para esa fila

    despues solo haces un loop por cada row para persistirlo

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/3c2637db-0d8d-4a70-95c8-ee6165ee821d

    saludos

    ResponderEliminar
  42. hola Leandro, si eso lo que tu dices de que pueda editar el datagrid y editar la columna o la celda, pero yo me refiero en el caso que vuelvas a recuperar la informacion para (modo de edicion) tienes que volver a cargar el datagrid dgvSeleccion con los datos ya seleccionados y que aun falten pedidos por selecionar para poderlos agregar... necesariamente se debe utilizar DataTables... o que otra medida se podria utilizar??

    ResponderEliminar
  43. hola greg

    el datatalbe no es obligatorip, puedes suar cualquier otro tipo de coleccion, si usas List<> listas genericas, algun otro son igual de validas

    este es solo un ejemplo que uso datatable como medio para cargar datos, pero si usas otro tipo de lista castea lo que pongas en session a este tipo y lo trabajas

    saludos

    ResponderEliminar
  44. Buen día!!
    Estoy haciendo un programa en visual Studio 2010 Y lleno una grilla de la siguiente manera
    cnn.Open();
    using (DB2DataReader rdr = cmd.ExecuteReader())
    {
    BindingSource bnd = new BindingSource();

    DataTable tbl = new DataTable();
    tbl.Load(rdr);

    tbl.Columns.Add(new DataColumn("Eliminar usuario", typeof(bool)));
    bnd.DataSource = tbl;
    dgv.DataSource = bnd;

    }
    cnn.Close();

    la intento recorrer e imprimir en consola el resultado de los seleccionados de la siguiente manera

    foreach (DataGridViewRow row in dgv.Rows) {

    if ((dgv.Columns[2].ValueType.Equals(typeof(bool))) == true)
    {
    Console.Write(dgv.Columns[0]);
    }

    pero no consigo imprimir y no sé qué es lo que hago mal si me pudieran iluminar un poco please!! se los agradecería. saludos !!

    ResponderEliminar
  45. hola:
    tengo problemas con la primer linea de codigo a que se puede deber?? gracias

    ResponderEliminar
  46. hola Graciela

    si vas a cargar un datatable porque no usas el DB2DataAdapter

    DB2DataAdapter da = new DB2DataAdapter(cmd);
    DataTable tbl = new DataTable();
    da.Fill(tbl);

    dgv.DataSource = tbl;

    saludos

    ResponderEliminar
  47. hola Alejandro

    pero cual seria el problema ?

    deberias especificar algo mas la problematica

    saludos

    ResponderEliminar
  48. Gracias por contestar es solo que mi problema no es llenar la tabla, ésta si se llena bien y la columna de "selección" la uso para verificar las filas que deseo eliminar solo que no sé muy bien como recorrer la tabla para obtener las chekeadas intenté con el for each pero aun no tengo éxito.

    ResponderEliminar
  49. hola Graciela

    tomado la idea del articulo

    List rowEliminar = new List();

    foreach (DataGridViewRow row in dgvProductos.Rows)
    {

    DataGridViewCheckBoxCell cellSelecion = row.Cells["Seleccion"] as DataGridViewCheckBoxCell;

    if (Convert.ToBoolean(cellSelecion.Value))
    {
    rowEliminar.Add(row);
    }
    }

    foreach(DataGridViewRow row in rowEliminar){
    dgvProductos.Rows.Remove(row);
    }

    para recorer las filas que estan marcadas, pero ojo que alli mismo no vas a poder eliminarlas, vas a necesitar de una lsita auxiliar
    entonces si recorriendo al lista auxiliar puede eliminar del grid

    saludos

    ResponderEliminar
  50. Hola Leandro regreso a dar lata. Mi pregunta no tiene que ver con el tema, pero espero me puedas ayudar, he creado un proyecto de instalación pero no sé qué opciones marcar como requisitos previos, seleccione el framework4 y SAP para crystal incluí los runtime de crystal, pero no sé, si es del todo necesario marcar las opciones pues es tardado estar descargando todo en otra pc y además mi aplicación es detectada como de baja reputación por el avast, existe una forma de mejorar su reputación??

    ResponderEliminar
  51. hola Graciela

    la verdad no sabria decirte que parametros toma el avast para definir una reputacion

    quizas el hecho de conectarse a internet para descargar sea el motivo de baja reputacion

    no has evaluado ver la forma de incluir los redistribuibles por separado de la instalacion, para que se instalen de forma manul y asi no descargarlo
    o al menso intentar hacerlo para ver si es esto lo que genera el problema de reputacion

    saludos

    ResponderEliminar
  52. V. A.
    Estimado Leandro,
    Necesito hacer lo siguiente, no se si me puedas ayudar, quiero usar dos datagridview, mientras escribo en el campo de uno, el otro se posesione debajo del otro, osea debajo de la fila donde estoy escribiendo, solo eso necesito.
    Gracias.

    ResponderEliminar
  53. hola V:A.

    esto que planteas no se puede lograr, no al menos con el datagridview, quizas si usas algun control de terceros que permitan desplegar un nuevo grid asociado a un row

    pero sera con un componente de terceros que lo podrias lograr

    saludos

    ResponderEliminar
  54. quiero enviar los datos de los checkbox seleccionados a otra pantalla en diferentes textbox como puedo hacer esto??

    ResponderEliminar
  55. los textbox los tengo en diferentes paneles

    ResponderEliminar
  56. hola alex

    pero que tipo de desarollo estas realizando porque mencioans el gridview, o sea es un desarrollo web ?

    saludos

    ResponderEliminar
  57. si Leandro es web.ya solucione eso lo hice con listas ahora mi problema es como sacar los objetos eh ingresarlos a los textbox un ejemplo si mi lista trae 2 objetos que se llenen mis 2 textbox ejemplo los llame txt1 ,txt2 estos están en paneles diferentes gracias espero me puedas ayudar

    ResponderEliminar
  58. y si trae 5 objetos que se llenen mis 5 textbox

    ResponderEliminar
  59. hola alex

    por paneles te refieres a controles Panel? si es podrias acceder directo a los controles por su nombre

    o es que estos controles estan dentro del gridview, porque si es asi deberias usar el FindControl() para localizar los textbox

    saludos

    ResponderEliminar
  60. List list = new List();
    if (Session["ruta"] != null)
    list = (Session["ruta"] as List);

    aquí esta mi código donde estoy obteniendo la lista con sus objetos
    ahora mi problema es sacar los objetos y meterlos a los textbox
    como puedo hacerle

    ResponderEliminar
  61. List list = new List();
    if (Session["ruta"] != null)
    {
    list = (Session["ruta"] as List);

    ResponderEliminar
  62. list list = new list();
    if (sesión["Ruta"]!= null)
    {
    list=(sesión["Ruta"]as list);

    ResponderEliminar
  63. gracias ya encontré la solución quisiera preguntarte si conoces un método donde al darle clic a un botón me agregue un panel nuevo
    gracias

    ResponderEliminar
  64. se podría que dentro de ese panel lleve un textbox un lavel y una tabla HTML gracias espero tu respuesta

    ResponderEliminar
  65. jaja ya me surjio otra duda utilizo mi método para cuando de clic en el botón me abra un nuevo panel el problema que solo me lo abre una sola vez si le sigo dando clic ya no me abre mas paneles por que este es mi código
    Panel nuevo = new Panel();
    Label etiqueta = new Label();
    etiqueta.Text = "nuevo";
    nuevo.Controls.Add(etiqueta);
    Paneldg1.Controls.Add(nuevo);

    ResponderEliminar
  66. hola alex

    no es que no se abre, sino que se estan ensimando uno sobre otro

    agrega una simple variante y veras esto que comento

    private index=0;

    private void button1_Click(..)
    {
    Panel nuevo = new Panel();
    Label etiqueta = new Label();
    etiqueta.Text = string.Foramt("nuevo {0}", index);
    nuevo.Controls.Add(etiqueta);
    Paneldg1.Controls.Add(nuevo);

    index++;
    }

    veras como cambia de contenido, pero estas agregando paneles uno arriba de otro, cuando deberias eliminar las instancias anteriores usando un
    Panel.Controls.Clear()

    saludos

    ResponderEliminar
  67. gracias otra consulta como hago para agregar una tabla HTML
    ahí dentro del panel
    para cuando de clic en el botón me agregue el textbox ,label y una tabla HTML
    agradezco tus respuestas
    espero me puedas ayudar con esta

    ResponderEliminar
  68. hola alex

    podrias usar la clase

    HtmlTable (Clase)

    para generar la tabla desde codigo
    o sino podrias usar un GridView, el cual tambien genera una tabla

    saludos

    ResponderEliminar
  69. Hola Leandro, Buenos días, me gustaría saber si existe alguna forma de unir guardar una serie de listas de objetos en un mismo datagridView. Por ejemplo, cuando lleno un datagridView. DataSource = BindingList luego que lleno el datagrid de personas es muy sencillo obtener los datos de la fila, pero necesito como llenar el mismo datagrid con un BindingList de personas, uno de casas, etc, Por eso tenía la duda si se pueden guardar varias bindinglist en un mismo datagrid para obtener los objetos más rápidamente

    ResponderEliminar
  70. hola Erick

    si las listas tienen la misma cantidad de campos y los tipos de cada uno de estos son identicos podrias unirlos en una sola lista y mostrarlo en el grid

    podrias tomar una lista de base y usar el AddRange() para agregar otra a la existente, para esto mantiene una variable a nivel del form la cual usaras para ir agregando las otras listas y al final asignas esta al grid

    si los datos que vas a mostrar difieren entonces no se podra lograr

    saludos

    ResponderEliminar
  71. Hola Leandro, tengo una duda si paso unos 3 productos a la otra grilla y tubiera un campo extra llamado Stock, como aria para registrar cada una de las filas en una base de datos en una tabla de ventas por ejemplo, y actualizar el campo stock cada uno de los productos restandole la cantidad vendida... espero me puedan ayudar

    ResponderEliminar
  72. hola Carlos

    bueno responder a esa pregunta seria un poco largo, pero aqui

    http://social.msdn.microsoft.com/Forums/es-ES/47cfd60c-5e77-4e23-915e-b995e7a57ec8/descontar-stock

    http://social.msdn.microsoft.com/Forums/es-ES/375813b0-8e92-4361-9f07-e726e00c2c94/ejemplo-de-un-proyecto-tipo-stock

    http://social.msdn.microsoft.com/Forums/es-ES/5c60f2a0-b43b-4a5f-bbe4-e85ff6e8d598/actualizar-el-stock-en-la-capa-negocio

    se plantean temas relacionados con stock, como veras si tienes el producto o articulo al cual descontar podrias realziar un UPDATE para actualizar los datos

    saludos

    ResponderEliminar
  73. Cheque los link que pusistes y si hablan de actualizar el stock bueno creo que eso nos es problema igual se puenden usar triger para ya no codificar eso, el problema esta en que si tengo varios productos en un grlla no se registra cada uno de ellos si no que agarra el de la primera fila y almacena los datos que estan en esa fila y actualiza solo ese producto, como aria para registrar cada uno de los productos que estan en una grilla llamada lista de productos a vender por ejemplo.

    ResponderEliminar
  74. hola Carlos

    pero estas realizando un loop por cada row del grid para aplicar los cambios?
    en los links sino vi mal se aplica algo como esto recorriendo las rows y actualizando el registro con la entidad que define

    saludos

    ResponderEliminar
  75. hola leandro pues si eso trato de hacer pongo todo ese procedimiento en un foreach pero solo hagara el primer elemento de la lista este es mi codigo usando conexiones ADO

    //Registramos en la tabla ventas
    rVenta.Insert(int.Parse(cboCliente.SelectedValue.ToString()), int.Parse(cboEmpleado.SelectedValue.ToString()), cboTipoDoc.Text, txtNroDoc.Text,
    DateTime.Parse(txtFecha.Text), float.Parse(txtTotal.Text));
    //Obtenemos el maximo idVenta
    int codVenta = int.Parse(rVenta.MaxIDVentas().ToString());
    //Recorremos la lista de productos a vender
    foreach (DataGridViewRow fila in dgvLista.Rows)
    {
    //Comenzamos a registrar en la tabla DetalleVenta
    rDetalleV.Insert(codVenta, int.Parse(fila.Cells[0].Value.ToString()), float.Parse(fila.Cells[4].Value.ToString()), float.Parse(fila.Cells[5].Value.ToString()),
    int.Parse(fila.Cells[6].Value.ToString()), float.Parse(fila.Cells[7].Value.ToString()), float.Parse(fila.Cells[8].Value.ToString()));
    //Obtenemos el stock del producto y restamos la cantidad comprada
    //int stock = int.Parse(dgvProductos.CurrentRow.Cells[5].Value.ToString()) -
    // int.Parse(int.Parse(fila.Cells[5].Value.ToString()).ToString());
    int stock = int.Parse(productosTableAdapter.MaxStock(int.Parse(fila.Cells[0].Value.ToString())).ToString()) - int.Parse(int.Parse(fila.Cells[6].Value.ToString()).ToString());
    //Actualizamos el campo stock
    productosTableAdapter.ActualizarStock(stock, int.Parse(fila.Cells[0].Value.ToString()));
    //Limpiamos y volvemos a cargar los productos
    dsGeneral.Productos.Clear();
    productosTableAdapter.Fill(dsGeneral.Productos);

    ResponderEliminar
  76. hola leandro queria descargar el archivo y me sale un mensaje de skydrive diciendome que el elemento ya no esta disponible o no exista...

    ResponderEliminar
  77. hola Maicol8k

    ya esta actualizado los link del codigo

    saludos

    ResponderEliminar
  78. Necesito por favor que me orientes...
    Tengo que hacer un proyecto sobre una tienda de ropa, que con un boton me muestre un inventario(no puedo usar ninguna base de datos solo visual studio C#)con caracteristicas de las prendas y la cantidad existente, para que cuando se haga una venta la cantidad existente en el inventario disminuya.
    Te Agradecería mucho si me ayudas ya que no manejo bien c# y este proyecto es muy importante.

    ResponderEliminar
  79. hola Nohelia

    pero si necesitas conservar los datos del inventario donde vas a persistir la informacion ?

    los datos de prendas, sus cantidades, o sea el stock, de donde obtendras la informacion? lo pregunto porque comentas que no puedes usar una db

    sera que vas a usar un objeto que mantienes en memoria y serializas a xml en un archivo para persistir los datos

    saludos

    ResponderEliminar
  80. Hola Leandro,


    Necesito recorrer un datagridview el cual es cargado con datos de excel. Luego mostrar en un texbox la cantidad de registros que posea el archivo. Lenguaje c#. Adicional a esto poder agregar un nuevo registro o eliminarlo o actalizarlo.

    De antemano muchas gracias..

    ResponderEliminar
  81. hola Camilo

    el acceso a excel lo realizas por medio de ado.net ?

    porque si es asi podrias eejcutar queries sql para calcular u operar con los datos del excel, como si fuera una db

    Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

    saludos

    ResponderEliminar
  82. Muchas gracias,

    Si claro estoy con Ado mas o menos con una cadena de conexión.

    connectionString cadena = @ "Provider = Microsoft.Jet.
    OLEDB.4.0; origen de datos = Book1.xls; ampliada
    Propiedades = "" Excel 8.0; HDR = YES; "" ";

    Necesito ahora poder recorrerlo para analizar cuantos registros tiene, luego mostrar esa cantidad en un textbox. Actualmente cuento con un fileUpload, un boton que me muestra el archivo y un gridview que muestra la data o información del excel.

    Gracias por tu ayuda..

    ResponderEliminar
  83. hola Camilo

    pero no se necesita recorrer, si estas realizando un SELECT contra el excel, carga un datatable y usa

    int cant = dt.Rows.Count;

    listo ahi tiene la cantidad

    saludos

    ResponderEliminar
  84. Leandro tengo una pregunta, quiero automatizar un textbox para utilizarlo como numero de registro. cada vez que guarde pase automaticamente al siguiente numero.

    ResponderEliminar
  85. hola Gustavo

    pero usas algun base de datos ? porque no lo has mencionado

    si la usas podrias implementar el MAX() en el SELECT para obtener el valor del nro mas grande he ir sumando uno

    analiza la implementacion del Max() que utilizo aqui

    [ADO.NET] – Parte 5 - Ejemplos Simples – Operaciones CRUD

    saludos

    ResponderEliminar
  86. Hola Leandro, estoy utilizando tu tecnica del ejemplo pero para recuperar los datos para un formulario maestro-detalle. Todo lo tengo en capas como tu ejemplo de facturas N-Capas pero no me funciona, me podrian enviar alguna pagina donde se exista algun ejemplo.

    gracias

    ResponderEliminar
  87. hola Richard

    pero que seria lo que no funciona ?

    obtienes algun error en concreto

    saludos

    ResponderEliminar
  88. dtoProductos.ProductosRow productoRow = datos.Productos.NewProductosRow();

    Object reference not set to an instance of an object.

    me pide que instansie el objeto

    ResponderEliminar
  89. hola E. Flores

    pero cuando falla cual es el objeto que esta en null?

    puede ser "datos" o quizas "Productos", al fallar si pasas el mouse por sobre estos puedes ver cual esta en nulo?

    saludos

    ResponderEliminar
  90. Leandro podrias responderme a la duda de msd por favor? http://social.msdn.microsoft.com/Forums/sqlserver/es-ES/1a7d3894-83b3-4fcb-97a3-800b44445e1c/pasar-datos-de-datagridview-secundario-a-datagridviewprincipal?forum=vcses

    ResponderEliminar
  91. Perdonar alguien podria explicarme el origen de estos conceptos?

    dtoProductos

    ProductoDAL.ProductosGetAll()

    .ProductosRow

    datos.Productos.NewProductosRow()

    Son lo UNICO que me falta por entender

    y si contienen codigo cual seria ese codigo

    ResponderEliminar
  92. hola Mikel

    lo que veas como DAL hace referencia a Data Access Layer, o sea es la capa de acceso a datos encargada de usar ado.net para recuperar datos de la db

    en este ejemplo utilice dataset tipados, por es veras un archivo de nombre dtoProductos.xsd, alli esta la definicion

    saludos

    ResponderEliminar
  93. vale gracias por aclararlo. podria hacerse de alguna manera sin tener que derivar a objetos externos? quiero decir sin dataset tipado y con el acceso a datos en el mismo formulario y simple.

    Siendo una base de datos access del 2010.

    Gracias de antemano

    ResponderEliminar
  94. hola Mikel

    si claro, pero alli no aplicarias las buenas practicas para separar las responsabilidades

    podrias poner ado.net directo en el evento del form

    saludos

    ResponderEliminar
  95. muy interesantes esos tutoriales pero ... estoy aciendo una aplicacion y espero que me puedas a yudar si estas a tu alcance..

    estoy haciendo una aplicacion donde boy insertando registro a un datagrid desde un texboox pero quiero que al momento de insertar que si esta repetido que me lo actualice es en c# y no requiere base de datos

    ResponderEliminar
  96. hola

    podrias ayudarte con linq para localizar que row tiene un valor igual al que estas queriendo insertar

    harias algo como ser

    DataGridViewRow row = DataGridView1.Rows.Cast().Where(x=> Convert.ToString(x.Cells["nombrecol"].Value) == TextBox1.Text).FirstOrDefault();

    if(row == null){
    //si es null entonces no encontr la row por lo que puedes insertar el valor
    } else{
    //si la encontrol la actualizas
    row.Cells["nombrecol2"].Value = TextBox2.Text;
    }

    saludos

    ResponderEliminar
  97. Hola Leandro.

    Fijate que tu tutorial me sirvio mucho, segui todo al pie de la letra sin embargo no me jala los datos de mi tabla cuando cargo el datagridView, y me marca error en esta linea:
    using (OleDbConnection conexion = new OleDbConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) {

    especificamente en el ConfigurationManager, ya revise las bibliotecas y estan bien, que me recomiendas?

    ResponderEliminar
  98. hola Samuel

    lastima que no mencionas cual es el mensaje de error que recibes, pero podria deberse a que tienes que agregar la referencia y declarar el using de System.Configuration

    sin la referencia en el proyecto a esta librerias la clase ConfigurationManager no te dejara compilar

    Tambien valida que tengas en el App.config la definicion de la key de nombre "default" del connection string

    saludos

    ResponderEliminar
  99. Logre resolver ese inconveniente y ya me pasa de uno a otro, sin embargo a la hora de regresar la informacion, tiene que cargar los datos enlazados, pero es necesario que guarde la base de datos en el programa? porque mi base de datos estaría en un servidor, seria diferente? gracias por tu ayuda.

    ResponderEliminar
  100. hola Samuel

    la base de datos puede estar donde quieras, si la db esta en un servidor y te cnectas remoto solo tienes que definir esto en el .config y listo

    por supuesto en el connectionstring deberias indicar el nombre de la db a la cual te vas a conectar
    saludos

    ResponderEliminar
  101. hola hice un procedimiento en mi data set mi duda es como mandar llamar ese procedimiento.

    ResponderEliminar
  102. Hola, buen día Leandro estoy adaptando tu codigo para un proyecto similar, el problema que tengo es que cuando quiero pasar los datos del grid(A) al grid(B) me sale este error
    {"Rows cannot be programmatically removed unless the DataGridView is data-bound to an IBindingList that supports change notification and allows deletion."}.
    Te comento que cuando obtengo los datos del grid(A)lo hago de la siguiente manera
    gridempleados.DataSource = NuevaReuniondal.Obtenerempleados();
    gridempleados.Columns[2].HeaderText = "Nombre";
    gridempleados.Columns[3].HeaderText = "Puesto";

    ResponderEliminar
  103. hola Marco

    si asignas el DataSource al grid no podras usar el Remove() directo contra el grid
    sino que los datos deberia quitarlo de la lista de datos

    var lista = NuevaReuniondal.Obtenerempleados();
    de esa lista es donde debes remover y luego volver asignar el datasource, o sea remueves sobre el origen de datos y no sobre el control

    se que existe una implementacion con el IBindingList en donde al eliminar del control impacta en la lista, pero la verdad es que nunca use esa interfaz

    saludos

    ResponderEliminar
  104. Hola Leandro un saludo, gracias por el aporte; tengo una inquietud cómo resolviste este problema, por que te comento que yo lo continúo teniendo: No se pueden agregar filas mediante programación a la colección de filas de DataGridView cuando el control está enlazado a datos.
    , trabajo con un gestor que es el sql server cualquier ayuda es bienvenida te lo agradezco de ante mano saludos

    ResponderEliminar
  105. Hola leandro, tu ejemplo esta muy bueno quise hacer lo mismo con un TruDbGrid pero es muy complejo. Mas una consulta yo enlazo el datagrid a un StoreProcedure, selecciono las filas que quiero y las paso al segundo grid que esta desconectado, mi pregunta es yo en ese storeProcedure tengo un campo vacio que quiero editar, para ser mas exacto ese StoreProceduro esta armado con dos tablas Documento, DocumentoDetalle, lo que quiero hacer es que esos campos seleccionados en grid desconectado los quiero editar, el campo vacio lo quiero llenar con un numero de documento que voy crear, apreciaria mucho alguna idea

    ResponderEliminar
  106. hola Kallpa

    la verda dnunca use TruDbGrid, pero si fuera similar al DataGridView podrias recorrer las rows del grid y operar con esa informacion invocando al procedure pasando los parametros

    imagino ado.net conoces, no?
    conoces como invocar un procedure usando usando parametro?
    algo que no mencioans es que db utilizas

    saludos

    ResponderEliminar
  107. Hola Leandro,

    Utilizo un BD en sql, en tu ejemplo utilizo mi store procedure para llenar el primero DataGridView,(Lo invoco como un BindinSource) lo que quiero hacer es editar los campos seleccionados en el segundo DataGridView, hace mucho que no programaba y estoy retomando las riendas(Casi 9 años)

    ResponderEliminar
  108. hola Kallpa

    cargas por medio de un procedure y el BindinSource un grid, pero el segundo como lo vinculas a los datos?

    quizas debas usar el evento CellEndEdit del grid y alli lanzar la operacion de actualizacion

    saludos

    ResponderEliminar
  109. Hola Leandro
    Tengo este error

    No se pudo encontrar la columna denominada IDServicioList.
    Nombre del parámetro: columnName

    A que se debe

    ResponderEliminar
  110. Hola Leandro he revisado tu publicacion y tengo una consulta nose si me podras ayudar he tratado de adptar tu ejemplo sin exito, ya que si bien es cierto dentro de tu ejemplo veo que pasa de un datagridview de uno a otro con los botones hasta ahi todo bien pero no lo guarda en la bd para mayor detalle adjunto un ejemplo funcional de lo que necesito pero usa dataset tipeados como tu ejemplo y no manejo mucho ese tema lo hago con procedimientos almacenados y funciones, el ejemplo
    https://www.dropbox.com/s/vbunp4wz6wnzm05/Usuarios%20y%20Permisos.rar?dl=0
    me gustaria que me ayudaras con el siguiente ejemplo pero hacerlo con funciones y procedimientos almacenados, muchas gracias. Saludos cordiales

    ResponderEliminar
    Respuestas
    1. hola
      Pero cual seria la duda? guardarlos en la db si conoces ado.net es simplemente ejecutar INSERT
      No necesitas de dataset para actualizar los datos, simplemente tomas los datos que pasas de un lado al otro y los asignas a los parametros que defines en el procedure
      saludos

      Eliminar
  111. Hola, quiero realizar lo mismo, solo que los checkbox donde seleccionaría está en otro Form (Form1) y ademas todos los que selecciono pasarlos Form2 en un datagridview

    ResponderEliminar
    Respuestas
    1. hola
      cual seria al problema? podrias usar la tecnica de comunicar forms
      Comunicar Formularios
      para pasar datos de un form a otro
      saludos

      Eliminar
  112. Hola Leandro Tuttini, es posible utilizar este código para pasar registros de un sistema a otro compartiendo la misma bd online??? P/EJ: el admin asigna una tarea al usuario 1, otra distinta al usuario 2, pero ninguno de los dos usuarios sabe que tarea tiene el otro....desde ya gracias!

    ResponderEliminar
  113. Hola Leandro tuttini, oye tengo un problema, lo que pasa es que implemente tu código de obtener el dato con el checkbox dentro del datagridview, pero yo no intento pasarlo a otro gridview, lo quiero pasar todos a un texbox o aun label, cuando lo intento solo me aparece el ultimo valor, te agradecería mucho tu ayuda

    ResponderEliminar
  114. hola leandro ,tengo un problema estoy trabajando con listas genericas,y quiero pasar data de una grilla a otra en si dos , cuando paso d izquierda a derecha si se puede pero de derecha a izquierd me vota error ,dice que esta enlazada a datos ,espero me respoindas

    ResponderEliminar
    Respuestas
    1. hola
      Pero la que esta enlazada a datos es el control grid no la lista, entiendo que si has asignado el DataSource del grid con List<> haya problemas, quizas debas evaluar usar el
      BindingList Class
      saludos

      Eliminar
  115. Hola Leandro:

    Estoy iniciándome con el tema de LINQ, específicamente LINQ to SQL. El problema que tengo es que no me está actualizando información en mi base de datos. Tengo el siguiente código:

    dbFin700DataContext dbFin700 = new dbFin700DataContext(Settings.Default.cnxFIN700Prod);

    Table tb_RutNoDicom = dbFin700.GetTable();

    var consulta = from source in tb_RutNoDicom
    where source.RutAceptante == "11425839-3"
    select source;

    Ocf_RutNoDicom fila = consulta.FirstOrDefault();

    if (fila != null)
    {
    fila.RutAceptante = "0011425839-3";
    fila.RutAlumno = "0018471656-9";
    dbFin700.SubmitChanges();
    }

    Dónde "Settings.Default.cnxFIN700Prod" es una conexión a una base de datos real. Es decir estoy trabajando sobre datos reales en producción. el asunto es que el "SubmitChanges()" no actualiza los datos. He consultado por internet, viendo tutoriales al respecto, y aparentemente el código que te presento estaría de acuerdo con lo que he visto.

    Como información adicional te puedo decir que la tabla en cuestión no tiene Primary Key. y que el registro que rescato se encuentra 2 veces en la tabla.

    Ojala puedas orientarme a como solucionar esto.

    Atento a tu respuesta.

    OSCAR CALDERON

    ResponderEliminar
  116. Hola Leandro, estoy viendo el codigo que funciona pero hay algo que no me queda claro, dtoProductos que es???? ya que no logro saber ni que representa

    ResponderEliminar
    Respuestas
    1. hola
      El dtoProductos es un dataset tipado, veras en el proyecto que hay un archivo de extension .xsd, bueno ese es el dataset que define dentro un datatable tambine tipado ya que define las columnas en diseño
      saludos

      Eliminar