2010-07-30 7 views
0

VS 2010, projet WPF.Comment mettre des textboxes dans une grille de données?

J'ai une grille de données avec du texte dans toutes les cellules (les données proviennent d'un tableau d'objets personnalisés). Cependant, je suis incapable de copier (ctrl + c) le contenu de n'importe quelle cellule. Je voudrais donc utiliser des zones de texte pour afficher le contenu de chaque cellule. Le vrai problème est que je ne peux pas le faire en XAML mais je dois le faire dynamiquement dans le code, car toute la grille est construite manuellement dans le code, donc XAML sait seulement qu'il y a une grille.

J'ai ajouté les colonnes de cette façon - tout ce que j'ai trouvé lié à la colonne est que je peux spécifier le modèle d'en-tête. Comment construire un modèle de cellule pour cela et définir le widget à la zone de texte?

  int i = 0; 

      foreach (var db_col in query.FieldNames) 
      { 
       var col = new DataGridTextColumn(); 
       col.IsReadOnly = false; 
       col.Header = db_col; 
       col.Binding = new Binding(String.Format("Visual[{0}]", i)); 
       grid.Columns.Add(col); 

       ++i; 
      } 

Merci d'avance.

Solved

Merci à Marko, je suis finalement venu avec cette solution.

 foreach (var db_col in query.FieldNames) 
     { 
       var template = new DataTemplate(); 
       var elemFactory = new FrameworkElementFactory(typeof(TextBox)); 
       elemFactory.SetBinding(TextBox.TextProperty, new Binding(String.Format("Visual[{0}]", i))); 
       template.VisualTree = elemFactory; 

       var col = new DataGridTemplateColumn(); 
       col.CellTemplate = template; 
       col.IsReadOnly = true; 
       col.Header = db_col; 
       grid.Columns.Add(col); 

       ++i; 
     } 

Répondre

1

Tout d'abord, le DataGridTextColumn utilise un TextBlock pour afficher les données, lorsque la cellule est pas en mode d'édition. C'est probablement pourquoi vous ne pouvez rien copier. Une fois que vous entrez en mode d'édition, le TextBlock est remplacé par un TextBox et vous devriez pouvoir copier/coller comme vous le feriez normalement. Considérant que le code que vous avez posté ne fournit pas la fonctionnalité que vous voulez, je ne peux que supposer que vous voulez toujours afficher un TextBox. Pour ce faire, vous devez utiliser un DataGridTemplateColumn. Donc, dans votre code derrière vous créer un nouveau DataGridTemplateColumn, définissez CellTemplate à un nouveau DataTemplate qui inturn contient un TextBox. Vous devriez trouver quelques échantillons pour créer un DataTemplate avec une zone de texte ici: Can i create DataTemplate in code-behind?

Notez également que si vous créez un DataGridTemplateColumn vous devez réimplémenter (si nécessaire) un comportement qui est construit pour les autres colonnes DataGrid. Par exemple si le DataGrid est défini sur IsReadOnly = true, votre DataGridTemplateColumn avec votre TextBox est toujours modifiable. Vous devez donc lier la propriété TextBox.IsReadOnly à la propriété DataGrid.IsReadOnly.

+0

Excellent! Je vous remercie. Au début, j'ai eu un problème avec le réglage du modèle pour une cellule, parce que j'ai oublié de changer le type de la colonne. – greenoldman

Questions connexes