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 шт):
Как вам уже предложили в комментариях, можно использовать 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;
}