【问题标题】:Is it possible to have a label display text from the current active textbox?是否可以让当前活动文本框中的标签显示文本?
【发布时间】:2020-10-01 19:44:38
【问题描述】:

我正在 Visual Studio 2019 中制作一个 C# Windows 窗体项目。我目前有 40 个文本框供用户填写。这些文本框非常小,这就是我在程序顶部创建一个大标签的原因。我想知道是否可以在 C# 中显示用户在此标签框中填写的活动文本框中的文本。 我不确定这条信息是否会对这个过程有任何影响,但是一旦用户在当前所说的文本框中填写了正确的信息,它就会自动禁用它并转到下一个。

举个例子:

每当用户在这些文本框中输入任何内容时,活动文本框文本都会显示在顶部(在标签中)。

【问题讨论】:

  • 看看TextChangedLostFocusValidating 的事件 - 我认为TextChanged 是您所追求的事件。每次用户更改文本框的任何部分时都会触发
  • 旁白:对于用户来说,在窗口顶部放置一个文本框可能更有意义,其左侧的标签指示选择了哪个“目标”。使用单选按钮或其他适当的控件来选择“目标”。根据需要将文本框内容复制到目标上的标签,例如逐个字符或值终止时。

标签: c# winforms textbox label


【解决方案1】:

在表单的构造函数中,为所有 TextBox 的 TextChangedEnter 事件添加事件处理程序。它应该看起来像这样:

public Form1()
{
    InitializeComponent();

    foreach (var textBox in this.Controls.OfType<TextBox>())
    {
        textBox.TextChanged += TextBoxes_TextChanged;
        textBox.Enter += TextBoxes_TextChanged;
    }
}

请注意,this.Controls.OfType&lt;TextBox&gt;() 仅在 TextBoxes 直接放置在表单上时才有效。如果它们被放置在另一个容器中(例如,GroupBox 或 Panel),您可以使用以下内容:

theOtherContainer.Controls.OfType<TextBox>()

然后,您可以使用以下事件处理程序更改标签的文本:

private void TextBoxes_TextChanged(object sender, EventArgs e)
{
    var textBox = (TextBox)sender;
    label1.Text = textBox.Text;
}

您还可以为Leave 事件添加事件处理程序,以便在光标离开某个文本框时清除文本。为此,只需在上面的 foreach 循环中添加以下行:

textBox.Leave += (o, e) =>  label1.Text = string.Empty;

【讨论】:

  • 如果多个容器中有TextBoxes,那么编写一个RECURSIVE函数来查找所有TextBoxes。
  • 如果我要使用这种方法,我感到困惑的一件事是 foreach 循环。在您发布的示例中,您对两行代码都使用了 TextBoxes_TextChanged。就这样我很清楚我应该做什么,我应该用 tb1_TextChanged; 替换这些行。 tb2_TextChanged 等?我创建的 40 个文本框被标记为 tb1、tb2 及以上,但我没有将它们放入数组中。它们是单独创建的,而不是在组框中。
  • @ReneeToto 。循环的重点是让您不必手动为 40 个文本框做同样的事情。我使用TextBoxes_TextChanged 两次的原因是因为它同时用于TextChangedEnter 事件(诚然,该事件处理程序可以使用更好的名称)。
  • 我认为这是我感到困惑的部分。当您说事件处理程序时,到目前为止,在所有 40 个文本框中,我已经为 TextChanged 设置了事件处理程序。在每一个上,我是否还必须为 Enter 添加一个事件处理程序?它说 TextBoxes 不存在,所以当我创建时: public EventHandler TextBoxes_TextChanged { get;放; } 删除那一侧的错误,但它不显示所需的结果。
  • @ReneeToto 如果您已经为所有 TextBoxes 提供了一个事件处理程序并且它们都做同样的事情,那么您应该将该代码从我的代码中移到 TextBoxes_TextChanged答案(它们都可以共享同一个事件处理程序,如上所示)。如果他们做不同的事情,您可以保留它们,并且您仍然可以在我的答案中使用相同的代码,因为事件可以有多个事件处理程序。只需确保您使用提到的正确容器即可。
【解决方案2】:

您可以使用TextChanged 事件来完成此操作。第一个参数是触发事件的TextBox,因此您可以将其从object 转换为TextBox

private void TextBox_TextChanged(object sender, EventArgs e)
{
    TextBox txt = sender as TextBox;
    label.Text = txt.Text;
}

您可以使用设计器将您的所有 TextBox 实例连接到该事件,方法是一次选择所有实例,然后转到其属性窗口的事件页面。

您可以使用相同的事件处理程序和Enter 事件,这样当您输入下一个TextBox 时,Label 会发生变化。

使用这种方法需要注意的一点是,TextChanged 将触发任何导致 TextBox.Text 更改的事件,而不仅仅是键盘输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多