Скопируйте данные столбца из DataGridViewSelectedRowCollection - PullRequest
2 голосов
/ 16 июня 2011

У меня есть DataGridView, который связан с DataSet, возвращаемым SQL-запросом неизвестного во время разработки (ну, я знаю, что это за запросы, я просто не знаю, какой из них выбрал пользователь ).

Я разрешаю пользователю выбрать набор строк из таблицы и нажать кнопку ОК, а затем я хотел бы скопировать эти строки в новый DataGridView.

Наивно, я использовал код в виде:

DataGridView_New.DataSource = DataGridView_Old.SelectedRows

Это дает мне количество строк в моем новом DataGridView, равное количеству строк в SelectedRows, но столбцы не являются столбцами из запроса SQL (как они были в DataGridView_Old); вместо этого они являются свойствами Row каждой отдельной строки (DefaultCellStyle, Resizable, ReadOnly и т. д.).

Существует ли какой-либо быстрый и простой способ просто получить данные столбца из DataGridView_Old и скопировать выбранные строки в DataGridView_New?

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Вот простой метод, который может сделать то, что вам нужно:

private void CopySelectedRows(DataGridView sourceDGV, DataGridView destDGV) {
    // Clean up any previous runs.
    destDGV.DataSource = null;
    destDGV.Columns.Clear();

    // Populate the destination DGV with the same columns found in the source DGV.
    foreach (DataGridViewColumn col in sourceDGV.Columns) {
        destDGV.Columns.Add(col.Clone() as DataGridViewColumn);
    }

    // Create a DataTable that has the same structure as the source DGV's DataSource DataTable.
    DataTable table = ((DataTable)sourceDGV.DataSource).Clone();
    // Use the data bound to the selected rows in the source DGV to create rows in your DataTable.
    foreach (DataGridViewRow row in sourceDGV.Rows) {
        if (row.Selected) {
            table.Rows.Add(((DataRowView)row.DataBoundItem).Row.ItemArray);
        }
    }

    destDGV.DataSource = table;
}

Моим первым импульсом было прохождение цикла по коллекции SelectedRows исходного DGV, но они упорядочены по мере того, как пользователь выбирает строки, не обязательно совпадают с отображаемым порядком.

foreach (DataGridViewRow row in sourceDGV.SelectedRows) {
    table.Rows.Add(((DataRowView)row.DataBoundItem).Row.ItemArray);
}
0 голосов
/ 16 июня 2011

Я не уверен, что он будет работать с DataSets, но вы можете попробовать использовать свойство DataBoundItem каждой выбранной строки для заполнения новой сетки, что-то вроде:

public void Populate()
    {
        var selectedRows = GetRows(DataGridView_Old.SelectedRows);
        DataGridView_New.DataSource = selectedRows
                                      .Select(r => r.DataBoundItem).ToList();
    }

    public IEnumerable<DataGridViewRow> GetRows(DataGridViewSelectedRowCollection rows)
    {
        foreach (DataGridViewRow row in rows)
        {
            yield return row;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...