C# 从DataGridView获取DataTable
我有一个表单是CRUD,这个表单可以管理来自多个表的任何数据,如果一个表有外键,CRUD会找到当前表中相应列的表和列,因此在DataGridView中可以将列显示为复选框、文本框或组合框 我在DataGridView中填充数据之前执行了所有这些操作,因此我不能使用:C# 从DataGridView获取DataTable,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我有一个表单是CRUD,这个表单可以管理来自多个表的任何数据,如果一个表有外键,CRUD会找到当前表中相应列的表和列,因此在DataGridView中可以将列显示为复选框、文本框或组合框 我在DataGridView中填充数据之前执行了所有这些操作,因此我不能使用: dataGridView1.DataSource = dtCurrent; 我需要这样的东西: dtCurrent = dataGridView1.DataSource; private DataTable GetDataGri
dataGridView1.DataSource = dtCurrent;
我需要这样的东西:
dtCurrent = dataGridView1.DataSource;
private DataTable GetDataGridViewAsDataTable(DataGridView _DataGridView)
{
try {
if (_DataGridView.ColumnCount == 0) return null;
DataTable dtSource = new DataTable();
//////create columns
foreach(DataGridViewColumn col in _DataGridView.Columns) {
if (col.ValueType == null) dtSource.Columns.Add(col.Name, typeof(string));
else dtSource.Columns.Add(col.Name, col.ValueType);
dtSource.Columns[col.Name].Caption = col.HeaderText;
}
///////insert row data
foreach(DataGridViewRow row in _DataGridView.Rows) {
DataRow drNewRow = dtSource.NewRow();
foreach(DataColumn col in dtSource.Columns) {
drNewRow[col.ColumnName] = row.Cells[col.ColumnName].Value;
}
dtSource.Rows.Add(drNewRow);
}
return dtSource;
}
catch {
return null;
}
}
但只要给一个空值
我已尝试使用扩展方法对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;
}
在以下情况下,代码不起作用:
int affectedUpdates = dAdapter.Update(dtCurrent);
我得到一个关于重复值的异常(翻译自西班牙语):
请求对表进行的更改未成功,因为它们会在索引、主键或关系中创建重复的值。更改字段中的数据或包含重复数据的字段,删除索引,或重新定义索引以允许重复条目,然后重试。
我只需要使用DataTable更新DataGridView中的更改,或者这可能有助于将datagrigview转换为DataTable
Dim dt As New DataTable
dt = (DirectCast(DataGridView1.DataSource, DataTable))
在datagridview上对datatable执行直接强制转换可以获得最终结果。这是怎么回事:
DataView dv = (DataView)(dataGridView1.DataSource);
dt = dv.ToTable();
适用于所有情况 如果需要对实际数据表源的引用,请尝试以下操作
((DataRowView)DataGridView1.Rows[0].DataBoundItem).DataView.Table
别忘了处理错误。我写了如下内容:
dtCurrent = dataGridView1.DataSource;
private DataTable GetDataGridViewAsDataTable(DataGridView _DataGridView)
{
try {
if (_DataGridView.ColumnCount == 0) return null;
DataTable dtSource = new DataTable();
//////create columns
foreach(DataGridViewColumn col in _DataGridView.Columns) {
if (col.ValueType == null) dtSource.Columns.Add(col.Name, typeof(string));
else dtSource.Columns.Add(col.Name, col.ValueType);
dtSource.Columns[col.Name].Caption = col.HeaderText;
}
///////insert row data
foreach(DataGridViewRow row in _DataGridView.Rows) {
DataRow drNewRow = dtSource.NewRow();
foreach(DataColumn col in dtSource.Columns) {
drNewRow[col.ColumnName] = row.Cells[col.ColumnName].Value;
}
dtSource.Rows.Add(drNewRow);
}
return dtSource;
}
catch {
return null;
}
}
类似于上面的
DataTable DataTable=(DataTable)dataGridView1.DataSource代码>为我工作。另请参见:在C#中,var dt=new DataTable();dt=(DataTable)DataGridView1.DataSource;无法将DataTable转换为DataView。只需使用DataTable dt=(DataTable)(dataGridView1.DataSource);直接,不需要转换到DataView。From Review:嗨,请不要仅用源代码回答。试着提供一个关于你的解决方案如何工作的很好的描述。请参阅:。谢谢