Как я могу привязать данные динамически загруженными DataGridViews? - PullRequest
0 голосов
/ 07 мая 2009

Я разрабатываю приложение Windows Forms в VS2008. Я хочу отобразить неизвестное, но небольшое количество DataGridViews на форме, используя такой код:

foreach (QueryFilter f in Query.Filter)
{                    
    DataGridView grid = CreateGridView(String.Format("GridView{0}", filters.Count));
    grid.Location = new System.Drawing.Point(3, 9 + (filters.Count * grid.Height + 9));
    BindingList<QueryFilterNode> nodes = new BindingList<QueryFilterNode>();
    foreach (QueryFilterNode node in f)
        nodes.Add(node);
    grid.DataSource = nodes;
    panel1.Controls.Add(grid);
    filters.Add(nodes);                    
}

Сетка (и) добавляются на панель, но данные внутри не отображаются. Я предполагаю, что установка свойства DataSource фактически не привязывает сетку, потому что (например) событие dataGridView_ColumnAdded не запускается.

QueryFilter и QueryFilterNode являются просто POCO и, конечно, содержат данные.

Для полноты картины построение DataGridView:

private DataGridView CreateGridView(string name)
{
    DataGridView grid = new DataGridView();
    grid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;            
    grid.Name = name;
    grid.Size = new System.Drawing.Size(484, 120);
    grid.ColumnAdded += new System.Windows.Forms.DataGridViewColumnEventHandler(this.dataGridView_ColumnAdded);
    return grid;
}

1 Ответ

0 голосов
/ 07 мая 2009

Хм, похоже, это была моя собственная ошибка. QueryFilterNode, используемый в качестве источника данных (BindingList<QueryFilterNode>), был не POCO, а контрактом данных. Отрывок:

[DataContract(Name = "QueryFilterNode")]
public class QueryFilterNode
{
  [DataMember(IsRequired = true)]
  public string FieldCode;        

По некоторым причинам они не могут быть привязаны к данным. Я использовал простой класс, как этот, в моем BindingList, и он просто работал.

class QueryFilterNodeSimple
{

  public string FieldCode
  { get; set; }
...