2015-01-13 10 views
5

Ho compilato automaticamente un DataGrid da un DataTable da un server SQL. Voglio che l'utente sia in grado di aggiungere o rimuovere quali colonne sono visibili. Originariamente ho provato questo:Come nascondere colonne generate automaticamente in DataGrid?

public void populateTaskTable(DataTable dt) 
    {      
     //add the whole datatable to the datagrid 
     dg.DataContext = dt.DefaultView; 

     dg.Columns[0].Visibility = Visibility.Collapsed; 
    } 

per un corrispondente XAML (ho provato sia con che senza la AutoGenerateColumns="True"

  <DataGrid Name="dg" ItemsSource="{Binding}" AutoGenerateColumns="True" 

        <!-- <DataGrid.Columns></DataGrid.Columns> --> 

      </DataGrid> 

che ha provocato una rottura violazione della memoria Così poi ho fatto

MessageBox.Show(dg.Columns.Count()); 
.

per vedere se le colonne sono state compilate, il che non era, ha emesso un 0 anche se potevo vedere le colonne nel programma

Ho scoperto from this previous stackoverflow question che "le colonne generate automaticamente non vengono aggiunte all'indice delle colonne".

Poi from this question ho provato ad aggiornare il DataGrid per ottenere colonne popolato in questo modo

taskTable.UpdateLayout(); 

e

taskTable.Items.Refresh(); 

Il che non ha fatto nulla.

C'è un modo per accedere alle proprietà di un DataGrid generato automaticamente o un modo per aggiungere tutte le colonne di DataGrid al componente Columns?

Grazie in anticipo.

+0

Ho aggiornato la mia risposta, la risposta collegata è sbagliata. Si collega a msdn docs per Web non Wpf. Ho lasciato un commento sotto quella risposta per i futuri lettori. –

risposta

6

Collegare l'evento AutoGeneratingColumn e nascondere la colonna laggiù.

dataGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn; 

void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    e.Column.Visibility = Visibility.Collapsed; 
} 

Potrebbe essere necessario nascondere condizionalmente le colonne, è possibile utilizzare

private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.PropertyName == "YourProperty") 
    { 
     e.Column.Visibility = Visibility.Collapsed; 
    } 
} 

Oppure si può utilizzare AutoGeneratedColumns evento. Sarà generato quando tutte le colonne sono state generate.

dataGrid.AutoGeneratedColumns += DataGrid1_AutoGeneratedColumns; 

void DataGrid1_AutoGeneratedColumns(object sender, EventArgs e) 
{ 
    int columnsCount = DataGrid1.Columns.Count; 
    //You can access the columns here. 
} 

Il link che hai fatto riferimento dice che colonne generate automaticamente non vengono aggiunti alla collezione Colonne. Ho appena notato che colonne generate automaticamente sono effettivamente aggiunte alla raccolta. È una cattiva risposta che rimanda alla documentazione di System.Web.UI.WebControls.DataGrid che è molto sbagliata.

+0

Grazie o la tua risposta! Questo codice nasconde comunque tutte le colonne. Come faccio a specificare colonne come questa? –

+0

Controlla se la colonna è per la tua proprietà come this 'if (e.PropertyName ==" YourPropertyName ")'. Aggiornerò la mia risposta –

+0

Grazie mille. Funziona a meraviglia. –