2016-03-02 49 views
1

我的应用程序获取的文件列表创建与删除按钮的每个文件面板将所有面板在flowPanel布局。而 它正在创建它显示加载面板的面板。请参阅下面的链接。所有这一切都很好。我的问题是一旦文件被删除我需要重新加载流程面板从我们刚刚删除文件的更新目录。的WinForms - 重装动态创建用户控件

因为我必须让我的onclick静态保持RunAsyncProcess()方法高兴。我不能回到我的用户界面来重新加载控件。我希望这是有道理的。我很努力甚至找到正确的谷歌搜索条件。

参考到装载面板的方法,如RunAsyncOperation(MyDelegate1);在这里找到。 http://www.codeproject.com/Articles/24044/AJAX-style-Asynchronous-Progress-Dialog-for-WinFor

这是我控制的加载方式。

private void button1_Click(object sender, EventArgs e) 
    { 
     SuspendLayout(); 
     Control ctrl = Parent.Parent.Controls.Find("MainControlPanel", false).First(); 
     MyControl myControl = new MyControl(); 
     myControl .Dock = DockStyle.Fill; 
     Parent.Controls.Remove(this);//removes a menu control 
     ctrl.Controls.Add(myControl); 
     ResumeLayout(); 
    } 

这里是控制

bool isLoaded {get; set;} 
List<Panel> panels {get; set;} 

protected override void OnLoad(EventArgs e) 
{ 
     isLoaded = false; 
     panels = new List<Panel>(); 
     RunAsyncOperation(MyDelegate1); 
     RunAsyncOperation(MyDelegate2); 
     while (!isLoaded) { //just wait } 
      foreach (Panel panel in panels) 
      { 
       flowLayoutPanel1.Controls.Add(panel); 
      } 
} 

AsyncProcessDelegate MyDelagate = delegate() 
{ 
    //setting up the ui 
    string[] list = ... 
     foreach(in list) 
     { 
      Panel p1 = new Panel(); 
      Button btn = new Button() 
      btn.Click += new EventHandler(MyEvent); // my event must be static 
      p1.Controls.Add(btn)     
      panels.Add(p1); 
     } 

    isloaded = true; 

} 

AsyncProcessDelegate MyDelagate2 = delegate() 
{ 
      while (!isLoaded) 
      { 
       //showing the loading ui 
       Thread.Sleep(5000); 
      } 
}; 

public static void MyEvent(object sender, EventArgs e) 
{ 

      Modifies string[] list and needs to reload 
      is there a way to call onload again? 
      How can I make it reload 

    //this does not work 
    flowLayoutPanel1.Controls.Clear(); 
    RunAsyncOperation(MyDelegate1); 
    RunAsyncOperation(MyDelegate2); 
    while (!isLoaded) { //just wait } 
     foreach (Panel panel in panels) 
     { 
      flowLayoutPanel1.Controls.Add(panel); 
     } 

} 

回答

0

添加标志,以显示更改后的数据

static bool reload { get; set; } 

加入到为onload

stopwatch = new Stopwatch(); 
      reload = false; 
      stopwatch.Start(); 
      PollUpdate(); 

新增调查的方法来检查我们是否应该重新加载

public void PollUpdate() 
     { 
      while (true) 
      { 
       if (reload) 
       { 
        stopwatch.Stop(); 
        reload = false; 
        SuspendLayout(); 
        Control ctrl = Parent.Parent.Controls.Find("MainControlPanel", false).First(); 
        AudioLibraryControl cr = new AudioLibraryControl(); 
        cr.Dock = DockStyle.Fill; 
        Parent.Controls.Remove(this); 
        ctrl.Controls.Add(cr); 
        ResumeLayout(); 
       } 
       Application.DoEvents(); 

      } 
     }