C# WinForms-重新加载动态创建的UserControl
我的应用程序获得一个文件列表,使用删除按钮为每个文件创建一个面板,并将所有面板置于flowPanel布局中。虽然 它正在创建面板,并显示加载面板。请参阅下面的链接。所有这些都很有效。我的问题是,一旦文件被删除,我需要从更新的目录中重新加载flowpanel,我们刚刚删除了一个文件 因为我必须使onclick保持静态,以使RunAsyncProcess()方法满意。我无法返回UI重新加载控件。我希望这是有意义的。我甚至都在努力为谷歌找到合适的搜索词 参考加载面板方法,如RunAsyncOperation(MyDelegate1);在这里找到的。 下面是我的控件的加载方式C# WinForms-重新加载动态创建的UserControl,c#,multithreading,user-interface,C#,Multithreading,User Interface,我的应用程序获得一个文件列表,使用删除按钮为每个文件创建一个面板,并将所有面板置于flowPanel布局中。虽然 它正在创建面板,并显示加载面板。请参阅下面的链接。所有这些都很有效。我的问题是,一旦文件被删除,我需要从更新的目录中重新加载flowpanel,我们刚刚删除了一个文件 因为我必须使onclick保持静态,以使RunAsyncProcess()方法满意。我无法返回UI重新加载控件。我希望这是有意义的。我甚至都在努力为谷歌找到合适的搜索词 参考加载面板方法,如RunAsyncOperat
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);
}
}
bool已加载{get;set;}
列表面板{get;set;}
受保护的覆盖无效加载(事件参数e)
{
isLoaded=false;
面板=新列表();
运行异步操作(MyDelegate1);
运行异步操作(MyDelegate2);
而(!isLoaded){//请稍候}
foreach(面板中的面板)
{
flowLayoutPanel1.Controls.Add(面板);
}
}
AsyncProcessDelegate MyDelagate=委托()
{
//设置用户界面
字符串[]列表=。。。
foreach(在列表中)
{
面板p1=新面板();
按钮btn=新按钮()
btn.Click+=neweventhandler(MyEvent);//我的事件必须是静态的
p1.控件添加(btn)
添加(p1);
}
isloaded=true;
}
AsyncProcessDelegate MyDelagate2=委托()
{
当(!已加载)
{
//显示加载ui
睡眠(5000);
}
};
公共静态void MyEvent(对象发送方,事件参数e)
{
修改字符串[]列表并需要重新加载
有没有办法再次调用onload?
我怎样才能让它重新加载
//这行不通
flowLayoutPanel1.Controls.Clear();
运行异步操作(MyDelegate1);
运行异步操作(MyDelegate2);
而(!isLoaded){//请稍候}
foreach(面板中的面板)
{
flowLayoutPanel1.Controls.Add(面板);
}
}
添加了显示更改数据的标志
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();
}
}
添加了显示已更改数据的标志
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();
}
}