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

时间:2018-02-15 11:13:37

标签: c# winforms dynamic controls

我有一个代码,它在运行时创建一个TextBox,同时调整大小并移动预先创建的控件。 我面临的问题是我无法调整大小或移动我在运行时创建的控件。

这是守则。

  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

但它正在抛出错误 无法将String转换为Windows.form.controls。

请指导我错误的地方。 感谢

2 个答案:

答案 0 :(得分:0)

您必须获得对该控件的引用。将其存储为表单中的字段,或者将其设置为Name,稍后在控件集合中找到它。

如果您只添加一个文本框,那么很简单:

方法1: 在表单中添加一个字段,并在创建TextBox

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

随后:

ControlMoverOrResizer.Init(this.myTextBox);

方法2:为其命名并稍后动态找到它:

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

随后:

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

请注意,如果您添加多个TextBox,则必须稍微修改此代码

答案 1 :(得分:0)

你需要从哪里引用。也许将文本框添加到字典中。

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

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