是否可以让标签显示当前活动文本框中的文本?

Is it possible to have a label display text from the current active textbox?

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

举个例子:

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

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

public Form1()
{
    InitializeComponent();

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

请注意,this.Controls.OfType<TextBox>() 只有在将文本框直接放置在窗体上时才有效。如果它们被放置在另一个容器中(例如,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;

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

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

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

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

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