Получить DataTable из DataGridView - PullRequest
6 голосов
/ 06 марта 2011

У меня есть одна форма, которая является 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);

Я получаю исключение в отношении дублированных значений (в переводе с испанского):

Изменения, запрошенные в таблице, не увенчались успехом, так как они создали бы повторяющиеся значения в индексе, первичном ключе или отношении. Измените данные в поле или полях, которые содержат повторяющиеся данные, удалите индекс или переопределите индекс, чтобы разрешить повторяющиеся записи, и повторите попытку.

Мне просто нужно обновить изменения в DataGridView, используя DataTable

Ответы [ 4 ]

5 голосов
/ 10 мая 2011

в качестве альтернативы это может помочь преобразовать представление данных в представление данных.

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

сделать прямое приведение в представление данных для представления данных можно получить окончательный результат.

2 голосов
/ 11 января 2016

Если вам нужна ссылка на фактический источник DataTable, попробуйте это

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

, не забудьте обработать ошибки.

1 голос
/ 18 марта 2018

Я написал что-то вроде этого:

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;
    }
}
0 голосов
/ 13 июня 2013

Что по этому поводу:

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

dt = dv.ToTable();

Работает на все случаи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...