2011-09-11 12 views
7

Actualmente estoy trabajando en una cuadrícula de datos C# WPF. Tengo un DataGrid que tiene columnas generadas automáticamente y el código se conecta a una base de datos SQLite y crea un conjunto de datos, y luego este conjunto de datos se establece como DataGrid ItemsSource.cuadrícula de datos de fila del fondo Según el valor del celular

A continuación se muestra el código con el XAML de la cuadrícula de datos

<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> 

y abajo es el código para establecer la ItemsSource de la cuadrícula de datos

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); 
} 

Las columnas que se muestran en la base de datos (automático generado) son ID, fecha, hora, estado. Lo que necesito hacer es si el valor en una fila de la columna de estado es igual a Error al cambiar el color de fondo de esa fila.

asumo tengo que añadir algún tipo de etiquetas de estilo y DataTriggers dentro de las etiquetas de DataGrid, pero no está seguro de lo que necesito. Todo lo que he intentado con el código que establece ItemsSource muestra un error que dice que el origen debe estar vacío antes de agregar el ItemsSource.

Gracias por cualquier ayuda que pueda proporcionar.

+0

La forma celdas y filas estilo que es mediante el uso de estilos sin codificar sin nombre. Se aplican a todos los elementos cuando especificamos su TargeType. http://www.codeproject.com/KB/WPF/WPFDataGridExamples.aspx –

Respuesta

19

Se puede utilizar un DataTrigger para hacer esto.

Aquí es una muestra rápida. Creé una clase llamada Persona con las propiedades Nombre, Edad y Activo.

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

En el constructor de la ventana principal, agrego 3 Person objetos a una lista, a continuación, se unen a la lista que 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; 
    } 
} 

Luego, en el XAML para el MainWindow, puedo crear un estilo DataTrigger como un recurso.

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

Lo que hace este disparador es que se necesita el valor del campo Active del objeto Person que está en el DataGridRow, y si ese valor es falso, entonces se convierte en el color de fondo de la fila a rojo.

+0

Gracias por su ayuda. ¿Cómo funcionaría esto cuando la cuadrícula de datos comience desde la base de datos? Parece como si estuviera asignando campos manualmente en el código. ¿Cómo funcionaría esto con la vinculación de la base de datos? Lo siento un poco novato cuando se trata de este tipo de cosas – Boardy

+0

@Boardy ... debería funcionar exactamente igual. Simplemente estoy vinculando una colección de datos a DataGrid. Esencialmente, eso es lo mismo que hace el DataSet cuando se vincula utilizando los datos de su base de datos. –

+0

Fantástico muchas gracias por su ayuda. Me estaba confundiendo porque estaba pensando que el estilo se hacía dentro de las etiquetas de DataGrid y no en Window.Resources. De nuevo, gracias por tu ayuda – Boardy

Cuestiones relacionadas