动态创建表格&集装箱

时间:2014-11-23 11:15:03

标签: c# winforms

我对C#很新。

以下是我尝试在代码中创建表单和容器的代码;但我遇到了问题。

  1. 我从一个新的Windows Forms Application模板开始。
  2. 我稍微更改了Program.cs文件,以便我能够动态创建FormMain
  3. 当评论Container.Add(BtnClose)中的行BtnClose_Setup()FormMain.cs时,代码会编译并运行。但是,该计划仍有一些奇怪的结果。
  4. (a)表格FormMain应该出现在(20,20)(左上角),如FormMain_Setup所说;但是当我运行应用程序时,虽然宽度和宽度高度设置按预期显示(800,600),左上角每次都会更改(不会粘到20,20)。

    (b)esc键按预期工作并关闭表单和应用程序。

    1. Container.Add(BtnClose)中的行BtnClose_Setup()FormMain.cs 评论时,代码会编译,但VS会在运行时向我发送消息:" 未处理的类型' System.TypeInitializationException'发生在mscorlib.dll "
    2. 有人能告诉我我做错了吗?

      Program.cs档案:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      
      namespace test {
          static class Program {
              public static FormMain FormMain = new FormMain();
              [STAThread]
              static void Main() {
                  Application.Run(FormMain);
              }
          }
      }
      

      FormMain.cs档案:

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      
      namespace test {
          public partial class FormMain : Form {
              Button BtnClose = new Button();
              public void BtnClose_Setup() {
                  BtnClose.Text = "Ok";
                  BtnClose.Top = 500;
                  BtnClose.Left = 700;
              }
              public void FormMain_Setup() {
                  Top = 20;
                  Left = 20;
                  Width = 800;
                  Height = 600;
                  KeyDown += FormMain_KeyDown;
                  //Container.Add(BtnClose);
                  //BtnClose_Setup();
              }
              void FormMain_KeyDown(object sender, KeyEventArgs e) {
                  if(e.KeyCode == Keys.Escape) {
                      Close();
                  }
              }
              public FormMain() {
                  InitializeComponent();
                  FormMain_Setup();
              }
          }
      }
      

2 个答案:

答案 0 :(得分:2)

致电Controls.Add(BtnClose);而非Container.Add(BtnClose);

至于修复表格位置:设置StartPosition = FormStartPosition.Manual;属性。

要在Esc上正确关闭表单,请覆盖ProcessCmdKey方法:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Escape)
    {
        Close();
        return true;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

答案 1 :(得分:1)

默认情况下,表单StartPosition设置为WindowsDefaultLocation。您需要将其设置为手动;无论是在设计师还是在代码中。

要向表单添加控件,您需要将其添加到表单的控件集合中,而不是容器。

此外,如果您希望表单在添加按钮后继续获取KeyDown事件,则需要将KeyPreview设置为true。

public void FormMain_Setup()
{
    StartPosition = FormStartPosition.Manual;
    KeyPreview = true;
    Top = 20;
    Left = 20;
    Width = 800;
    Height = 600;
    KeyDown += FormMain_KeyDown;
    Controls.Add(BtnClose);
    BtnClose_Setup();
}