c# - Come costruire un Datagrid WPF con un numero sconosciuto di colonne




xaml (2)

Esiste una classe DataTable in .Net. Il suo scopo principale è quello di comunicare con il database relazionale, ma può essere utilizzato per archiviare, visualizzare e modificare i dati tabulari (ad es. Leggere e visualizzare file .csv / Excel -> DataTable + DataGrid in wpf, DataTable + DataGridView in WinForms).

Le colonne DataTable (DataColumn) possono essere aggiunte / rimosse in fase di runtime e DataGrid genera automaticamente le colonne (DataGridColumn) per esse (abilitate per impostazione predefinita), usando la proprietà Name per le intestazioni. Anche DataTable supporta l'ordinamento e il filtro predefiniti.

nota: DataGrid non cancella le Columns quando viene assegnata la nuova ItemsSource. Quindi è possibile avere alcune colonne predefinite e usare anche la generazione automatica.

nota: DataGrid crea DataGridTextColumn s per impostazione predefinita. Se è richiesto un modello più complesso, il processo può essere intercettato tramite AutoGeneratingColumn evento AutoGeneratingColumn ( vedi esempio )

ecco un esempio:

codice

public class MyViewModel
{
    public DataTable Test { get; set; }
}

public MyWindow()
{
    InitializeComponent();
    var vm = new MyViewModel
                {
                    Test = new DataTable
                        {
                            Columns = {"A", "B", "C"}
                        }
                };            
    this.DataContext = vm;

}

xaml

<DataGrid AutoGenerateColumns="True"
          ItemsSource="{Binding Path=Test.DefaultView}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="#"/>
    </DataGrid.Columns>
</DataGrid>

il risultato (ho inserito alcuni valori)

Ho bisogno di costruire e visualizzare una griglia di dati WPF da una raccolta di array di stringhe che ho ottenuto da un txt. Il problema è che non conosco a priori quale sarà il numero di colonne, cioè il numero di elementi nel singolo array. Così ho definito nel mio xaml <DataGrid Grid.Row="2" ItemsSource="{Binding Path=Rows}" />

Stavo cercando di riempirlo nel mio modello di visualizzazione, ma non posso semplicemente mettere la mia collezione (collezione osservabile) di array come sorgente di articoli, poiché il datagrid mostrerà solo righe vuote.

Posso anche usare un altro approccio rispetto alla collezione Observable poiché produco il mio array con lo stesso metodo

questa è la mia collezione osservabile:

ObservableCollection<string[]> Rows = new ObservableCollection<string[]>;

in questo metodo riempio la raccolta

foreach(ListViewItem item in wsettings.lista)
        {                 
            TextBlock line = item.Content as TextBlock;
            string txt = line.Text;
            string[] x = txt.Split(stringSeparators, StringSplitOptions.None);               
            Rows.Add(x);
        }    

Per favore, non preoccuparti della prima parte prima della divisione. Prendo i miei dati da una lista di blocchi di testo che ho usato prima (ho la mia ragione).

EDIT1: reso il codice più leggibile

EDIT2: l'intestazione deve essere una casella combinata che un utente deve impostare


Se non si conosce il numero di colonne in fase di compilazione, è necessario creare le colonne in modo programmatico. Questo dovrebbe essere piuttosto semplice da fare nella vista. Il seguente codice di esempio dovrebbe darti l'idea:

public MainWindow()
{
    InitializeComponent();
    var viewModel = new ViewModel();
    var rows = viewModel.Rows;
    int numberOfColumns = rows[0].Length; //assume all string[] have the same length
    DataContext = new VM1();

    for (int i = 0; i < numberOfColumns; ++i)
    {
        dataGrid1.Columns.Add(new DataGridTextColumn() { Binding = new Binding("[" + i + "]"), Header = i.ToString() });
    }
    dataGrid1.ItemsSource = rows;
}




datagrid