DataGridViewColumn. Свойство DataPropertyName

Я имею контроль 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 элементы). Как решить эту проблему?

7
задан Captain Comic 8 February 2010 в 11:32
поделиться

3 ответа

DataGridView не поддерживает привязку данных к дочерним свойствам. Для получения дополнительной информации см. этот пост

Мне нравится решение, использующее событие CellFormatting.

3
ответ дан 7 December 2019 в 01:20
поделиться

Проблема №1:

Попробуйте сделать следующее:

  1. расширить MyOtherClass из Object (этот шаг может не понадобиться)

  2. и переопределить, или создать, метод ToString().

Это должно сработать.

2
ответ дан 7 December 2019 в 01:20
поделиться

Похоже, виртуальный режим 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);
    }
1
ответ дан 7 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: