WinForms - 重新加载动态创建的用户控件
本文关键字:创建 动态 用户 控件 加载 新加载 WinForms | 更新日期: 2023-09-27 18:37:13
我的应用程序获取文件列表 为每个文件创建一个带有删除按钮的面板,并将所有面板放在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);
}
}
添加了标志以显示更改的数据
static bool reload { get; set; }
添加到加载
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();
}
}