【问题标题】:Form returning null after coming back to the initial user control返回初始用户控件后的表单返回 null
【发布时间】:2012-04-15 06:12:43
【问题描述】:

我是 Windows 窗体的新手,在处理所有用户控件时遇到问题。我有 3 个用户控件,当我单击接受按钮时,它会将我带到第二个屏幕(即用户控件 2),但是当我在第二个屏幕上单击取消时,它会将我带回第一个屏幕(我加载第一个屏幕再次用户控件)现在的问题是,当我再次单击“接受”时,欢迎用户控件返回 null 和错误。

private void Viewer_Load(object sender, EventArgs e) { formPanel.Controls.Clear(); formPanel.Controls.Add(wel); }

    private void SwapControls(object sender, EventArgs e)
    {
        if (formPanel.Controls.Contains(wel))
        {
            formPanel.Controls.Remove(wel);
            formPanel.Controls.Add(p);
        }
        else if (formPanel.Controls.Contains(pin) && IsAuthenticated)
        {
            formPanel.Controls.Remove(p);
            formPanel.Controls.Add(m);
        }
        else if(formPanel.Controls.Contains(pin) && !Global.IsAuthenticated)
        {
            formPanel.Controls.Remove(p);
            formPanel.Controls.Add(wel);
        }

所以第一次加载欢迎用户控件,然后我点击“接受”并清除用户控件并加载第二个“输入引脚控件”,当我点击“取消”时,我删除该用户控件并再次加载欢迎。但是现在,当我单击接受时,我在欢迎用户控件的这一行中得到一个空值

 this.AddControl(this, new EventArgs());

再次,我是 Windows 窗体的新手,我正在学习,任何输入将不胜感激。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    由于您正在重用您的UserControls,因此当您从Form 中移除处理程序时,请不要移除它们,只需确保在您使用完UserControls 后移除它们即可。

    试试这样的。

    private void SwapControls(object sender, EventArgs e) 
    { 
        if (formPanel.Controls.Contains(wel)) 
        { 
            formPanel.Controls.Remove(wel); 
            formPanel.Controls.Add(pin); 
        } 
        else if (formPanel.Controls.Contains(pin) && Global.Instance.IsAuthenticated) 
        { 
            formPanel.Controls.Remove(pin); 
            formPanel.Controls.Add(mmenu); 
        } 
        else 
        { 
            formPanel.Controls.Remove(pin); 
            formPanel.Controls.Add(wel); 
        } 
    } 
    

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        wel.AddControl -= new EventHandler(SwapControls);
        pin.AddControl -= new EventHandler(SwapControls);
        pin.ReturnWelcome -= new EventHandler(SwapControls); 
    
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
    

    【讨论】:

    • 谢谢你的工作,我唯一不明白的是当我需要删除处理程序时......我可以把它们留在那里吗?。
    • 如果你的 UserControls 总是被实例化,我会在你的 Form 的 Dispose 方法中删除它们
    • 对不起,我将如何删除用户控件?在处置部分?
    • MSDN article。我说的是处理程序而不是控件。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2021-05-24
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2017-09-09
    • 2015-01-03
    相关资源
    最近更新 更多