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.