DataGridView принимает матрицу N x M объектов одного типа

Упрощенная схема. Есть объект данных:

   class Data
    {
        public int Digit { get; set; }
    }

В коде создается список данных и привязывается к DataGridView.

List<Data> dataList = new List<Data>()
   {
     new Data(){Digit=1},
     new Data(){Digit=2},
     new Data(){Digit=1}
   };
dataGrid.DataSource = dataList;

Работает правильно - в ячейках размещены объекты Data и свойство Digit привязано к свойству DataGridCell.Value. Редактирование данных в ячейке отражается на свойстве объекта Data. Вопрос - такая схема работает для 1 колонки, а надо создать такую же схему для 10 колонок. То есть привязать матрицу Data[10][10]. Какую структуру данных надо создать для решения задачи?

Пробовал такой вариант, но выводиться не значение а имя класса

            dataGrid.Columns.Add( new DataGridViewTextBoxColumn()
            {
                HeaderText="0",
                DataPropertyName="Digit"
            } );

            dataGrid.Columns.Add( new DataGridViewTextBoxColumn()
            {
                HeaderText = "1",
                DataPropertyName = "Digit"
            } );
            dataGrid.Rows.Add( new object[] { new Data() { Digit = 11 }, new Data() { Digit = 21 } } );
            dataGrid.Rows.Add( new object[] { new Data() { Digit = 31 }, new Data() { Digit = 33 } } );

Ответы (1 шт):

Автор решения: Alexander Petrov

Как вам уже предложили в комментариях, можно использовать DataTable.

Допустим, имеется список объектов вашего класса: List<Data> dataList. Заполненный следующим образом:

dataList = new List<Data>();

for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10; j++)
        dataList.Add(new Data { Digit = i * 10 + j });

Имеется DataTable dataTable:

dataTable = new DataTable();

for (int i = 0; i < 10; i++)
    dataTable.Columns.Add(i.ToString(), typeof(int));

Теперь нужно смапить список на таблицу:

for (int i = 0; i < dataList.Count; i += 10)
{
    var row = dataTable.NewRow();
    for (int j = 0; j < 10; j++)
        row[j] = dataList[i + j].Digit;
    dataTable.Rows.Add(row);
}

Всё, можно сделать привязку к гриду:

dataGridView.DataSource = dataTable;

Когда пользователь поработает с данными в гриде и вам снова нужен список с объектами Data, делаем обратный маппинг:

for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10; j++)
        dataList[i * 10 + j].Digit = (int)dataTable.Rows[j][i];

Теперь в dataList обновлённые данные.

Следить за индексами - ваша обязанность. Если количество объектов в списке не кратно количеству колонок в таблице - надеюсь, сами сделаете проверки.


Чтобы два раза не вставать. Во избежание тормозов, используйте грид с двойной буферизацией

class DoubleBufferedDataGridView : DataGridView
{
    protected override bool DoubleBuffered => true;
}
→ Ссылка