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

时间:2014-12-11 19:05:22

标签: c# .net winforms

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

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

我有一个menustrip按钮,它调用以下方法,

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(),但应用程序崩溃了,我不知道原因。

1 个答案:

答案 0 :(得分:0)

我认为,很清楚你为何会遇到这个问题。 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。删除将自动启用欢迎屏幕