2011-09-11 15 views
7

Attualmente sto lavorando su un datagrid C# WPF. Ho un DataGrid che ha colonne generate automaticamente e il codice si connette a un database SQLite e crea un set di dati e quindi questo set di dati è impostato come DataSource DataGrid.DataGrid Riga Sfondo basato sul valore della cella

Di seguito si riporta il codice con il codice XAML del DataGrid

<DataGrid AutoGenerateColumns="True" 
      Margin="12,71,12,32" 
      Name="tblLog" 
      ColumnWidth="*" 
      CanUserResizeRows="False" 
      AreRowDetailsFrozen="False" 
      CanUserAddRows="True" 
      CanUserDeleteRows="True" 
      IsReadOnly="True" 
      MouseDoubleClick="tblLog_MouseDoubleClick">     
</DataGrid> 

E sotto è il codice per impostare l'ItemsSource per il DataGrid

try 
{ 
    DataSet ds = new DataSet(); 
    SQLiteDataAdapter da = new SQLiteDataAdapter(query, db.conn); 
    da.Fill(ds); 

    //tblGrid.AutoGenerateColumns = true; 
    tblGrid.ItemsSource = ds.Tables[0].DefaultView;      
} 
catch (SQLiteException ex) 
{ 
    MessageBox.Show("Unable to retrieve logins from database.\n\n" + ex.Message + "\n\nError Code: " + ex.ErrorCode); 
} 

Le colonne che vengono mostrate nel database (auto generato) sono ID, data, ora, stato. Quello che devo essere in grado di fare è se il valore in una riga della colonna di stato è uguale a Errore cambia il colore di sfondo di quella riga.

Suppongo di dover aggiungere una sorta di tag di stile e DataTrigger all'interno dei tag DataGrid ma non sono sicuro di cosa ho bisogno. Qualunque cosa ho provato nel codice che imposta ItemsSource mostra un errore che dice che Source deve essere vuoto prima di aggiungere ItemsSource.

Grazie per l'aiuto che puoi fornire.

+0

Il modo in cui vengono formattate le celle e le righe utilizzando stili non denominati senza nome. Si applicano a tutti gli elementi quando specificiamo il loro TargeType. http://www.codeproject.com/KB/WPF/WPFDataGridExamples.aspx –

risposta

19

È possibile utilizzare un DataTrigger per eseguire questa operazione.

Ecco un esempio rapido. Ho creato una classe chiamata Persona con le proprietà Nome, Età e Attivo.

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public bool Active { get; set; } 
} 

Nel costruttore della finestra principale, aggiungo 3 Person oggetti da un elenco, quindi associare tale elenco per il DataGrid.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     List<Person> people = new List<Person>(); 
     people.Add(new Person() 
     { 
      Name = "John Doe", 
      Age = 32, 
      Active = true 
     }); 
     people.Add(new Person() 
     { 
      Name = "Jane Doe", 
      Age = 30, 
      Active = true 
     }); 
     people.Add(new Person() 
     { 
      Name = "John Adams", 
      Age = 64, 
      Active = false 
     }); 
     tblLog.ItemsSource = people; 
    } 
} 

Poi nel XAML per il MainWindow, creo uno stile DataTrigger come una risorsa.

<Window.Resources> 
    <Style TargetType="DataGridRow"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Active}" Value="False"> 
       <Setter Property="Background" Value="Red" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

Che questo trigger fa è che prende il valore dal campo Active dall'oggetto Person che è nel DataGridRow, e se tale valore è falso, allora si gira verso il colore della riga sfondo al rosso.

+0

Grazie per il vostro aiuto. Come funzionerebbe questo quando il datagrid è bout dal database però. Sembra che stia assegnando manualmente i campi nel codice. Come funzionerebbe con il binding del database. Scusa un po 'un novellino quando si tratta di questo genere di cose – Boardy

+0

@Bardard ... dovrebbe funzionare esattamente allo stesso modo. Sto semplicemente vincolando una raccolta di dati a DataGrid. Essenzialmente, è la stessa cosa che fa il DataSet quando esegui il binding dei dati del tuo database. –

+0

Fantastico grazie mille per il tuo aiuto. Mi stavo confondendo perché stavo pensando che lo styling fosse fatto all'interno dei tag DataGrid e non su Window.Resources. Grazie ancora per il vostro aiuto – Boardy

Problemi correlati