Как правильно сгенерировать колонки?
Работаю на WPF. Суть такая: Загружаю из mysql БД в DataTable таблицу, так:
public void GetTableData(string curTable)
{
cmd = new MySqlCommand($"SELECT * FROM {curTable};", conn);
reader = cmd.ExecuteReader();
dt.Load(reader);
}
Привязываю к DataGrid:
public MainWindow()
{
InitializeComponent();
DataContext = App.connection; // класс viewmodel
DataGrid_main.ItemsSource = App.connection.DataTableView.DefaultView;
}
Еще пробовал так
public DataTable DataTableView
{
get
{
return dt;
}
set
{
dt = value;
OnPropertyChanged("DataTableView");
}
}
<DataGrid x:Name="DataGrid_main" Margin="0,25,0,0" AutoGenerateColumns="True" ItemsSource="{Binding DataTableView}"/>
В DataTable данные загружаются, есть вся информация о таблицу, начиная от количества строк и столбцов, заканчивая их значениями и названиями.
Визуализатор DataTable вот что показывает (собственно то как мне и надо что б показывалось в DataGrid)

Но пытаясь вывести это в таблицу DataGrid с автогенерацией столбцов, получаю то что ниже на скрине. Причем как я понял столбцов самих нет, но количество строк точно в районе 3600 которые собственно находятся в базе.
Испробовал датасет с датаАдаптером, эффект тот же. Уже не знаю куда копать...

Ответы (1 шт):
1) Загружать надо в свойство, а не в поле. Вообще вне сеттера свойства лушче не обращаться к полю этого свойства.
public void GetTableData(string curTable)
{
cmd = new MySqlCommand($"SELECT * FROM {curTable};", conn);
reader = cmd.ExecuteReader();
DataTable table = new DataTable();
table.Load(reader);
DataTableView = table;
}
2) В целях упрощения рефакторинга рекомендую использовать nameof в свойствах, иначе при переименовании свойства вы можете поломать приложение, забыв поменять строчку.
public DataTable DataTableView
{
get => dt;
set
{
dt = value;
OnPropertyChanged(nameof(DataTableView));
}
}
3) Уберите лишнее присвоение ItemsSource, у вас есть Binding, пусть он это все обслуживает. (скорее всего здесь и кроется ваша исходная проблема)
public MainWindow()
{
InitializeComponent();
DataContext = App.connection;
}
4) И если у вас где-то есть такое
dt = new DataTable();
Замените его на
DataTableView = new DataTable();
Иначе не будет толку от OnPropertyChanged()
Кстати, AutoGenerateColumns="True" - это дефолтное значение для DataGrid, то есть можно убрать, и ничего не поменяется.