0

在 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.
4

4 回答 4

1
private void frmMain_Load(object sender, EventArgs e)
{
    frmMain fM = new frmMain();
    fM.KeyPress += new KeyPressEventHandler(MMForm);

}

替换为:

private void frmMain_Load(object sender, EventArgs e)
{
    this.KeyPress += new KeyPressEventHandler(MMForm);
}

或者您可以通过设计器直接注册到您自己的 KeyPress 到 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;
}

即使您不想初始化组件,您也应该编辑您自己的 (this) 属性,而不是新的 frm2 属性。当您创建一个新的 frmMain 并订阅它的 KeyPress 时,您在 frmMain_Load 中遇到了同样的问题,而实际上您应该订阅自己的 KeyPress。

此外,您可以缩短 MMForm 来美化,如下所示:

private void MMForm(object sender, KeyPressEventArgs e)
{
    if ((Keys)sender == Keys.Escape)
    {
        new frm2().Show();
    }
}
于 2012-04-22T15:02:14.477 回答
1
  1. frm2 不使用 InitializeComponent() 命令。所以将它添加到您的代码中。
  2. 其次,您尝试将 frm2 对象添加到自身,因此它不起作用。

您应该为现有表单使用代码 belove(如果您不调整表单大小,请从属性中设置其权重。

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.
于 2012-04-22T15:03:57.237 回答
1

你可以这样做:

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();
    } 
} 
于 2012-04-22T15:10:44.397 回答
1

如果您在主窗体上按下转义键时尝试打开 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 });
    }

}
于 2012-04-22T15:14:45.187 回答