personalizar datagridview1 custom cellborderstyle c# .net winforms datagridview

datagridview1 - material design datagridview c#



Obtener DataTable de DataGridView (3)

¿Qué tal esto?

DataView dv = (DataView)(dataGridView1.DataSource); dt = dv.ToTable();

¡Funciona para todos los casos!

Tengo un formulario que es un CRUD, este formulario puede administrar cualquier información de muchas tablas, si una tabla tiene claves externas, el CRUD encontró las tablas y columnas para las columnas respectivas de la tabla actual, por lo que en DataGridView puede mostrar columnas como CheckBox, TextBox o ComboBox

Hago todo esto ANTES de que DataGridView esté lleno de datos, por lo que no puedo usar esto:

dataGridView1.DataSource = dtCurrent;

Necesito algo como esto:

dtCurrent = dataGridView1.DataSource;

Pero solo da un nulo

He intentado con ExtensionMethod a DataGridView:

public static DataTable ToDataTable(this DataGridView dataGridView, string tableName) { DataGridView dgv = dataGridView; DataTable table = new DataTable(tableName); // Crea las columnas for (int iCol = 0; iCol < dgv.Columns.Count; iCol++) { table.Columns.Add(dgv.Columns[iCol].Name); } /** * THIS DOES NOT WORK */ // Agrega las filas /*for (int i = 0; i < dgv.Rows.Count; i++) { // Obtiene el DataBound de la fila y copia los valores de la fila DataRowView boundRow = (DataRowView)dgv.Rows[i].DataBoundItem; var cells = new object[boundRow.Row.ItemArray.Length]; for (int iCol = 0; iCol < boundRow.Row.ItemArray.Length; iCol++) { cells[iCol] = boundRow.Row.ItemArray[iCol]; } // Agrega la fila clonada table.Rows.Add(cells); }*/ /* THIS WORKS BUT... */ foreach (DataGridViewRow row in dgv.Rows) { DataRow datarw = table.NewRow(); for (int iCol = 0; iCol < dgv.Columns.Count; iCol++) { datarw[iCol] = row.Cells[iCol].Value; } table.Rows.Add(datarw); } return table; }

Yo suelo:

dtCurrent = dataGridView1.ToDataTable(dtCurrent.TableName);

El código no funciona cuando:

int affectedUpdates = dAdapter.Update(dtCurrent);

Recibo una excepción sobre los valores duplicados (traducido del español):

Los cambios solicitados en la tabla no tuvieron éxito porque crearían valores duplicados en el índice, la clave principal o la relación. Cambie los datos en el campo o los campos que contienen datos duplicados, elimine el índice o redefina el índice para permitir entradas duplicadas y vuelva a intentarlo.

Solo necesito actualizar los cambios en DataGridView usando DataTable


Si necesita una referencia al origen de DataTable real, intente esto

((DataRowView)DataGridView1.Rows[0].DataBoundItem).DataView.Table

no te olvides de procesar los errores.


alternativamente, esto puede ayudar a convertir datagrigview a datatable.

Dim dt As New DataTable dt = (DirectCast(DataGridView1.DataSource, DataTable))

hacer un casting directo en datagridview para datatable puede obtener el resultado final.