2010-05-10 3 views
0

J'ai une application C# avec une grille de données sous forme de fenêtres. J'ai besoin de surveiller un répertoire (j'utilise FileSystemWatcher) et actualiser le DataGrid avec la liste des fichiers dans le répertoire. Je ne sais pas comment je peux configurer l'interface pour le faire? L'appel de monitorDirectory() à partir du formulaire Windows Load() ne semble pas fonctionner car Load n'est appelé qu'une seule fois dans l'application.C#: Dataagrid de mise à jour

Merci

Répondre

1

Vous pouvez mettre à jour votre grille dans le gestionnaire d'événements OnChanged ou OnRenamed de votre FileSystemWatcher.

L'exemple du lien ci-dessous traite des événements dans une application de console. MSDN FileSystemWatcher Class

0

Vous pouvez écouter les événements de l'objet FileSystemWatcher. Le MSDN page publie quelques recommandations sur la façon de procéder. Essentiellement, juste avant d'appeler MonitorDirectory(), vous devez souscrire aux événements Modifié, Créé, Supprimé et Renommé de votre FileSystemWatcher.

0

complet Code

Ajouter un Form1 à votre projet

Replace Form1.Designer.cs avec

namespace Test 
{ 
partial class Form1 
{ 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    #region Windows Form Designer generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     this.dataGridView1 = new System.Windows.Forms.DataGridView(); 
     this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); 
     ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); 
     ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit(); 
     this.SuspendLayout(); 
     // 
     // dataGridView1 
     // 
     this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
     this.dataGridView1.Location = new System.Drawing.Point(13, 13); 
     this.dataGridView1.Name = "dataGridView1"; 
     this.dataGridView1.Size = new System.Drawing.Size(240, 150); 
     this.dataGridView1.TabIndex = 0; 
     // 
     // fileSystemWatcher1 
     // 
     this.fileSystemWatcher1.EnableRaisingEvents = true; 
     this.fileSystemWatcher1.Path = "c:\\Temp"; 
     this.fileSystemWatcher1.SynchronizingObject = this; 
     this.fileSystemWatcher1.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_CreatedDeletedChanged); 
     this.fileSystemWatcher1.Created += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_CreatedDeletedChanged); 
     this.fileSystemWatcher1.Deleted += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_CreatedDeletedChanged); 
     this.fileSystemWatcher1.Renamed += new System.IO.RenamedEventHandler(this.fileSystemWatcher1_Renamed); 
     // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(370, 301); 
     this.Controls.Add(this.dataGridView1); 
     this.Name = "Form1"; 
     this.Text = "Form1"; 
     this.Load += new System.EventHandler(this.Form1_Load); 
     ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); 
     ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit(); 
     this.ResumeLayout(false); 

    } 

    #endregion 

    private System.Windows.Forms.DataGridView dataGridView1; 
    private System.IO.FileSystemWatcher fileSystemWatcher1; 
} 
} 

Remplacer Form1.cs avec

using System; 
using System.IO; 
using System.Windows.Forms; 

namespace Test 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void PopulateGrid() 
    { 
     DirectoryInfo dir = new DirectoryInfo(fileSystemWatcher1.Path); 

     dataGridView1.DataSource = dir.GetFiles(); 
    } 


    private void fileSystemWatcher1_CreatedDeletedChanged(object sender, FileSystemEventArgs e) 
    { 
     PopulateGrid(); 
    } 



    private void fileSystemWatcher1_Renamed(object sender, RenamedEventArgs e) 
    { 
     PopulateGrid(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

     PopulateGrid(); 
    } 
} 
} 
+0

qui appelle le FileSystemWatcher? Merci –

+0

Si je comprends la question. Personne ne l'appelle, le contrôle, déclenche des événements par lui-même pour vous faire savoir que quelque chose s'est passé. Donc, pour tester le code ci-dessus, ajoutez un contrôle grid et fileSystemWatcher au formulaire, puis ajoutez un fichier au chemin que vous regardez. – Mike