Как добавить элементы управления, когда событие запускается в WinForm? - PullRequest
0 голосов
/ 02 февраля 2012

Я хотел бы добавить элементы управления внутри 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 Ответ

1 голос
/ 02 февраля 2012

Это то, что вы ищете.Из того, что вы прокомментировали, вы, вероятно, не устанавливали местоположение и размер, поэтому добавление элемента управления, вероятно, не работало.Но вы должны убедиться, что это регулируется и вы добавляете элементы управления именно тогда, когда хотите, и не более.

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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...