2010-10-25 14 views
12

Utilizzo il toolkit di WPF Datagrid in una delle applicazioni su cui sto lavorando. Quello che voglio è memorizzare la larghezza della colonna e displayindex come preferenza dell'utente. L'ho acquisito per column displayindex ma per ridimensionare non sono riuscito a trovare alcun evento sul datagrid che si innescherà dopo la modifica della dimensione della colonna. Ho provato l'evento "SizeChanged" che immagino sia attivato solo quando inizialmente calcola la dimensione e anche quello è per l'intero datagrid e non per le singole colonne.
Qualche soluzione alternativa o se qualcuno conosce l'evento?WPF Toolkit DataGrid evento di ridimensionamento della colonna

risposta

-1

Si potrebbe provare ad estendere DataGrid e quindi a implementare un evento NotifyPropertyChange. Qualcosa di simile a questo:

class MyDataGrid : DataGrid, INotifyPropertyChanged 
{ 
    private DataGridLength _columnWidth; 
    public DataGridLength ColumnWidth 
    { 
     get { return _columnWidth; } 
     set 
     { 
      _columnWidth = value; 
      NotifyPropertyChanged("ColumnWidth"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Da lì, è possibile aggiungere un delagate al gestore a fare quello che vuoi che faccia. Qualcosa di simile:

MyDataGrid dataGrid; 
//init grid, do stuff 

dataGrid.PropertyChanged += new PropertyChangedEventHandler(ColumnWidthChanged); 
//ColumnWidthChanged will be a method you define 

Ora che avete la delagate, è possibile definire ciò che si vuole che accada quando la larghezza della colonna è cambiato:

private void ColumnWidthChanged(object sender, PropertyChangedEventArgs args) 
{ 
    if(args.PropertyName.Equals("ColumnWidth")) 
    { 
     //Do stuff now that the width is changed 
    } 
} 

Noterete che sto controllando per i quali proprietà è stata cambiata. Il modo in cui l'ho impostato è tale che puoi estendere altre proprietà e rendere i gestori anche i loro cambiamenti. Se si desidera più di un gestore, sarebbe probabilmente meglio creare un metodo DataGridPropertyChanged che attivi quale proprietà è stata modificata. Chiamerebbe quindi il metodo appropriato (come ColumnWidthChanged) per ogni proprietà che viene modificata. In questo modo, non dovrai controllare che ogni gestore modifichi solo una proprietà.

Non hai specificato una lingua, quindi l'ho reindirizzata a C#. Tuttavia, dovrebbe essere abbastanza semplice da trasporre in VB se è quello che stai usando.

Spero che questo aiuti!

+0

Questo non aiuta perché hai una sola larghezza della colonna e il vostro evento sarà ottenere sollevato soltanto se la colonna è stata ridimensionata nel codice, qualcosa che si poteva trappola in ogni caso. – MikeKulls

0

Presumo che si desideri salvare le larghezze delle colonne in modo che al successivo avvio dell'applicazione vengano utilizzate le stesse larghezze di colonna per generare la griglia di dati.

In questo caso, un'alternativa è salvare le larghezze delle colonne (e gli indici) quando l'applicazione viene chiusa, il che sarebbe anche più efficiente del salvataggio delle larghezze ogni volta che una colonna viene ridimensionata.

A seconda di come l'applicazione è strutturata, qualcosa di simile dovrebbe funzionare ...

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    foreach (DataGridColumn column in dataGrid1.Columns) 
    { 
    // save the column.Width property to a user setting/file/registry/etc... 
    // optionally save the displayindex as well... 
    } 
} 
+0

Ciao, puoi darmi qualche indizio su come copiare il valore da C# a xaml? Ho provato questo: Dizionario list = new Dictionary (); foreach (colonna DataGridColumn in DataGridView.Columns) { DataGridLength x = column.Width; list.Add (column.Header.ToString(), x); } – user1850936

9

tratto da ...:

http://forums.silverlight.net/post/602788.aspx

dopo il carico:

PropertyDescriptor pd = DependencyPropertyDescriptor 
          .FromProperty(DataGridColumn.ActualWidthProperty, 
              typeof(DataGridColumn)); 

     foreach (DataGridColumn column in Columns) { 
       //Add a listener for this column's width 
       pd.AddValueChanged(column, 
            new EventHandler(ColumnWidthPropertyChanged)); 
     } 

2 metodi:

private bool _columnWidthChanging; 
    private void ColumnWidthPropertyChanged(object sender, EventArgs e) 
    { 
     // listen for when the mouse is released 
     _columnWidthChanging = true; 
     if (sender != null) 
      Mouse.AddPreviewMouseUpHandler(this, BaseDataGrid_MouseLeftButtonUp); 
    } 

    void BaseDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (_columnWidthChanging) { 
      _columnWidthChanging = false; 
      // save settings, etc 

     } 
    } 

The ColumnWidthPropertyChanged si attiva costantemente mentre l'utente trascina la larghezza intorno. L'aggiunta del gestore di PreviewMouseUp consente di elaborare quando l'utente ha terminato.

+0

Non funziona se si usa il doppio clic. Doppio clic per impostare la larghezza della colonna "automatica". – Rover

+1

@Rover ... ma il doppio clic ha un evento facile da catturare. Non vedo quale sia il problema. –

+0

Un problema è che si aggiungono molti eventhandlers – stefan

1

LayoutAggiornato?

Sto lavorando in Silverlight e la griglia viene rimbalzata/aggiornata ogni secondo.

Sto utilizzando il metodo LayoutUpdated, che viene attivato per ogni evento di aggiornamento del layout.

È possibile mantenere un dizionario delle larghezze delle colonne e controllare i delta. Allora sapresti quale/i colonna/e è cambiata.

foreach (DataGridColumn column in dataGrid1.Columns) 
{ 
    // check for changes... 
    // save the column.Width property to a dictionary... 
} 
Problemi correlati