2009-12-02 5 views
0

Le code WPF suivant affiche le contenu de FirstName et ZipCode dans le WPF Toolkit DataGrid.Comment manipuler les données de cellule affichées dans WPF Toolkit DataGrid lors de l'exécution?

Cependant, je ne veux pas simplement afficher les données telles quelles mais légèrement modifié, par ex. Je pourrais vouloir afficher tous les codes postaux à afficher avec un "-0000" à la fin, ou je peux vouloir montrer "n/a" si une cellule est vide. Je ne pouvais trouver que CopyingCellClipboardContent qui ne semble pas faire ce que je veux.

Je pense que je pourrais avoir besoin d'un Converter mais je ne suis pas sûr de savoir comment faire à ce sujet dans cet exemple.

Comment puis-je manipuler le contenu de la cellule des cellules DataGrid lors de l'exécution?

XAML:

<Window x:Class="TestControl3423.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" 
    Title="Window2" Height="300" Width="500"> 
    <StackPanel> 
     <tk:DataGrid x:Name="dataGrid" 
        Margin="0 0 0 10" 
        AutoGenerateColumns="False" 
        CanUserAddRows="False" 
        HeadersVisibility="Column" 
        MaxHeight="400" 
        IsReadOnly="True" 
        Background="#fff" 
        ColumnWidth="SizeToHeader"> 
     </tk:DataGrid> 
    </StackPanel> 
</Window> 

code Derrière:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows; 
using System.Windows.Data; 
using System.Windows.Documents; 
using Microsoft.Windows.Controls; 

namespace TestControl3423 
{ 
    public partial class Window2 : Window 
    { 
     public Window2() 
     { 
      InitializeComponent(); 

      dataGrid.ItemsSource = Customer.GetCustomers(); 

      dataGrid.Columns.Clear(); 

      DataGridTextColumn dgtc1 = new DataGridTextColumn(); 
      dgtc1.Header = "First Name"; 
      dgtc1.Binding = new Binding("FirstName"); 
      dgtc1.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); 
      dataGrid.Columns.Add(dgtc1); 

      DataGridTextColumn dgtc2 = new DataGridTextColumn(); 
      dgtc2.Header = "Zip Code"; 
      dgtc2.Binding = new Binding("ZipCode"); 
      dgtc2.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); 
      dgtc2.CopyingCellClipboardContent += new EventHandler<DataGridCellClipboardEventArgs>(dgtc2_CopyingCellClipboardContent); 
      dataGrid.Columns.Add(dgtc2); 
     } 

     void dgtc2_CopyingCellClipboardContent(object sender, DataGridCellClipboardEventArgs e) 
     { 
      DataGridTextColumn dgtc = sender as DataGridTextColumn; 
      dgtc.SetValue(dgtc.GetValue() + "-0000"); //ERROR 
     } 
    } 

    public class Customer 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Street { get; set; } 
     public string Location { get; set; } 
     public string ZipCode { get; set; } 

     public static List<Customer> GetCustomers() 
     { 
      List<Customer> customers = new List<Customer>(); 
      customers.Add(new Customer { FirstName = "Jim", LastName = "Jones", ZipCode = "23434" }); 
      customers.Add(new Customer { FirstName = "Joe", LastName = "Adams", ZipCode = "12312" }); 
      customers.Add(new Customer { FirstName = "Jake", LastName = "Johnson", ZipCode = "23111" }); 
      customers.Add(new Customer { FirstName = "Angie", LastName = "Reckar", ZipCode = "54343" }); 
      customers.Add(new Customer { FirstName = "Jean", LastName = "Anderson", ZipCode = "16623" }); 
      return customers; 
     } 

    } 
} 

Répondre

2

Pls, voir si le code ci-dessous fonctionnerait très bien pour vous. J'ai créé une classe descendante DataGridTextColumn avec la méthode GenerateElement redéfinie. Là, vous pouvez manipuler avec le contrôle TextBlock créé pour la cellule donnée, par exemple modifier sa valeur pour ajouter des chiffres supplémentaires pour les codes postaux.

... 
DataGridTextColumn dgtc2 = new ExtendedDataGridTextColumn(); 
dgtc2.Header = "Zip Code"; 
... 

public class ExtendedDataGridTextColumn : DataGridTextColumn 
{ 
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
    { 
     TextBlock element = (TextBlock)base.GenerateElement(cell, dataItem); 
     element.Text = ((Customer)dataItem).ZipCode + "-0000"; 
     return element; 
    } 
} 

espérons que cette aide, ce qui a trait

+0

qui était exactement ce que je cherchais, merci! –

Questions connexes