2010-05-30 3 views
11

Run, und verwechselt werden:Worum handelt es sich bei DataTable-Spaltennamen mit Punkten, die sie für das DataGrid-Steuerelement von WPF ungeeignet machen? diese

<Window x:Class="Data_Grids.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <DataGrid 
     Name="r1" 
       ItemsSource="{Binding Path=.}"> 
     </DataGrid> 
     <DataGrid 
     Name="r2" 
       ItemsSource="{Binding Path=.}"> 
     </DataGrid> 
    </StackPanel> 
</Window> 

Codebehind:

using System.Data; 
using System.Windows; 

namespace Data_Grids 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataTable dt1, dt2; 
      dt1 = new DataTable(); 
      dt2 = new DataTable(); 
      dt1.Columns.Add("a-name", typeof(string)); 
      dt1.Columns.Add("b-name", typeof(string)); 
      dt1.Rows.Add(new object[] { 1, "Hi" }); 
      dt1.Rows.Add(new object[] { 2, "Hi" }); 
      dt1.Rows.Add(new object[] { 3, "Hi" }); 
      dt1.Rows.Add(new object[] { 4, "Hi" }); 
      dt1.Rows.Add(new object[] { 5, "Hi" }); 
      dt1.Rows.Add(new object[] { 6, "Hi" }); 
      dt1.Rows.Add(new object[] { 7, "Hi" }); 
      dt2.Columns.Add("a.name", typeof(string)); 
      dt2.Columns.Add("b.name", typeof(string)); 
      dt2.Rows.Add(new object[] { 1, "Hi" }); 
      dt2.Rows.Add(new object[] { 2, "Hi" }); 
      dt2.Rows.Add(new object[] { 3, "Hi" }); 
      dt2.Rows.Add(new object[] { 4, "Hi" }); 
      dt2.Rows.Add(new object[] { 5, "Hi" }); 
      dt2.Rows.Add(new object[] { 6, "Hi" }); 
      dt2.Rows.Add(new object[] { 7, "Hi" }); 
      r1.DataContext = dt1; 
      r2.DataContext = dt2; 
     } 
    } 
} 

Ich werde Ihnen sagen, was passiert. Das oberste Datagrid enthält Spaltenüberschriften und Daten. Das untere Datagrid hat Spaltenüberschriften, aber alle Zeilen sind leer.

+4

Hatten Sie einen schlechten Tag, als Sie diesen Namespace erstellt haben? – slugster

Antwort

15

Die vollständigen Stopp-Zeichen in den Spaltennamen der zweiten Tabelle durch den Bindungspfad Parser falsch interpretiert werden. Schauen Sie sich die Debug-Ausgabe, während dieses Beispiel ausgeführt wird, und Sie können sehen, dass die automatisch generierten Spalten haben ‚a‘ gebunden, und ‚b‘ und nicht ‚a.name‘ und ‚b.name‘

System.Windows.Data Error: 40 : BindingExpression path error: 'a' property not found on 'object' ''DataRowView' ... etc. 
System.Windows.Data Error: 40 : BindingExpression path error: 'b' property not found on 'object' ''DataRowView' ... etc. 

Es gibt eine Reihe von verschiedenen Zeichen, die in einem Bindungspfad eine besondere Bedeutung haben, einschließlich Punkt ('.'), Schrägstrich ('/'), eckigen Klammern ('[', ']') und Klammern ('(', ')'), verursacht die Klammer einen Absturz Ihrer App. Diese Sonderzeichen können durch Umgeben des Bindungspfades mit eckigen Klammern umgangen werden. Weitere Informationen zu Pfaden und Charakter Entkommen kann im Binding Declarations Overview

finden Um dies zu beheben Sie Autogeneratecolumns = „false“ gesetzt und die Spaltenbindungen in der XAML angeben:

<DataGrid 
    x:Name="r2" 
      ItemsSource="{Binding .}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="a.name" Binding="{Binding Path=[a.name]}" /> 
      <DataGridTextColumn Header="b.name" Binding="{Binding Path=[b.name]}" /> 
     </DataGrid.Columns> 
    </DataGrid> 

oder programmatisch in der Code hinter

 r2.AutoGenerateColumns = false; 
     foreach(DataColumn column in dt2.Columns) 
     { 
      var gridColumn = new DataGridTextColumn() 
      { 
       Header = column.ColumnName, 
       Binding = new Binding("[" + column.ColumnName + "]") 
      }; 

      r2.Columns.Add(gridColumn); 
     } 

     r2.DataContext = dt2; 
+0

Aber was, wenn es eine Klammer im Spaltennamen gibt? Wird das nicht durcheinander gebracht?(Ich weiß, das ist sehr alt, aber ich habe dieses Problem gerade :)) – anakic

3

Das FULL STOP (Punkt/Punkt) -Zeichen funktioniert nicht.
Selbst das Entkommen mit x \ 002E hat nicht funktioniert.

Hier ist ein Kompromiss der MIDDLE DOT Zeichen mit:

dt1.Columns.Add("a\x00B7name", typeof(string)); 
dt1.Columns.Add("b\x00B7name", typeof(string)); 
+2

Eine bessere Alternative als MIDDLE DOT könnte [ONE DOT LEADER (U + 2024)] sein (http://www.fileformat.info/info/unicode/char/2024/index.htm). –

+0

@ScottWhitlock und Zamboni Ahahahah, das ist großartig! Dumme Fehler mit einer wirklich einfachen und genialen Idee gelöst –

17

Sie Autogeneratecolumns auf true gesetzt und füge eine Eventhandler mit beliebigen Perioden (oder anderen Sonderzeichen) behandeln halten können:

<DataGrid 
    Name="r2" 
      ItemsSource="{Binding Path=.}" 
      AutoGeneratingColumn="r2_AutoGeneratingColumn"> 
    </DataGrid> 

Codebehind:

private void r2_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.PropertyName.Contains('.') && e.Column is DataGridBoundColumn) 
    { 
     DataGridBoundColumn dataGridBoundColumn = e.Column as DataGridBoundColumn; 
     dataGridBoundColumn.Binding = new Binding("[" + e.PropertyName + "]"); 
    } 
} 

Das funktionierte besser für mich in einem MVVM Szenario.

+0

Ich musste die gleiche Lösung für meine Datagrid in Wpf verwenden, aber was ich damit zu tun habe, ist das Problem, wenn Cell Vallue aktualisiert wurde (Bearbeitungsmodus) und ich drücke Enter (commit value), app stürzt mit allgemeinen exc ab. "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt", Stapelüberwachung: "at System.Windows.Data.BindingGroup.UpdateValues ​​() bei System.Windows.Data.BindingGroup.UpdateAndValidate (ValidationStep validationStep) bei System.Windows. Data.BindingGroup.CommitEdit() ". Hatten Sie ein ähnliches Problem? – stenly

+0

und nur einen Kommentar zu meinem vorherigen, ich habe den Bindungsweg von "_-./#" nach "[_- ^. ^/#]" Geändert - diese Sonderzeichen sollten in der Spaltenüberschrift erlaubt sein. Danke für die Hilfe – stenly

+1

Wie ich [hier] (http://stackoverflow.com/questions/8010614/datagrid-header-sort-error-bound-to-dataview) gefunden habe, um Sortierung nicht zu vermasseln add: dataGridBoundColumn.SortMemberPath = e.PropertyName; – anakic

0

Ich endete mit der Substitution der ONE DOT LEADER und es hat super funktioniert. Ich importierte meine Daten aus einer XML-Datei und anstelle von string.replace(".","\x2024"); überall in meinem Code war es einfacher, die Importdatei zu ändern.

Before 
<Components Description="Thru Tee" Size="0.5" Kv="0.54" /> 
After 
<Components Description="Thru Tee" Size="0&#x2024;5" Kv="0.54" /> 
Verwandte Themen