Я имею контроль DataGridView, и я хочу заполнить его с данными.
Я использую свойство DataSource
// dgvDealAsset is DataGridView
private void DealAssetListControl_Load(object sender, EventArgs e)
{
dgvDealAssets.AutoGenerateColumns = false;
dgvDealAssets.DataSource = DealAssetList.Instance.Values.ToList();
}
Теперь проблема номер один. Класс моего набора не содержит только простые типы, что я могу отобразить на использование столбцов DataPropertyName. Это - класс, который содержится в наборе.
class MyClass
{
public String Name;
MyOtherClass otherclass;
}
class MyOtherClass
{
public String Name;
}
Теперь я - свойства привязки MyClass к столбцам
col1.DataPropertyName = "Name" // Ok
col2.DataPropertyName = "otherclass" // Not OK - I will have empty cell
Проблема состоит в том, что я хочу отобразить otherclass. Поле имени. Но если я пытаюсь записать
col2.DataPropertyName = "otherclass.Name"
Я получаю пустую ячейку.
Я пытался вручную установить столбец
private void DealAssetListControl_Load(object sender, EventArgs e)
{
dgvDealAssets.AutoGenerateColumns = false;
dgvDealAssets.DataSource = DealAssetList.Instance.Values.ToList();
// iterate through rows and set the column manually
foreach (DataGridViewRow row in dgvDealAssets.Rows)
{
row.Cells["Column2"].Value = ((DealAsset)row.DataBoundItem).otherclass.Name;
}
Но этот foreach цикл берет о минуте для завершения (2k элементы). Как решить эту проблему?
DataGridView не поддерживает привязку данных к дочерним свойствам. Для получения дополнительной информации см. этот пост
Мне нравится решение, использующее событие CellFormatting.
Проблема №1:
Попробуйте сделать следующее:
расширить MyOtherClass из Object (этот шаг может не понадобиться)
и переопределить, или создать, метод ToString().
Это должно сработать.
Похоже, виртуальный режим DataGridView решит вашу проблему. В виртуальном режиме DataGridView запускает событие всякий раз, когда ему нужно отобразить ячейку. Событие позволяет вам заполнять ячейку как угодно. Преимущество виртуального режима заключается в том, что системе нужно извлекать только те данные, которые фактически отображаются, поэтому нет медленного запуска, пока вы загружаете все.
private void my_init_function() {
datagridview.VirtualMode = true;
datagridview.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(datagridview_CellValueNeeded);
}
private void datagridview_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
e.Value = get_my_data(e.RowIndex, e.ColumnIndex);
}