从面板中删除后,动态创建的按钮仍会触发“点击”事件

时间:2018-08-23 17:36:40

标签: c# winforms

我有一个带有面板控件的应用程序,该控件使用动态生成的按钮来启动程序。...一个应用程序启动器。 这些按钮在运行时创建,并分配了一个通用事件处理程序,单击该事件将触发“ 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);
    }
}

为什么这些按钮在卸下后会触发?

0 个答案:

没有答案