2010-07-16 5 views
0

Je viens de VB.Net WinForms venir. Maintenant, je voulais écrire une petite application dans WPF, en listant quelques fichiers dans un datagridview. J'ai utilisé DataGrid de WPF, créé des colonnes. Et puis échoué à ajouter mes lignes.WPF DataGrid Row ajouter dans codebehind

S'il vous plaît, pouvez-vous me aider à choisir le bon moyen d'obtenir mes noms de fichiers, l'état du texte et des vignettes ajoutés à la DataGrid Row?

En WinForms VB.Net je peux ajouter une ligne comme ceci:

Datagridview1.Rows.add(Myvalue, "RowStateText", "Hello World", MyDate) 

Dans DataGrid WPF je peux ajouter

DataGrid1.Items.Add(New DataGridRow()) 

Mais comment remplir mon DataGridRow?

Private Sub AddFilesAndFolders(ByVal Base As IO.DirectoryInfo, ByRef dgv As DataGrid) 
     'For Each di As IO.DirectoryInfo In Base.GetDirectories 
     ' Call AddFilesAndFolders(di, dgv) 
     'Next 

     Dim item As DataGridRow 



     For Each fi As IO.FileInfo In Base.GetFiles 
      item = New DataGridRow'<-- test 1 (row is added but empty) 
      Dim di As New MyFileInfo'<-- test 2 (my own class with public members, but how to add as row with declared columns?) 
      di.FileName = fi.FullName 
      di.FileDate = fi.LastAccessTime 

      item.Item = fi.FullName 
      dgv.Items.Add(di) 
     Next 
    End Sub 
+0

Ok. Maintenant, j'ai décidé d'ajouter l'état actuel du projet en téléchargement: http://www.goldengel.ch/temp/FileContent%20Replacer.zip – Nasenbaer

Répondre

1

Salut: vous devez définir un ItemsSource au lieu d'ajouter des éléments manuellement. Si les colonnes sont correctement configurées, cela fonctionnera simplement!

dbv.ItemsSource = Base.GetFiles 

ou

dbv.ItemsSource = CreateMyFileInfos(Base.GetFiles) 

Si vous avez plus de problèmes, s'il vous plaît poster ici.

Edit: le deuxième inspection, il semble que vous voudrez peut-être faire récursive. Dans ce cas, votre AddFilesAndFolders pourrait plutôt être CreateFilesAndFolders, qui renvoie une collection d'objets FileInfo/MyFileInfo, a fusionné avec les collections produites par l'enfant des dossiers récursive; puis liez toute la liste renvoyée du premier appel à la grille.

Espérons que ça aide!

+0

Salut Kieren. J'ai d'abord essayé votre échantillon: dbv.ItemsSource = Base.GetFiles. Mais cela n'a déjà pas fonctionné. Vous me dites, il pourrait y avoir une fonction CreateMyFileInfos(), comment le dgv sait dans quelle colonne pour définir les données? Je ne peux pas utiliser une liste (de MyClass), puis-je? – Nasenbaer

+0

Avez-vous configuré les colonnes pour votre DataGridView dans le XAML? Cela indique au contrôle quel champ afficher dans chaque colonne –

+0

Ceci est mon code XAML. < DataGridTextColumn tête = "contenu" /> Nasenbaer

0

WPF est un changement d'état d'esprit, vous avez besoin de sortir de la façon de penser Winforms.

En fin de compte, vous devez définir l'ItemsSource à un IEnumerable, de préférence un ObservableCollection.

La meilleure façon de commencer serait de mettre le ObservableCollection comme une propriété publique dans votre fichier code-behind:

public ObservableCollection<DirectoryInfo> files { get;set; } 

Puis dans le constructeur ou un événement de charge sur la fenêtre, remplir la collection avec vos données puis ajouter à la déclaration XAML pour votre DataGrid:

ItemsSource = "{Binding Path=files}" 

EDIT:

J'ai essayé à l'aide de la classe DirectoryInfo, en m code y derrière I a ajouté:

public ObservableCollection<DirectoryInfo> Dir = new ObservableCollection<DirectoryInfo>(); 
    public Window1() 
    { 
     InitializeComponent(); 
     Dir.Add(new DirectoryInfo("c:\\")); 
     Dir.Add(new DirectoryInfo("c:\\temp\\")); 
     dataGrid1.ItemsSource = Dir; 
    } 

Pour une raison quelconque cela ne fonctionnait pas en utilisant la liaison de données via XAML, mais je ne l'ai pas essayé très difficile de le faire fonctionner.

+0

Merci Ben. Je suis sûr que vous avez raison, je dois me le rappeler. S'il vous plaît, pouvez-vous faire un petit exemple. Où dois-je mettre le drapeau Ovservable? Et comment obtenir des chaînes individuelles alors (pas seulement le DirectoryInfo). public ObservableCollection files {get; set; } ? – Nasenbaer

+0

Dans mon code XAML, je n'ai aucune propriété ItemSource à choisir. Ou où mettre? – Nasenbaer

+0

Si les données de votre propre objet utilisées pour la collection sont modifiées pendant l'exécution, vous devez en faire un objet ObservableObject et augmenter propertychange pour chaque valeur qu'il contient. Le DataGrid reflétera automatiquement ces modifications. – Johncl