我有一个带有面板控件的应用程序,该控件使用动态生成的按钮来启动程序。...一个应用程序启动器。 这些按钮在运行时创建,并分配了一个通用事件处理程序,单击该事件将触发“ Process.Start()”。它的工作原理很好:(App和_app只是提供用户可以从数据库中获得哪些按钮的方式。在这种情况下,所有按钮都可用,因此没有窍门)
foreach (App _application in _app)
{
_application.ApplicationSecurities = _appSecurities;
_application.LoginInfo = _info;
Button _but = new Button();
_but.Font = new Font(FontFamily.GenericSerif, 21, FontStyle.Bold);
_but.Height = FontHeight + 80;
_but.Text = _application.ButtonText;
_but.Tag = _application;
_but.Click += Button_Click;
_but.Dock = DockStyle.Top;
string _workingDirectory = Path.Combine(@"C:\Blah\", _application.ExecutableName);
string _appPath = Path.Combine(_workingDirectory, _application.LatestVersion);
_but.ToolTip = _application.LatestVersion;
_buttons.Add(_but);
PnlControls.Controls.Add(_but);
}
问题是,当用户单击一个按钮时,我希望面板上的按钮消失,这与
相同。PnlControls.Controls.Clear();
它们确实消失了,但是如果我在面板上单击(仍在向上),则由该按钮位置表示的应用程序仍会触发click事件并在应用程序关闭时启动! 我尝试了各种方法从该面板中删除事件处理程序,然后在应用程序关闭时重新填充按钮。这是“ DisableAllButtons”函数的最新迭代:
private void DisableAllButtons()
{
foreach (Button _but in _buttons)
{
PnlControls.Controls.Remove(_but);
_but.Click -= null;
_but.Dispose();
}
_buttons.Clear();
}
此处(在click事件中)如何调用流程开始及以上功能
私有无效LaunchApplication(App appToRun) { 字符串_workingDirectory = Path.Combine(@“ C:\ Blah \”,appToRun.ExecutableName);
string _appPath = Path.Combine(_workingDirectory, appToRun.LatestVersion);
try
{
string _start = Path.Combine(_appPath, appToRun.ExecutableName) + ".exe";
Process _proc = new Process();
_proc.StartInfo.FileName = _start;
_proc.StartInfo.Arguments = appToRun.StartingArguments;
DisableAllButtons();
_proc.Start();
_proc.WaitForExit();
CreateButtons();
}
catch (Exception _e)
{
MessageWindow.Show(@"Failed to start application", _e.Message);
}
}
为什么这些按钮在卸下后会触发?