Как показать столбцы массива в DataGridView - PullRequest
0 голосов
/ 23 мая 2019

Я выбираю данные из базы данных Postgres, и один из этих столбцов имеет тип TEXT[]. Я связываю источник данных с DataGridView, но эти столбцы массива просто не отображаются (dgData - это DataGridView).

dgData.DataSource = getDataTable();

Когда я теперь проверяю ((DataTable)dgData.DataSource).Columns[15].DataType, я получаю значение {Name = "String[]" FullName = "System.String[]"}, показывая, что это строковый массив. Этот столбец только что пропущен при визуализации DataGrid.

Как я могу показать эти данные?

1 Ответ

0 голосов
/ 23 мая 2019

Я не думаю, что DataGridView примет столбец типа string[].

Если , то вы можете использовать событие CellFormatting для создания красиво отформатированной отображаемой версии ваших данных, возможно, так:

private void DataGridView1_CellFormatting(object sender,
                                          DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == yourIndexOrName1 && e.Value != null)
    {
        var s = e.Value as string[];
        e.Value = String.Join(", ", s);
    }
}

Но Столбец не создается (при использовании AutoGenerateColumns) и не заполняется иначе.

Итак, вам следует создать легко форматируемый столбец . Либо в SQL на уровне базы данных, либо в строке Linq .

* +1025 * Пример:
var dt_ = dt.Rows.Cast<DataRow>().Select(x => new {
    f1 = x.Field<string>(0),
    f2 = x.Field<string[]>(1).Aggregate((i, j) => i + ", " + j),
    f3 = x.Field<int>(2)
});

dataGridView1.DataSource = dt_.ToList();

Используя мои тестовые данные:

DataTable dt = new DataTable();
dt.Columns.Add("col1", typeof(string));
dt.Columns.Add("col2", typeof(string[]));
dt.Columns.Add("col3", typeof(int));

var row = dt.NewRow();
row.SetField<string>("col1",  "A");
row.SetField<string[]>("col2", new string[] { "abc", "xyz", "123" });
row.SetField<int>("col3", 23 );
dt.Rows.Add(row);
row = dt.NewRow();
row.SetField<string>("col1", "B");
row.SetField<string[]>("col2", new string[] { "a-b-c", "x+y+z", "1:2:3" });
row.SetField<int>("col3", 42);
dt.Rows.Add(row);

Результат выглядит так:

enter image description here

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

...