Привязка DataGridView к массиву отраженных объектов - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь привязать DataGridView к массиву отраженных объектов.Столбцы заголовка связываются нормально, отображается правильное имя и отображаются семь строк, проблема в том, что строки пусты.Example from the program Когда я проверяю элементы с привязкой к данным, все выглядит хорошо.Databound items Это показывает, что это правильная отраженная модель и значения.

Это фрагмент, который я получил до сих пор.

private void comboBoxTables_SelectedIndexChanged(object sender, EventArgs e)
{
    var type = (Type)(this.comboBoxTables.SelectedItem as ComboBoxItem).Value;
    object[] result = this.DataLoader.Get(type);

    dataGridView1.DataSource = result;
    this.dataGridView1.Columns.Clear();

    var properties = type.GetProperties();
    foreach (var property in properties)
    {
        this.dataGridView1.Columns.Add(property.Name, property.Name);
        this.dataGridView1.Columns[property.Name].DataPropertyName = property.Name;
    }

    this.dataGridView1.Refresh();
}

Этот фрагмент:

object[] result = this.DataLoader.Get(type);

Извлекает данные из словаря, содержащего отраженные значения, в виде массива объектов.

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

Любая помощь очень ценится, спасибо заранее.

решено

Не уверен, почему это решилопроблема, но добавив ToList() на результат, данные были отображены правильно.Это может быть из-за не перечислимого IEnumerable ранее в коде.

dataGridView1.DataSource = result.ToList();

Expected result

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

РЕШЕНО

Не уверен, почему это решило проблему, но при добавлении ToList() к результату данные отображались правильно.Я заполню пробелы, как только узнаю, почему это так.

dataGridView1.DataSource = result.ToList();

Expected result

0 голосов
/ 16 октября 2018

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

var properties = type.GetProperties();

не является собственностью, по иронии судьбы.Это означает, что они не имеют «get {}, set {}» как обычные свойства.

Мое решение состоит в том, чтобы заставить внешний класс работать в качестве «оболочки» для свойств, которые вы получаете из своего отражения:

public class Shell
{
    public string Name { get; private set; }

    public Shell(string name)
    {
        Name = name;
    }
}

и что-то вроде этого:

    var type = (Type)(this.comboBoxTables.SelectedItem as ComboBoxItem).Value;
    object[] result = this.DataLoader.Get(type);

    //this.dataGridView1.Columns.Clear();

    var properties = type.GetProperties();

    List<Shell> shells = new List<Shell>();
    foreach (var item in properties)
    {
        shells.Add(new Shell(item.Name));
    }

    dataGridView1.DataSource = shells;

    foreach (var property in shells)
    {
        this.dataGridView1.Columns.Add(property.Name, property.Name);
        this.dataGridView1.Columns[property.Name].DataPropertyName = property.Name;
    }

    this.dataGridView1.Refresh();

Редактировать: Забыл изменить источник данных сетки данных на вновь созданный список оболочек

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