2010-01-25 7 views
6

Desidero poter selezionare una cella specifica in un DataGrid di Silverlight 3.0 e metterla in modalità di modifica. Posso usare VisualTreeManager per localizzare la cella. Come posso passare alla modalità di modifica?Come posso inserire Silverlight 3 DataGridCell in modalità di modifica nel codice?

Ogni DataGridCell assomiglia a questo nel VisualTreeManager:

  System.Windows.Controls.DataGridCell 
      System.Windows.Controls.Grid 
       System.Windows.Shapes.Rectangle 
       System.Windows.Controls.ContentPresenter 
       System.Windows.Controls.TextBlock 
       System.Windows.Shapes.Rectangle 
       System.Windows.Shapes.Rectangle 

con TextBlock contenente il testo che voglio modificare.

Aggiornamento

Seguendo il suggerimento @AnthonyWJones', ecco come ho cercato di farlo usando BeginEdit().

Volevo semplificarlo, quindi ho pensato di scegliere una colonna nella prima riga. Anche quello si è rivelato al di fuori della mia conoscenza di SL! Alla fine, ottengo la prima fila creando un campo denominato firstRow tenerlo:

private DataGridRow firstRow; 

aggiunto un gestore LoadingRow alla griglia dati:

LoadingRow="computersDataGrid_LoadingRow" 

e

private void computersDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    if (this.firstRow == null) 
     this.firstRow = e.Row; 
} 

e quindi aggiungendo un pulsante al pannello per attivare la modifica:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    this.dataGrid.SelectedItem = this.firstRow; 
    this.dataGrid.CurrentColumn = this.dataGrid.Columns[4]; 
    this.dataGrid.BeginEdit(); 
} 

Faccio clic sul pulsante e la cella corretta è selezionata ma non entra in modifica nella cella. Ci vuole un clic del manuale per raggiungere questo obiettivo.

risposta

2

Non sono sicuro del motivo per cui è necessario trovare DataGridCell utilizzando VisualTreeManager, né so attualmente come iniziare correttamente la modifica. Puoi farla franca semplicemente impostando lo stato visivo della cella sul montaggio.

VisualStateManager.GoToState(myDataGridCell, "Editing", true); 

Non sono sicuro di come si comporta la griglia quando si esegue qualcosa come sopra. Potresti trovare le cose un po 'deformate se hai bisogno di DataGrid per aiutarti a ripristinare le modifiche a una riga.

L'approccio "standard" sarebbe per impostare la proprietà DataGridSelectedItem all'elemento rappresentato dalla riga, impostare la proprietà CurrrentColum all'oggetto DataGridColumn che rappresenta la colonna in cui si trova la cella. Quindi chiamare il metodo BeginEdit.

+0

mi era stato portato su questa strada da qualcun altro. Proverò ciò che hai suggerito e ti faccio sapere. Grazie. – ssg31415926

+0

Ho provato entrambi i vostri suggerimenti senza successo. Innanzitutto, l'approccio "standard". L'utilizzo di SelectedItem e CurrentColumn determina l'evidenziazione della cella ma l'aggiunta di BeginEdit() non ha alcun effetto. La cella non ottiene la messa a fuoco e non entra in modalità di modifica. Anche l'uso di VisualStateManager non ha funzionato. – ssg31415926

+0

@ ssg31415926 Avevo il sospetto che il primo approccio non avrebbe funzionato, sono sorpreso che il secondo non abbia però, puoi modificare la tua domanda per includere una piccola quantità di codice rilevante che descrive come l'hai provato? – AnthonyWJones

0

io non sono in grado di capire il problema correttamente, ma ho avuto un problema simile

volevo fare solo alcune delle celle della griglia modificabile e resto non erano. Invece di creare una logica e assegnare ReadOnly come vero/falso, ho fatto la cosa semplice.

  • Segna cellule di tutta la griglia sono scrivibili, IsReadOnly come falsa
  • impostare l'evento PreparingCellForEdit e scrivete una callback
  • Quando si fa doppio clic su una cella, si arriva nella modalità di modifica
  • Verificare se questa cella si vuole essere modificabile
  • Se si è permesso di essere modificato, andare avanti
  • Se quella cella è di sola lettura, quindi chiamare CancelEdit

Il codice di esempio va come

namespace foo 
{ 
    public class foobar 
    { 
     public foobar() 
     { 
      sampleGrid = new DataGrid(); 
      sampleGrid.IsReadOnly = false; 
      sampleGrid.PreparingCellForEdit += new EventHandler<DataGridPreparingCellForEditEventArgs>(sampleGrid_PreparingCellForEdit); 
     } 

     void sampleGrid_PreparingCellForEdit(object sender, DataGridsampleGrid_PreparingCellForEditEventArgs e) 
     { 
      if (sampleGrid.SelectedItem != null) 
      { 
       bool isWritableField = CheckIfWritable() 

       if (isWritableField == false) 
       { 
        sampleGrid.CancelEdit(); 
       } 

       // continue with your logic 
      } 
     } 

     private DataGrid sampleGrid; 
    } 
} 
+0

Qualche idea sul perché CancelEdit potrebbe non funzionare? – neurotix

+0

@neurotix Non funziona? Veramente? Lo fa per me. Silverlight 3. Non penso che questo dovrebbe cambiare per SL4 –

+0

Non ha alcun effetto per me :(. Ho provato anche achive la stessa cosa che hai fatto qui cambiando IsReadOnly Dinamically ma anche questo casualmente fallisce. attenzione al check-out: http://stackoverflow.com/questions/9311158/datagrid-column-isreadonly-property-not-working-in-silverlight-4 – neurotix

Problemi correlati