问题描述
我正在Visual Studio 2019中制作一个C#Windows Form项目。我现在有40个文本框,用户必须填写。这些文本框非常小,这就是为什么在程序顶部我创建了一个大标签的原因。我想知道在C#中是否可以显示用户在此标签框中填写的活动文本框中的文本。 我不确定这条信息对这一过程是否有任何限制,但是一旦用户在当前的所述文本框中填写正确的信息,它就会自动将其禁用并移至下一个。
举个例子:
只要用户在任何这些文本框中输入任何内容,活动的文本框文本就会显示在顶部(在标签中)。
解决方法
在表单的构造函数中,为所有TextBoxes的TextChanged
和Enter
事件添加事件处理程序。它应该看起来像这样:
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
事件,以便在您输入下一个TextBox
时Label
发生变化。
使用这种方法要注意的一件事是,TextChanged
会触发导致TextBox.Text
发生变化的任何事物,而不仅仅是键盘输入。