【问题标题】:Linking dynamically created text boxes and labels链接动态创建的文本框和标签
【发布时间】:2011-11-10 12:19:18
【问题描述】:

我创建了一个文本框数组和一个标签数组。当文本框中的信息更新时,我希望它更改标签。我怎么能做到这一点?下面是我的一段代码。我还没有创建我认为是我需要帮助的部分的 EvenHandler。全部在 C# 中使用 windows 应用程序表单。

textBoxes = new TextBox[value];
labels = new Label[value];

for (int i = 1; i < value; i++)
{
    textBoxes[i] = new TextBox();
    textBoxes[i].Location = new Point(30, ToBox.Bottom + (i * 43));

    labels[i] = new Label(); 
    labels[i].Location = new Point(TopBox3[i].Width + 140, TopBox3[i].Top +3);

    textboxes[i].ValueChanged += new EventHandler(this.TextBox_ValueChanged) ;

    this.Controls.Add(labels[i]);
    this.Controls.Add(textBoxes[i]);
}

【问题讨论】:

  • TextBox 没有 ValueChanged 事件 - 它是 TextChanged。

标签: c# winforms dynamic


【解决方案1】:

你可以记住Tag属性中TextBox的索引

 textBoxes[i].Tag = i;

然后在你的事件处理程序中使用这个值来获取对应的标签(假设你将标签数组作为局部变量保存)

protected void TextBox_ValueChanged(object sender, EventArgs e)
{
  TextBox textbox = sender as TextBox;
  if(textbox==null)
    return;
  int index = Convert.ToInt32(textbox.Tag);
  if(index >= 0 && index < this.labels.Length)
  {
    Label label = this.labels[index];
    /* ... */
  }
}

【讨论】:

    【解决方案2】:

    你应该这样写:

        private void textBox1_ValueChanged(object sender, EventArgs e)
        {
            TextBox changedTxt = sender as TextBox;
            for (int i = 1; i < value; i++)
                if (textBoxes[i] == changedTxt)
                {
                    Label lblToChange = labeld[i];
                    lblToChange.Text = changedTxt.Text;
                    break;
                }
        }
    

    在该方法中,文本已更改的 TextBox 作为“发送者”传递。你在你的数组中寻找它,所以你确定了索引“i”,它可以用来访问相应的标签并设置它的文本。

    顺便说一句,正如 Tim 所说,事件是 TextChanged,而不是 ValueChanged。此外请注意,文本的每次更改都会触发该事件,即,只要您按下一个键,标签就会更新。如果您希望仅在用户完成输入文本后更新标签,请使用 Leave 事件。

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 2015-03-25
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多