我是C#的新手。

下面是我试图在代码中创建表单和容器的代码;但我有问题。


我从一个新的Windows Forms Application模板开始。
我稍微更改了Program.cs文件,以便可以动态创建FormMain
当注释Container.Add(BtnClose)中的BtnClose_Setup()FormMain.cs行时,代码将编译并运行。但是,该程序中仍然有一些奇怪的结果。


(a)如FormMain所述,FormMain_Setup格式应显示在(20,20)(左上角);但是,当我运行该应用程序时,尽管宽度和高度设置显示为预期的值(800,600),但左上角每次都会更改(不会保持为20、20)。

(b)esc键可以正常工作,并关闭表格和应用程序。


当未注释Container.Add(BtnClose)中的BtnClose_Setup()FormMain.cs行时,代码会编译,但是VS运行时VS向我发送一条消息:“ mscorlib.dll中发生了'System.TypeInitializationException'类型的未处理异常”


有人可以告诉我我在做什么错吗?

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();
        }
    }
}

最佳答案

默认情况下,窗体StartPosition设置为WindowsDefaultLocation。您需要将其设置为“手动”。在设计器或代码中。

要将控件添加到窗体,您想将其添加到窗体的Controls集合,而不是Container。

另外,如果您希望表单在添加按钮后继续获取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();
}

关于c# - 动态创建表单和容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27088337/

10-17 01:57