2014-04-07 7 views
5

Ich habe eine DataGrid innerhalb einer UserControl. Es sieht wie folgt aus:Wie binde ich ein String-Array automatisch an ein WPF DataGrid?

<UserControl x:Class="ExternalDataSourceComparison.ImportedInfoGrid" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     Height="Auto" Width="Auto"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <DataGrid Name="_dataGrid" Grid.Row="0"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path[0].Length}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

ich die UserControl in meinem MainWindow haben, die wie folgt aussieht:

<Window x:Class="ExternalDataSourceComparison.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:ExternalDataSourceComparison" 
    Title="MainWindow" Height="350" Width="525" WindowState="Maximized"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <local:ImportedInfoGrid x:Name="ExternalData" Grid.Row="0"/> 
    <StackPanel Height="36px" Orientation="Horizontal" Grid.Row="1"> 
     <Button Name="_import" Content="Import Data" Margin="5" Padding="5, 2" Click="Import_Click"/> 
     <Button Name="_compare" Content="Compare" Margin="5" Padding="5, 2" Click="Compare_Click"/> 
     <Button Name="_cancel" Content="Cancel" Margin="5" Padding="5, 2" Click="Cancel_Click"/>    
    </StackPanel> 
</Grid> 
für das Fenster

In meinem Code hinter mit der Methode fs.CSVToStringArray , Öffne ich eine CSV-Datei und analysiere den Inhalt zu einer string[][] das äußere Array repräsentiert die Zeilen und die innere arr ay sind alle Spalten so string [0] [3] Zeile 1, Spalte 4.

In meinem Code wäre gesetzt hinter I nur ItemsSource gleich den Array von Arrays, wie unten gezeigt:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Data; 

namespace ExternalDataSourceComparison 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     FileStuff fs = new FileStuff(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Import_Click(object sender, RoutedEventArgs e) 
     { 
      string[][] array = fs.CSVToStringArray(); 
      this.ExternalData._dataGrid.ItemsSource = array; 
     } 

     private void Cancel_Click(object sender, RoutedEventArgs e) 
     { 

     } 

     private void Compare_Click(object sender, RoutedEventArgs e) 
     { 

     } 
    } 
} 

Die Ausgabe ist jedoch nicht das, was ich erwartet habe. Ich denke, es zeigt die Attribute des Objekts anstelle des eigentlichen Inhalts. Gibt es eine Möglichkeit, Zeilen und Spalten automatisch zu generieren, oder muss ich den Code schreiben, um die Spalten zu erstellen und die Zeilen zu erstellen? Ich dachte mit einem DataGrid könnte man etwas wie eine string[][] oder eine List<string[]> an die ItemsSource binden und es würde nur Spalten generiert. Es erzeugt momentan automatisch Spalten, es füllt sie nur nicht mit dem Inhalt der string[][].

Antwort

10

DataGrid Die Funktion zum automatischen Erstellen von Spalten ist nicht ganz geeignet, um gezackte Array-Daten anzuzeigen. Es ist besser für einzelne, einteilige Sammlung geeignet, wo jede Zeile in DataGrid einzelnes Element in Sammlung darstellt, und jede Spalte unterschiedliche Eigenschaft des entsprechenden Elements darstellt.

Und solange das Element in ItemsSource kein Modell ist, das für die Anzeige bereit ist, sollten Sie sich nicht auf die automatische Spaltengenerierung verlassen (es wird die Spalte für alle Eigenschaften angezeigt, einschließlich der Eigenschaften, die nicht angezeigt werden sollen). Ein weiteres Problem beim Versuch, automatisch binden DataGrid zu Array ist, DataGrid hat keine Informationen darüber, wie es die Spalte benennen sollte.

Am Ende denke ich, Sie besser definieren DataGrid Spalten irgendwie, anstatt DataGrid es selbst erzeugen die Spalten. Entweder definiert es von XAML, zum Beispiel, immer unter der Voraussetzung, Sie haben zwei „Säulen“ im Array:

<DataGrid Name="_dataGrid" Grid.Row="0" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Column 1" Binding="{Binding [0]}"/> 
     <DataGridTextColumn Header="Column 2" Binding="{Binding [1]}"/> 
    </DataGrid.Columns> 
</DataGrid> 

Oder die Spalten von Code definieren, falls Sie dynamische Anzahl von Spalten haben, zum Beispiel:

string[][] array = fs.CSVToStringArray(); 
for (int i = 0; i < array[0].Length; i++) 
{ 
    var col = new DataGridTextColumn(); 
    col.Header = "Column " + i; 
    col.Binding = new Binding(string.Format("[{0}]", i)); 
    _dataGrid.Columns.Add(col); 
} 
this.ExternalData._dataGrid.ItemsSource = array; 
Verwandte Themen