我是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/