Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 主窗体中的新窗体_C#_Winforms_Call - Fatal编程技术网

C# 主窗体中的新窗体

C# 主窗体中的新窗体,c#,winforms,call,C#,Winforms,Call,在C#表单中,我需要代码将第二个表单添加到现有表单中。这就是我尝试过的: 第一种形式: public partial class frmMain : Form { public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { frmMain fM = new frmMain();

在C#表单中,我需要代码将第二个表单添加到现有表单中。这就是我尝试过的:

第一种形式:

public partial class frmMain : Form
{
    public frmMain()
    {
        InitializeComponent();
    }
    private void frmMain_Load(object sender, EventArgs e)
    {
        frmMain fM = new frmMain();
        fM.KeyPress += new KeyPressEventHandler(MMForm);

    }
    private void MMForm(object sender, KeyPressEventArgs e)
    {
        Keys KP; KP = (Keys)sender;
        if (KP == Keys.Escape) { frm2 fM2 = new frm2(); fM2.Show(); }

    }
}
这是第二种形式:

public class frm2 : Form
{
    public frm2()
    {
        frm2 fM2 = new frm2();
        fM2.Height = 200; fM2.Width = 200;
        Controls.AddRange(new System.Windows.Forms.Form[] { fM2 });
    }

}
我错过了什么

编辑:暂时忘掉这一切。即使我按照下面的建议去做,当我按下键的时候也会出错

An unhandled exception of type 'System.InvalidCastException' occurred in Project 09.exe
Additional information: Specified cast is not valid.
替换为:

private void frmMain_Load(object sender, EventArgs e)
{
    this.KeyPress += new KeyPressEventHandler(MMForm);
}
或者你可以通过designer注册到你自己的按键,直接注册到MMForm

此外,还不清楚您在这里试图做什么:

public frm2()
{
    frm2 fM2 = new frm2();
    fM2.Height = 200; fM2.Width = 200;
    Controls.AddRange(new System.Windows.Forms.Form[] { fM2 });
}
它应该看起来更像这样:

public frm2()
{
    InitializeComponents();
    this.Height = 200;
    this.Width = 200;
}
即使您不想初始化组件,也应该编辑自己的(此)属性,而不是新的frm2属性。 当你创建了一个新的frmMain并订阅了它的按键时,你在frmMain_加载中也遇到了同样的问题,而实际上你应该订阅自己的按键

此外,您还可以缩短MMForm以进行美化,例如:

private void MMForm(object sender, KeyPressEventArgs e)
{
    if ((Keys)sender == Keys.Escape)
    {
        new frm2().Show();
    }
}
替换为:

private void frmMain_Load(object sender, EventArgs e)
{
    this.KeyPress += new KeyPressEventHandler(MMForm);
}
或者你可以通过designer注册到你自己的按键,直接注册到MMForm

此外,还不清楚您在这里试图做什么:

public frm2()
{
    frm2 fM2 = new frm2();
    fM2.Height = 200; fM2.Width = 200;
    Controls.AddRange(new System.Windows.Forms.Form[] { fM2 });
}
它应该看起来更像这样:

public frm2()
{
    InitializeComponents();
    this.Height = 200;
    this.Width = 200;
}
即使您不想初始化组件,也应该编辑自己的(此)属性,而不是新的frm2属性。 当你创建了一个新的frmMain并订阅了它的按键时,你在frmMain_加载中也遇到了同样的问题,而实际上你应该订阅自己的按键

此外,您还可以缩短MMForm以进行美化,例如:

private void MMForm(object sender, KeyPressEventArgs e)
{
    if ((Keys)sender == Keys.Escape)
    {
        new frm2().Show();
    }
}
  • frm2不使用InitializeComponent()命令。因此,将其添加到您的代码中
  • 其次,您尝试将frm2对象添加到其自身,因此它将不起作用 您应该在退出表单时使用下面的代码(如果不调整表单大小,请从属性设置其权重)

    public class frm2 : Form 
    { 
        public frm2() 
        {  
            InitializeComponent(); ,
            this.Width = 200; this.Height = 200; 
        } 
    } 
    
    如果要显示frm2,则在特殊键之后:

    frm2 secondFrom = new frm2();
    frm2.Show(); // frm2.ShowDialog(); works too but they are working differently.
    
  • frm2不使用InitializeComponent()命令。因此,请将其添加到代码中
  • 其次,您尝试将frm2对象添加到其自身,因此它将不起作用
  • 您应该在退出表单时使用下面的代码(如果不调整表单大小,请从属性设置其权重)

    public class frm2 : Form 
    { 
        public frm2() 
        {  
            InitializeComponent(); ,
            this.Width = 200; this.Height = 200; 
        } 
    } 
    
    如果要显示frm2,则在特殊键之后:

    frm2 secondFrom = new frm2();
    frm2.Show(); // frm2.ShowDialog(); works too but they are working differently.
    
    您可以这样做:

    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        private void frmMain_Load(object sender, EventArgs e)
        {
            this.private void MMForm(object sender, KeyPressEventArgs e)
        }
        private void MMForm(object sender, KeyPressEventArgs e)
         {
            if (e.KeyChar == Convert.ToChar(((int)Keys.Escape)))
            {
                frm2 fM2 = new frm2(); fm2.Height=200; fm2.Width=200; fM2.Show(); 
            }
    }
    
    public class frm2 : Form 
    { 
        public frm2() 
        {  
            InitializeComponent();
        } 
    } 
    
    您可以这样做:

    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        private void frmMain_Load(object sender, EventArgs e)
        {
            this.private void MMForm(object sender, KeyPressEventArgs e)
        }
        private void MMForm(object sender, KeyPressEventArgs e)
         {
            if (e.KeyChar == Convert.ToChar(((int)Keys.Escape)))
            {
                frm2 fM2 = new frm2(); fm2.Height=200; fm2.Width=200; fM2.Show(); 
            }
    }
    
    public class frm2 : Form 
    { 
        public frm2() 
        {  
            InitializeComponent();
        } 
    } 
    

    如果您试图在按下主窗体上的escape键时打开frm2,请执行以下操作:

    public frmMain()
        {
            InitializeComponent();
            this.KeyPress += new KeyPressEventHandler(MMForm);
        }
    //You don't need to put anything in form load
        private void frmMain_Load(object sender, EventArgs e)
        {
        }
    
    //This is fine
        private void MMForm(object sender, KeyPressEventArgs e)
        {
            Keys KP; KP = (Keys)sender;
            if (KP == Keys.Escape) { frm2 fM2 = new frm2(); fM2.Show(); }
        }
    
    在frm2中,请执行以下操作:

    public class frm2 : Form
    {
        public frm2()
        {
            InitializeComponent();
            this.Height = 200; this.Width = 200;
            Controls.AddRange(new System.Windows.Forms.Form[] { fM2 });
        }
    
    }
    

    如果您试图在按下主窗体上的escape键时打开frm2,请执行以下操作:

    public frmMain()
        {
            InitializeComponent();
            this.KeyPress += new KeyPressEventHandler(MMForm);
        }
    //You don't need to put anything in form load
        private void frmMain_Load(object sender, EventArgs e)
        {
        }
    
    //This is fine
        private void MMForm(object sender, KeyPressEventArgs e)
        {
            Keys KP; KP = (Keys)sender;
            if (KP == Keys.Escape) { frm2 fM2 = new frm2(); fM2.Show(); }
        }
    
    在frm2中,请执行以下操作:

    public class frm2 : Form
    {
        public frm2()
        {
            InitializeComponent();
            this.Height = 200; this.Width = 200;
            Controls.AddRange(new System.Windows.Forms.Form[] { fM2 });
        }
    
    }
    


    您可以使用此设置高度和宽度。如果您想为当前实例设置高度和宽度。我有点困惑,因为构造函数中创建了frm2的新对象。您想在这里做什么,您想在主窗体上按Escape键时启动frm2吗?窗体是顶级窗口,不想成为子控件ss你使用一个更大的锤子。UserControl是一个合适的替代品。你可以用它来设置高度和宽度。如果你想为当前实例设置它。我有点困惑,因为在构造函数内部创建了frm2这个新对象。你想在这里做什么,你想在主窗体上按Escape键时启动frm2吗?a为m是一个顶级窗口,除非您使用更大的锤子,否则它不希望成为子控件。UserControl是一个合适的替代品。hmmm。问题是form1和Form2都在代码的同一页上,我正在尝试在第一个窗体中创建另一个窗体。您可能应该阅读有关MDI(MDIChild和MDIPerent)的内容.MDI是子窗体实际上是父窗体的一部分的地方。这些窗体在代码上是完全独立的,但主窗体被定义为MDIPORENT。您应该从解决方案中添加窗体。右键单击解决方案添加新的windows窗体。因此,designer.cs文件和其他必要的部分将为您准备就绪。我想我希望它能在这方面起作用是的,但好的,我就这样做。谢谢你的帮助allhmmm。问题是form1和Form2都在代码的同一页上,我正在尝试在第一个表单中创建另一个表单。你可能应该阅读有关MDI(MDIChild和MDIPerent)的内容.MDI是子窗体实际上是父窗体的一部分的地方。这些窗体在代码上是完全独立的,但主窗体被定义为MDIPORENT。您应该从解决方案中添加窗体。右键单击解决方案添加新的windows窗体。因此,designer.cs文件和其他必要的部分将为您准备就绪。我想我希望它能在这方面起作用是的,但好吧,我就这样做。谢谢大家的帮助。我的意思是,执行程序没有问题,只是它什么都不做。只要你在主窗体中按Escape,它就会打开一个新的frm2。在另一个人的回答中阅读我对你的评论。两者,我的意思是执行程序没有问题it’只是它不起任何作用。当你在主窗体中按Escape时,它应该会打开一个新的frm2。在其他人的回答中阅读我对你的评论。treid,不能写InitializeComponent();在第二种形式中,我在InitializeComponent()中有一个额外的逗号对于第二个表单,只是删除了它。不,这有点不同,看看其他答案上的注释,如果主表单上有任何其他控件,则退出键将不起作用,因为焦点始终在其他控件而不是表单上。因此,退出甚至会在该控件而不是表单上启动。我已更新了代码。或者,您可以使用鼠标单击事件,而不是key press.treid,无法写入InitializeComponent();在第二种形式中,我在InitializeComponent()中有一个额外的逗号对于第二个表单,只是删除了它。不,这有点不同,看看其他答案上的注释,如果主表单上有任何其他控件,则退出键将不起作用,因为焦点始终在其他控件而不是表单上。因此,退出甚至会在该控件而不是表单上启动。我已更新了代码。或者,您可以使用鼠标点击事件,而不是按键。我是act