Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#动态创建system.windows.forms.label_C# - Fatal编程技术网

c#动态创建system.windows.forms.label

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

我有点困难。通常我是一名PHP开发人员,但对于这个角色,我是一名C#开发人员。哎呀

我接管的项目内部有一个很大的缺陷,那就是它无法扩展。所有内容都是硬编码的,只针对一个特定的项目。C#对我来说是新事物,我不知道该去哪里找

代码的当前状态如下所示:

SomePage.Designer.cs:

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次(简单),或者根据需要或在循环中动态添加它们