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

问题描述

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

举个例子:

Label at top,textboxes below

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

解决方法

在表单的构造函数中,为所有TextBoxes的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事件添加事件处理程序,以在光标离开某个TextBox时清除文本。为此,只需在上面的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实例,然后将其转到属性窗口的事件页面来将所有实例连接到该事件。

您可以使用相同的事件处理程序和Enter事件,以便在您输入下一个TextBoxLabel发生变化。

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