【问题标题】:How to write a class method to dispose an existing form in c#如何编写一个类方法来处理c#中的现有表单
【发布时间】:2012-06-20 10:46:38
【问题描述】:

我的项目中有两个表单,form1 和 form2。我在我的项目中添加了一个新类。它有一个接受表单对象的方法,它应该能够做以下事情。

  1. 显示接受的表单对象 (frm.ShowDialog())

  2. 当我在显示的表单 (frm) 上按 enter 键时,它应该关闭。 (不向 form2 的 keydown 事件添加代码)。它应该由新添加的类来处理。

我尝试添加新的 keyeventhandler,但我不知道如何从这里开始。 (Dispose()不起作用)请帮我解决这个问题。谢谢。

class Class1
{
    public static void SearchResultBox(Form2 frm) 
    {            
        frm.KeyDown += new KeyEventHandler(frm_KeyDown);
        frm.ShowDialog();

    }

    static void frm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode==Keys.Enter)
        {


        }
        throw new NotImplementedException();
    }

}

【问题讨论】:

    标签: c#


    【解决方案1】:

    您需要保留对传入表单的引用,然后使用该引用关闭表单

    class Class1 
    {   
        private static Form2 _frm = null;  
        public static void SearchResultBox(Form2 frm)      
        {                     
             _frm = frm;
             frm.KeyDown += new KeyEventHandler(frm_KeyDown);         
             frm.ShowDialog();      
        }      
        static void frm_KeyDown(object sender, KeyEventArgs e)     
        {         
            if (e.KeyCode==Keys.Enter)         
            {     
                 if(_frm != null)
                 {      
                     _frm.Close();
                     _frm.Dispose();
                 }
            }         
        }
    }  
    

    【讨论】:

    • 谢谢你,史蒂夫。这给了我一个错误。 "警告 1 字段 'WindowsFormsApplication15.Class1._frm' 从未分配给,并且始终具有其默认值 null"
    • 答案已更新。我认为这将避免错误,但现在无法测试。
    【解决方案2】:

    创建自己的Form 类并使用AcceptButton,像这样

    public class MyOwnForm : Form 
    {
        private override OnLoad(...)
        {
            base.OnLoad(..);
    
            AcceptButton = yourOkButtonObject;
        }
    }
    

    其中yourOkButtonObject 是我假设出现在您的表单上的“OK”按钮的对象。如果没有其他任何确认表单的按钮。

    【讨论】:

    • 您将表单的 AcceptButton 设置为您希望在 your 表单类型中按下 ENTER 按钮时“单击”的按钮。在您的程序中使用您的表单类型后。因此,您的应用程序中的 所有 表单将在按下 ENTER 按钮时关闭
    【解决方案3】:

    frm.close() 和 frm.dispose() 不会执行您要求的任务。

    static void frm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode==Keys.Enter)
        {
            frm.close();
            frm.dispose();
    
        }
        throw new NotImplementedException();
    }
    

    【讨论】:

    • 谢谢你嗯。 frm.close() 和 frm.dispose() 不起作用,因为我在课堂上使用了不同的方法。
    • @charr - 你是什么意思它确实有效?如果您要发送对表单的引用,那么它应该可以工作,前提是您当然要调用该方法。
    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2019-09-17
    • 2014-01-12
    • 2020-02-10
    相关资源
    最近更新 更多