c#动态创建system.windows.forms.label
我有点困难。通常我是一名PHP开发人员,但对于这个角色,我是一名C#开发人员。哎呀 我接管的项目内部有一个很大的缺陷,那就是它无法扩展。所有内容都是硬编码的,只针对一个特定的项目。C#对我来说是新事物,我不知道该去哪里找 代码的当前状态如下所示: SomePage.Designer.cs:c#动态创建system.windows.forms.label,c#,C#,我有点困难。通常我是一名PHP开发人员,但对于这个角色,我是一名C#开发人员。哎呀 我接管的项目内部有一个很大的缺陷,那就是它无法扩展。所有内容都是硬编码的,只针对一个特定的项目。C#对我来说是新事物,我不知道该去哪里找 代码的当前状态如下所示: SomePage.Designer.cs: private System.Windows.Forms.Label CompLbl1; private System.Windows.Forms.Label CompLbl2; private System
private System.Windows.Forms.Label CompLbl1;
private System.Windows.Forms.Label CompLbl2;
private System.Windows.Forms.Label CompLbl3;
...
private System.Windows.Forms.Label CompLbl14;
private System.Windows.Forms.Label CompLbl15;
private System.Windows.Forms.CheckBox CompChkBx1;
private System.Windows.Forms.CheckBox CompChkBx2;
private System.Windows.Forms.CheckBox CompChkBx3;
...
private System.Windows.Forms.CheckBox CompChkBx14;
private System.Windows.Forms.CheckBox CompChkBx15;
private System.Windows.Forms.TextBox CompScanBox1;
private System.Windows.Forms.TextBox CompScanBox2;
private System.Windows.Forms.TextBox CompScanBox3;
...
private System.Windows.Forms.TextBox CompScanBox14;
private System.Windows.Forms.TextBox CompScanBox15;
SomePage.cs
private void CompChkBx1_CheckedChanged(object sender, EventArgs e)
{
if (Rwk1 == true)
{
Rwk1 = false;
CompScanBox1.Visible = false;
}
else
{
Rwk1 = true;
CompScanBox1.Visible = true;
}
// Console.WriteLine("Rework = " + Rwk1.ToString());
}
... all the way
private void CompChkBx15_CheckedChanged(object sender, EventArgs e){}
以上所有内容都是硬编码的
如果在更大的范围内实现,比如说20个组件,这一点将被打破。有没有办法让这更具活力?如果您能给我一个正确的建议,我将不胜感激。你只做一部分。设计师在另一个平台上工作。在编译过程中,你们两人所写的内容是结合在一起的。当您调用InitializeComponents()时,就会执行设计器编写的内容构造函数中的代码>
虽然您不应该在Designer部分进行编辑(如果您这样做,它往往会占用您的时间),但您可以充分了解这些内容是如何完成的。它只能做你能做的事情。在技术上<>强>所有 UI元素都是在运行时动态创建的,所以这里没有什么特别的考虑。
您最早应该在Showed()事件中执行任何工作,如用值填充UI。早期可能会导致元素尚未完全存在的HICKUP,或者长时间运行的操作会中断表单的刷新。比如在构造函数中创建可以执行的元素。只是不要忘记将其保存在列表或其他集合中
当然,另一个问题是,您基本上已经从Web(页面)过渡到桌面编程。至少PHP表示Web编程。Web编程使用与桌面编程完全不同的设计模式和程序流程。这就是说:虽然MVC模式实际上是当今动态网页的同义词,但它开始了桌面编程的生命。WindowsForms使用。你只做一部分。设计师在另一个平台上工作。在编译过程中,你们两人所写的内容是结合在一起的。当您调用InitializeComponents()时,就会执行设计器编写的内容构造函数中的代码>
虽然您不应该在Designer部分进行编辑(如果您这样做,它往往会占用您的时间),但您可以充分了解这些内容是如何完成的。它只能做你能做的事情。在技术上<>强>所有 UI元素都是在运行时动态创建的,所以这里没有什么特别的考虑。
您最早应该在Showed()事件中执行任何工作,如用值填充UI。早期可能会导致元素尚未完全存在的HICKUP,或者长时间运行的操作会中断表单的刷新。比如在构造函数中创建可以执行的元素。只是不要忘记将其保存在列表或其他集合中
当然,另一个问题是,您基本上已经从Web(页面)过渡到桌面编程。至少PHP表示Web编程。Web编程使用与桌面编程完全不同的设计模式和程序流程。这就是说:虽然MVC模式实际上是当今动态网页的同义词,但它开始了桌面编程的生命。您可以动态创建组件并将其添加到当前窗口中的项目中。这样做的棘手部分是让布局很好地工作(这在WPF中更容易做到)
比如说,
var myButton = new System.Windows.Forms.Button()
{
Name = "MyButton",
Location = new System.Drawing.Point(100, 100),
};
myButton.Click += (sender, args) =>
{
//Do something here.
};
var myTextBox = new System.Windows.Forms.TextBox()
{
Name = "MyTextBox",
Text = "Default text"
};
myTextBox.TextChanged += (sender, args) =>
{
//Do something here.
};
this.Controls.AddRange(new Control[] { myButton, myTextBox });
您可以动态创建组件并将其添加到当前窗口中的项目中。这样做的棘手部分是让布局很好地工作(这在WPF中更容易做到)
比如说,
var myButton = new System.Windows.Forms.Button()
{
Name = "MyButton",
Location = new System.Drawing.Point(100, 100),
};
myButton.Click += (sender, args) =>
{
//Do something here.
};
var myTextBox = new System.Windows.Forms.TextBox()
{
Name = "MyTextBox",
Text = "Default text"
};
myTextBox.TextChanged += (sender, args) =>
{
//Do something here.
};
this.Controls.AddRange(new Control[] { myButton, myTextBox });
这些是否类似于每个父级重复的多个组件?如果是这样的话,那么就有一个GroupBox,或者一个中继器,或者还有另一个控件--我使用listbox来详细说明一些东西,您可以使用它们将它们组合在一起,并让它们同时动作。另外,如果多个复选框执行相同的操作,只需将它们指向同一事件处理程序。@RobertMcKee据我所知,每个复选框都具有相同的功能,显示一个文本框并输入一个新组件以替换“提交”按钮上的所选内容。然后,我将创建一个封装所有这些功能的组件(称为UserControl),并在表单上放置15-20次(简单),或者根据需要或在循环中动态添加它们。下面是一些相关文档:但您确实需要在Visual Studio中加载项目。有一个免费版本(社区)这将极大地帮助您处理设计器文件。您也可以编写CustomControl,但我敦促您不要走这条路,尤其是如果您是桌面应用程序的新手。UserControl是一个拖放复合控件,初学者很容易使用。CustomControl都是代码,但您需要了解一个lo更多关于控件如何工作、其生命周期、如何加载/保存/更改状态的信息。它们比UserControl功能更强大,但更难正确实现。只需了解UserControl和CustomControls有很多相似之处,但又有很大不同。它们像是每个父级重复的多个组件吗?如果是,则是一个GroupBox,还是一个repeater,或者还有另一个控件--我使用listbox来详细说明一些内容,您可以使用这些内容将它们组合在一起,并让它们同时执行操作。此外,如果多个复选框执行相同的操作,只需将它们指向同一个事件处理程序即可。@RobertMcKee据我所知,每个复选框都具有相同的功能,显示一个文本框并显示ent呃,在一个“提交”按钮上用一个新的组件替换所选的。然后,我会创建一个封装所有功能的组件(称为UserControl),并在表单上显示15-20次(简单),或者根据需要或在循环中动态添加它们