Можно ли переключать строки и столбцы в сетке данных? - PullRequest
8 голосов
/ 12 мая 2009

У меня есть 10 записей данных в DataTable, который имеет 3 поля: «Foo», «Bar» и «Baz».

Если я подключу этот провод к DataGridView, я увижу 10 строк и 3 столбца, а в заголовках столбцов отображаются имена полей.

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


Я могу сделать некоторые вещи вручную, например, переопределить метод OnPaint и нарисовать имена полей непосредственно в ячейках заголовка строки, но я ищу что-то более автоматизированное.

Опять же, есть предложение поменять значения вручную, но если я не сделаю все значения Strings, это не сработает. 3 столбца в таблице данных - Foo, Bar и Baz типов int, float и string просто не будут транспонироваться.

Даже если я справился со всеми этими ручными изменениями, в моих сетках данных есть столбцы CheckBox, столбцы ComboBox - такого аналога строки не существует - нет строки CheckBox или строки ComboBox. Там, где мне сейчас нужно просто сказать компилятору «Добавить ComboBoxColumn», мне придется переписать, чтобы каждая ячейка была сгенерирована индивидуально.

В идеале я хотел бы, чтобы TransposableDataGridView предоставлял все функциональные возможности DataGridView с дополнительным bool-свойством «Transposed». Таким образом, я мог оставить весь свой код в точности таким, какой он есть - мне не пришлось бы ничего менять, кроме типа сетки.

Если ничего подобного не существует, возможно, мне просто нужно пойти и написать это. (Должен занять у меня год или около того! :)

Ответы [ 5 ]

5 голосов
/ 12 мая 2009

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

Я не думаю, что вы можете установить заголовок строки так же, как вы можете установить заголовок столбца (или, по крайней мере, я не знаю, как), поэтому вы можете поместить имена полей в отдельный столбец.

DataTable oldTable = new DataTable();

...

DataTable newTable = new DataTable();

newTable.Columns.Add("Field Name");
for (int i = 0; i < oldTable.Rows.Count; i++)
    newTable.Columns.Add();

for (int i = 0; i < oldTable.Columns.Count; i++)
{
    DataRow newRow = newTable.NewRow();

    newRow[0] = oldTable.Columns[i].Caption;
    for (int j = 0; j < oldTable.Rows.Count; j++)
        newRow[j+1] = oldTable.Rows[j][i];
    newTable.Rows.Add(newRow);
}

dataGridView.DataSource = newTable;
2 голосов
/ 05 августа 2009

Я использую вертикальную сетку Developer Expres .. Как будто вы хотите повернутую сетку. Это также позволяет использовать другой редактор для каждой строки.

Ссылка на страницу продукта с вертикальной сеткой

1 голос
/ 28 июля 2009

Этот код должен помочь http://aspalliance.com/538_CodeSnip_Pivot_Tables_with_ADONET_and_Display_in_a_DataGrid_Paged_Horizontally

Дисплей asp.net, но вы можете связать полученную таблицу данных с сеткой данных и получить желаемый результат

1 голос
/ 12 мая 2009

Вы можете сделать это, программно добавив нужное количество столбцов (например, еще 7, чтобы получить 10), а затем программно поменяйте местами строку, столбец с столбцом, ряд.

0 голосов
/ 25 сентября 2015

В моем случае необходимо также добавить имя во все столбцы новой таблицы. Я написал функцию для генерации транспонированной таблицы следующим образом:

static public DataTable Transpose(DataTable inputTable, List<string> newColumnNames)
{
    DataTable outputTable = new DataTable();

    ///You should also verify if newColumnsNames.Count matches inputTable number of row

    //Creates the columns, using the provided column names.
    foreach (var newColumnName in newColumnNames)
    {
        outputTable.Columns.Add(newColumnName, typeof(string));
    }

    foreach (DataColumn inputColumn in inputTable.Columns)
    {
        //For each old column we generate a row in the new table
        DataRow newRow = outputTable.NewRow();

        //Looks in the former header row to fill in the first column
        newRow[0] = inputColumn.ColumnName.ToString();

        int counter = 1;
        foreach (DataRow row in inputTable.Rows)
        {
            newRow[counter] = row[inputColumn.ColumnName].ToString();
            counter++;
        }
        outputTable.Rows.Add(newRow);
    }

    return outputTable;

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