【问题标题】:WinForms - Reloading Dynamically Created UserControlWinForms - 重新加载动态创建的用户控件
【发布时间】:2016-03-02 16:57:22
【问题描述】:

我的应用程序获取一个文件列表,为每个文件创建一个面板,并带有一个删除按钮,并将所有面板放在一个 flowPanel 布局中。尽管 它正在创建显示加载面板的面板。请参阅下面的链接。所有这些都很好。我的问题是一旦文件被删除,我需要从我们刚刚删除文件的更新目录中重新加载流程面板。

因为我必须让我的 onclick 静态以保持 RunAsyncProcess() 方法的运行。我无法返回我的 UI 重新加载控件。我希望这是有道理的。我什至很难在这方面为谷歌找到合适的搜索词。

引用加载面板方法如 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);
        }

}

【问题讨论】:

    标签: c# multithreading user-interface


    【解决方案1】:

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

    static bool reload { get; set; }
    

    添加到加载中

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

    添加了 poll 方法来检查我们是否应该重新加载

    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();
    
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 2011-05-31
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多