每次在面板中关闭任何其他用户控件时,添加默认用户控件

本文关键字:控件 用户 其他 默认 添加 任何 | 更新日期: 2023-09-27 18:33:57

每次

用户关闭同一面板上的任何其他用户控件时,我一直在尝试加载默认用户控件。我有一个名为 MainContainer 的面板,当主窗体加载时,我调用以下方法来加载名为 welcome的默认用户控件。

public void AddUserControlWelcome()
{
    MainContainer.Controls.Clear();
    welcome.Dock = DockStyle.Fill;
    MainContainer.Controls.Add(welcome);
}

我有一个菜单条按钮,它调用以下方法,

private void sellItemsToolStripMenuItem_Click(object sender, EventArgs e)
{
    AddUserControlSellManager();
}

它被定义为,

public void AddUserControlSellManager()
{
    MainContainer.Controls.Clear();
    sellManager.Dock = DockStyle.Fill;
    MainContainer.Controls.Add(sellManager);
}
因此,sellManager

用户控件上有一个按钮,它实际上关闭了sellManager。之后,我再次从MainContainer_ControlRemoved(对象发送器,ControlEventArgs e)调用AddUserControlWelcome(),但应用程序崩溃了,我不知道为什么。

每次在面板中关闭任何其他用户控件时,添加默认用户控件

我认为,很明显为什么你会遇到这个问题。 MainContainer_ControlRemoved不仅在删除"出售"时调用,而且在删除"欢迎"时也会调用。所以,我认为罪魁祸首是你确实在MainContainer_ControlRemoved这样的事件上添加了控制,这是你不应该做的。与.Net一样好,有时您必须避免将某些事件用于某些目的,否则会遇到问题。

尝试做这样的事情。考虑到图面一次只能托管一个控件

class SurfaceManager
{
    private Control _defaultCtrl;
    private bool _currentDefault;
    private Control _surface;
    void SurfaceManager(Control _surface, Control defaultCtrl) 
    {
        _surface = surface;
        _defaultCtrl = defaultCtrl;
        _surface = surface.Controls.Add(_defaultCtrl);
        _currentDefault = true;
    }
    public Control Add(Control ctrl)
    {
        Control c = null; // Returning removed control so you can do something else with it
        if (_surface.Controls.Count > 0)
        {
            if (!_currentDefault)
                c = _surface.Controls[0];
            _surface.Controls.Clear();
        }           
        _surface = surface.Controls.Add(ctrl);
        _currentDefault = false;
        Return c;
    }
    public Control Remove()
    {
        if (_currentDefault) Return // Current is default - do nothing
        Control c = null; // Returning removed control so you can do something else with it
        if (_surface.Controls.Count > 0)
        {
            c = _surface.Controls[0];
            _surface.Controls.Clear();
        }           
        _surface = surface.Controls.Add(_defaultCtrl);
        _currentDefault = true;
        Return c;
    }
}

现在,在您的类中创建此管理器的实例并使用 AddRemove 。删除将自动打开欢迎屏幕