WPF Datagrid: Spalte wird nicht angezeigt
Problem:
Wenn man in WPF ein DataGrid mit einer Datenquelle lädt, und im Header der Tabellen befindet sich eine Spalte mit einem . Punkt am Ende,
dann wird Spalte zwar angezeigt, aber die Werte werden nicht geladen.
Lösung:
Da die Datenbindung in WPF in ein DataGrid Control intern vereinfacht ist, kann man nur die Tabellen Header oder Table-Column-Names darauf prüfen, dass keine Punkte als Endung vorhanden sind, oder diese zur Laufzeit entfernt werden.
Das gleiche dürfte für die üblichen Sonderzeichen gelten.
Alternativ kann man das DataGrid auch über Items manuell auffüllen.
Betrifft:
WPF DataGrid, AutoGenerateColumns, DataContext
<DataGrid x:Name="ctlDataGrid" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" AutoGenerateColumns="True" GridLinesVisibility="All" Background="#F0f0f0" ItemsSource="{Binding}" SelectionMode="Single" IsReadOnly="True" MouseDoubleClick="ctlDataGrid_MouseDoubleClick" HeadersVisibility="All" Grid.Row="1" /> |
Daten Laden mit Databinding
Daten laden in ein DataGrid über Datenbindung
Ein einfaches Code Beispiel in C#
In WPF DataGrid
DataTable dataTable = new DataTable(); dataTable.Columns.Add("A"); dataTable.Columns.Add("B"); dataTable.Columns.Add("C");
DataRow row = dataTable.NewRow(); row[1] = 1; row[2] = "2"; dataTable.Rows.Add(row);
_dataGrid.AutoGenerateColumns = true; _dataGrid.DataContext = dataTable; |
Beispiel Standard
Daten aus Excel ohne Punkt als Beispiel
Das WPF Datagrid wird richtig geladen
Fehler-Reproduktion
Mit einem . Punkt in dem Header der Spalte C.
Wie man sieht, werden die eigentlichen Daten nicht angezeigt
C# Code Beispiel
Code Beispiel zum Laden eines WPF Datagrid mit Daten.
public async void load_DataGrid_with_Excel() { //----------------< load_DataGrid_with_Excel() >------------ Excel.Range usedRange = _worksheet.UsedRange;
//*fast Excel-Read: //< create 2D Array > //*from excel with cell-content-object object[,] values = usedRange.Value2; _progressbar.Maximum = usedRange.Columns.Count;
if (usedRange.Rows.Count > 0) { //< build datasouce > DataTable dataTable = new DataTable(); //</ build datasouce >
int nColumnsMax = usedRange.Columns.Count;
//----< Read_Header >---- for (int iColumn = 1; iColumn <= nColumnsMax; iColumn++) { string sValue = Convert.ToString(values[1, iColumn]); if (sValue == "" || sValue == null) { nColumnsMax = iColumn; break; } if (iColumn>50) { nColumnsMax = iColumn; break; } dataTable.Columns.Add(sValue); } //----</ Read_Header > ----
//----< Read_DataRows >----
for (int iRow = 2; iRow <= usedRange.Rows.Count; iRow++) { if (iRow > 10000) break; if (iRow % 50==0) { _progressbar.Value = iRow; lblStatus.Content = iRow + "/" + usedRange.Rows.Count; await DoEvents();
} //_progressbar.UpdateLayout(); //_progressbar.Dispatcher.Invoke(() => _progressbar.Value = iRow);
await Task.Run(() => { //----< Row >---- //< add_Row > DataRow row = dataTable.NewRow(); //</ add_Row >
for (int iColumn = 1; iColumn <= nColumnsMax; iColumn++) { //----< read_cells_to_table >---- //< read > string sValue = Convert.ToString(values[iRow, iColumn]); if (iColumn == 1) { if (sValue == "" || sValue == null) { iRow=usedRange.Rows.Count; } } //</ read >
//< write > row[iColumn -1] = sValue; //</ write > //--</ Transfer Cells > -- //----</ read_cells_to_table >---- } dataTable.Rows.Add(row); //----</ Row >---- }); } //----</ Read_DataRows >----
//< show Data > _dataGrid.AutoGenerateColumns = true; _dataGrid.DataContext = dataTable;
//</ show Data > }
//return true; //----------------</ load_DataGrid_with_Excel() >------------ } |