从DataGridView获取DataTable

ttt*_*ony 8 .net c# datagridview winforms

我有一个表单是CRUD,这个表单可以管理来自许多表的任何数据,如果表有外键,CRUD找到当前表的各列的表和列,所以在DataGridView中可以将列显示为CheckBox, TextBox或ComboBox

在DataGridView填充数据之前我做了所有这些,所以我不能使用它:

dataGridView1.DataSource = dtCurrent;
Run Code Online (Sandbox Code Playgroud)

我需要这样的东西:

dtCurrent = dataGridView1.DataSource;
Run Code Online (Sandbox Code Playgroud)

但只要给出一个空值

我尝试使用ExtensionMethod到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;
} 
Run Code Online (Sandbox Code Playgroud)

我用:

dtCurrent = dataGridView1.ToDataTable(dtCurrent.TableName);
Run Code Online (Sandbox Code Playgroud)

代码在以下情况下不起作用:

int affectedUpdates = dAdapter.Update(dtCurrent);
Run Code Online (Sandbox Code Playgroud)

我得到一个关于重复值的异常(从西班牙语翻译):

对表所请求的更改未成功,因为它们将在索引,主键或关系中创建重复值.更改包含重复数据的字段或字段中的数据,删除索引或重新定义索引以允许重复条目,然后重试.

我只需要使用DataTable更新DataGridView中的更改

小智 6

或者,这可能有助于将datagrigview转换为数据表.

Dim dt As New DataTable
dt = (DirectCast(DataGridView1.DataSource, DataTable))
Run Code Online (Sandbox Code Playgroud)

在datagridview上直接转换为datatable可以获得最终结果.

  • 类似于上面的`DataTable dataTable =(DataTable)dataGridView1.DataSource;`为我工作.另见:http://stackoverflow.com/questions/6295161/how-to-build-a-datatable-from-a-datagridview (6认同)

Kak*_* Or 6

如果您需要对实际 DataTable 源的引用,请尝试此操作

 ((DataRowView)DataGridView1.Rows[0].DataBoundItem).DataView.Table 
Run Code Online (Sandbox Code Playgroud)

不要忘记处理错误。