如何在WinForm中触发事件时添加控件?

时间:2012-02-02 04:20:09

标签: c# .net winforms

我想在form1中添加控件,其中包含事件处理程序    watcher.Changed + = new FileSystemEventHandler(OnChanged);已定义,是否可以将示例列表框的控件添加到form1,但需要在定义它的事件处理程序中添加

  /*event added*/ 

   private void btn_start_Click(object sender, EventArgs e)
    {
        string[] args = {this.txtfolder.Text};
        if (args.Length != 1)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Invalid Operation");
            return;
        }

        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[0];
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = this.txtfilter.Text;//"*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        // watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);



   // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        //Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);

        //   Form1 F   ;        
       // ListBox lst = new ListBox();
        //lst.Items.Add("File: " + e.FullPath + " " + e.ChangeType.ToString());
        //f.lsttracker.Items.Add("File: " + e.FullPath + " " + e.ChangeType.ToString());
       // F.controls.Add(lst);

1 个答案:

答案 0 :(得分:1)

这就是你要找的东西。根据您的注释,您可能没有设置位置和大小,因此添加控件可能无法正常工作。但是你应该确保规范这一点,并确保你只是在你想要的时候准确地添加控件而不是更多。

private static void OnChanged(object source, FileSystemEventArgs e)
{
    ListBox toAdd = new ListBox();
    toAdd.Location = new Point(20,20);
    toAdd.Size = new Size(200,200);
    this.Controls.Add(toAdd);
}

如果您想存储添加的控件,请尝试以下操作:

private List<Control> AddedItems = new List<Controls>();
private int OffsetY = 0;
private static void OnChanged(object source, FileSystemEventArgs e)
{
    ListBox toAdd = new ListBox();
    if(AddedItem.Last().Point.Y == OffsetY) // just an example of reusing previously added items.
    {
         toAdd.Location = new Point(20, OffsetY);
         toAdd.Size = new Size(200,200);
         AddedItems.Add(toAdd);
         this.Controls.Add(toAdd);
    }
    OffsetY += 200;
}

编辑:回复你在下面评论中提到的内容。

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    private void btn_start_Click(object sender, EventArgs e)
    {
        string FolderPath = this.txtfolder.Text;
        string Filter = this.txtfilter.Text;
        if(!Directory.Exists(FolderPath))
        {
            Console.WriteLine("Not a valid directory"); //checks directory is valid
            return;
        }

        FileSystemWatcher watcher = new FileSystemWatcher();

        watcher.Path = FolderPath;
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                               | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch filter files.
        watcher.Filter = Filter;

        watcher.IncludeSubdirectories = true; //monitor subdirectories?
        watcher.EnableRaisingEvents = true; //allows for changed events to be fired.

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
    }
    //Delegate to get back to UI thread since OnChanged fires on non-UI thread.
    private delegate void updateListbox(string context);
    private void OnChanged(object source, FileSystemEventArgs e)
    {
        this.Invoke(new updateListbox(UpdateListbox), "File: " + e.Name);
        this.Invoke(new updateListbox(UpdateListbox), ">>Action: " + e.ChangeType);
        this.Invoke(new updateListbox(UpdateListbox), ">>Path: " + e.FullPath);
    }
    public void UpdateListbox(string context)
    {
        lsttracker.Items.Add(context);
    }