DatagGridViewColumn.DataPropertyName для элемента массива? - PullRequest
4 голосов
/ 01 октября 2009

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

Примером может быть:

 DataGridViewTextBoxColumn colConcept = new DataGridViewTextBoxColumn();
            DataGridViewCell cell4 = new DataGridViewTextBoxCell();
            colConcept.CellTemplate = cell4;
            colConcept.Name = "concept";
            colConcept.HeaderText = "Concept";
            colConcept.DataPropertyName = "Concept";
            colConcept.Width = 200;
            this.dataGridViewBills.Columns.Add(colConcept);

{... назначить другие столбцы ...}

И наконец

 this.dataGridViewBills.DataSource=billslist; //billslist is List<Bill>

Очевидно, что у Class Bill есть свойство под названием Concept, а также одно свойство для каждого столбца.

Что ж, теперь моя проблема в том, что у Билла должен быть и Array / List / whatdynamicsizecontainer строк, называемых Years.

Давайте предположим, что у каждого Билла будет один и тот же Years.Count, но это известно только во время выполнения. Таким образом, я не могу указать такие свойства, как Bill.FirstYear, чтобы получить Bill.Years [0], Bill.SecondYear для получения Биллов .Годы [1] ... и т. Д. ... и привязать их к каждому столбцу.

Идея состоит в том, что теперь я хочу иметь сетку с динамическим числом столбцов (известной во время выполнения), и каждый столбец должен заполняться строкой из списка Bill.Years. Я могу сделать цикл для добавления столбцов в сетку во время выполнения в зависимости от Bill.Years.Count, но можно привязать их к каждой из строк, которые содержит список Bill.Years ???

Я не уверен, достаточно ли я ясен.

В идеале результат должен быть примерно таким: 2 счета в списке и 3 года для каждого счета:

--------------------------------------GRID HEADER-------------------------------
NAME      CONCEPT         YEAR1              YEAR2                YEAR3   
--------------------------------------GRID VALUES-------------------------------
Bill1     Bill1.Concept   Bill1.Years[0]     Bill1.Years[1]       Bill1.Years[2]
Bill2     Bill2.Concept   Bill2.Years[0]     Bill2.Years[1]       Bill2.Years[2]


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

Есть идеи? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Я недавно столкнулся с этой же проблемой. В итоге я использовал виртуальный режим 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);
    }
0 голосов
/ 22 октября 2009

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

Чтобы настроить DataGridView:

// Create the columns based on the data in the album info - get by reflection
var ai = new AlbumInfo();
Type t = ai.GetType();

dataTable.TableName = t.Name;

foreach (PropertyInfo p in t.GetProperties())
{
    // IF TYPE IS AN ARRAY (OR LIST) THEN ADD A COLUMN FOR EACH ELEMENT

    var columnSpec = new DataColumn();

    // If nullable get the underlying type
    Type propertyType = p.PropertyType;
    if (IsNullableType(propertyType))
    {
        var nc = new NullableConverter(propertyType);
        propertyType = nc.UnderlyingType;
    }
    columnSpec.DataType = propertyType;
    columnSpec.ColumnName = p.Name;
    dataTable.Columns.Add(columnSpec);
}

dataGridView.DataSource = dataTable;

Затем для заполнения DataGridView:

// Add album info to table - add by reflection
var ai = new AlbumInfo();
Type t = ai.GetType();
// WOULD NEED TO INCREASE BY LENGTH OF ARRAY
var row = new object[t.GetProperties().Length];

int index = 0;
foreach (PropertyInfo p in t.GetProperties())
{
    // IF TYPE IS AN ARRAY (OR LIST) THEN ADD EACH ELEMENT

    row[index++] = p.GetValue(info, null);
}

dataTable.Rows.Add(row);

Это просто код, который я использовал, поэтому вам придется изменить код для обработки вашего массива / списка года.

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