动态创建、移动和调整控件大小

Dynamically Create,Move And Resize The Controls

我有一段代码可以在 运行 时间内创建一个文本框,还可以调整大小并移动预先创建的控件。 我面临的问题是我无法调整大小或移动我在 运行 时间内创建的控件。

这是代码。

  public System.Windows.Forms.TextBox AddNewTextBox()
        {
            System.Windows.Forms.TextBox txt = new System.Windows.Forms.TextBox();
            this.Controls.Add(txt);
            txt.Top = cLeft * 25;
            txt.Left = 100;
            txt.Text = "TextBox " + this.cLeft.ToString();
            cLeft = cLeft + 1;
            return txt;
        }
        private void button3_Click_1(object sender, EventArgs e)
        {
            AddNewTextBox();
        }

        private void button3_Click(object sender, EventArgs e)
        {
    ControlMoverOrResizer.Init(textBox1);

            cboWorkType.SelectedIndex = 0;
        } 

我面临的问题是我不知道如何引用

中新建的文本框
ControlMoverOrResizer.Init(textBox1);

我试着打电话给

txt.Text

但它抛出了错误 无法将字符串转换为 Windows.form.controls.

请指导我哪里出错了。 谢谢

您必须获得对控件的引用。要么将它存储为表单中的一个字段,要么给它一个 Name 并稍后在控件集合中找到它。

如果只添加一个文本框就很简单了:

方法一: 向您的表单添加一个字段,并在您创建 TextBox

时分配它
private void button3_Click_1(object sender, EventArgs e)
{
    this.myTextBox = AddNewTextBox();
}

之后:

ControlMoverOrResizer.Init(this.myTextBox);

方法二:起个名字,以后动态找:

private void button3_Click_1(object sender, EventArgs e)
{
    var txt = AddNewTextBox();
    txt.Name = "MyTextBox";
}

之后:

ControlMoverOrResizer.Init(this.Controls["MyTextBox"]);

请注意,如果您添加多个 TextBox,您将不得不稍微调整此代码

您需要某个地方作为参考。也许将您的文本框添加到字典中。

private Dictionary<string, TextBox> dynamicTextBoxes = new Dictionary<string, TextBox>();

public System.Windows.Forms.TextBox AddNewTextBox()
{
    System.Windows.Forms.TextBox txt = new System.Windows.Forms.TextBox();
    this.Controls.Add(txt);
    dynamicTextBoxes.Add($"tb{cLeft}", txt);
    txt.Top = cLeft * 25;
    txt.Left = 100;
    txt.Text = "TextBox " + this.cLeft.ToString();
    cLeft = cLeft + 1;
    return txt;
}

private void button3_Click(object sender, EventArgs e)
{
    ControlMoverOrResizer.Init(dynamicTextBoxes[$"tb{cLeft - 1}"]);
    cboWorkType.SelectedIndex = 0;
} 

注意:这只会移动最后添加的文本框!