【问题标题】:Dynamically Create,Move And Resize The Controls动态创建、移动和调整控件大小
【发布时间】:2018-07-26 03:06:15
【问题描述】:

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

这是代码。

  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.文本

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

请指导我在哪里犯错。 谢谢

【问题讨论】:

  • 考虑到您的代码创建了多个控件,您想要移动哪个控件并不是很明显。通过在List<TextBox> 中跟踪它们来开始修复它。或者考虑一个 DataGridView。

标签: c# winforms dynamic controls


【解决方案1】:

您必须获得对控件的引用。要么将它作为一个字段存储在你的表单中,要么给它一个 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,您将不得不稍微修改此代码

【讨论】:

  • 我必须添加最多 3 个文本框。
  • 然后将它们放入字典或给它们一个名称,稍后使用 Controls.Find 找到它们
  • 您好,您的方法对我帮助很大,您能帮我解决另一个问题吗?我也想删除控件,你能指导我怎么做吗?
【解决方案2】:

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

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

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

【讨论】:

  • 这段代码只是移动文本框而不是调整它的大小。我如何访问该属性?
  • 其实,明白了。
  • Multiline 属性未设置为 true。只需将其设置为 true,然后可以轻松调整大小和移动它。非常感谢
  • 您好,您的方法对我帮助很大,您能帮我解决另一个问题吗?我也想删除控件,你能指导我怎么做吗?
  • 首先您需要获取文本框,例如var textbox = dynamicTextBoxes[$"tb{cLeft - 1}"];。然后将其从字典和控件集合中删除,this.Controls.Remove(textbox);dynamicTextBoxes.Remove(textbox);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多