【问题标题】:A new form in a main form主窗体中的新窗体
【发布时间】:2012-04-22 14:58:17
【问题描述】:

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

【问题讨论】:

  • 你可以使用它来设置高度和宽度。如果要为当前实例设置它。由于在构造函数内部创建了这个新的 frm2 对象,我有点困惑。
  • 你想在这里做什么,你想在主窗体上按 Escape 键启动 frm2 吗?
  • 表单是一个顶层窗口,它不想成为子控件,除非你使用更大的锤子。 UserControl 是合适的替代品。

标签: c# winforms call


【解决方案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();
    } 
} 

【讨论】:

  • treid,不能写 InitializeComponent();第二种形式
  • 我在第二种形式的 InitializeComponent() 中有一个额外的逗号,刚刚删除它。
  • 不,有点不一样,看看其他答案的cmets
  • 如果您在主窗体上有任何其他控件,则转义键将不起作用,因为焦点将始终在另一个控件中而不是在窗体上。所以逃跑甚至会在那个控制而不是形式上开火。我已经更新了代码。或者,您也可以使用鼠标单击事件来代替按键。
【解决方案2】:
  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.

【讨论】:

  • 嗯。问题是 form1 和 2 都在代码的同一页面上,我正在尝试在第一个表单中创建另一个表单。
  • 您可能应该阅读有关 MDI(MDIChild 和 MDIParent)的信息。 MDI 是子窗体实际上是父窗体的一部分的地方。表单在代码中是完全独立的,但主表单被定义为 MDIParent。
  • 您应该从解决方案中添加您的表单。右键单击解决方案添加新的窗口窗体。这样designer.cs 文件和其他必要的部分就会为您准备好。
  • 我想我希望它可以这样工作,但是好的,我就那样做。谢谢大家的帮助
【解决方案3】:
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_Load 中遇到了同样的问题,当你创建一个新的 frmMain 并订阅它的 KeyPress 时,你真的应该订阅你自己的 KeyPress。

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

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

【讨论】:

  • 两者,我的意思是执行程序没有问题,只是它没有做任何事情。
  • 每当您在主窗体中按 Escape 时,它​​应该会打开一个新的 frm2。在其他人的回答中阅读我对您的评论的评论。
【解决方案4】:

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

}

【讨论】:

  • 我实际上是在尝试在第一个代码中打开一个新表单。没有在解决方案或任何东西中添加第二种形式
  • @AntonioTehSumtin,所以你的意思是 frm2 不在解决方案中??我认为你不能这样做,为什么你不将它添加到解决方案中
猜你喜欢
  • 2010-10-18
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多