从DataGridView获取DataTable

时间:2011-03-06 01:52:42

标签: c# .net winforms datagridview

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

我在DataGridView填充数据之前完成所有这些操作,所以我不能使用它:

dataGridView1.DataSource = dtCurrent;

我需要这样的东西:

dtCurrent = dataGridView1.DataSource;

但是只要给出一个空

我尝试将 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;
} 

我用:

dtCurrent = dataGridView1.ToDataTable(dtCurrent.TableName);

代码在以下情况下无效:

int affectedUpdates = dAdapter.Update(dtCurrent);

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

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

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

5 个答案:

答案 0 :(得分:5)

或者这可能有助于将datagridview转换为datatable。

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

对datagridview进行直接强制转换,以获取最终结果。

答案 1 :(得分:2)

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

 ((DataRowView)DataGridView1.Rows[0].DataBoundItem).DataView.Table 
不要忘记处理错误。

答案 2 :(得分:1)

我写了这样的话:

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;
    }
}

答案 3 :(得分:0)

 DataTable dt = new DataTable();
    dt = ((DataTable)DataGridView1.DataSource);

答案 4 :(得分:-2)

这个怎么样:

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

dt = dv.ToTable();

适用于所有情况!