如何在C#winforms中为表单上的多个文本框控件调用Text_Changed事件

时间:2015-02-13 14:12:49

标签: c# winforms

我的表单有大约20个文本框控件,我想激发Text_Changed事件,而不是为每个单独的文本框添加事件。有没有办法循环文本框来触发此事件?我想要做的是在文本更改时清除标签控件。我没有显示消息框,而是使用标签控件来显示消息。我还设置了如果文本框包含无效数据,我选择所有文本并将焦点放在该文本框中,这样当用户重新输入信息时,标签控件就会清除消息。

编辑:

为了澄清一些困惑,以下是我的验证方法中的一些代码

 if (txtBentLeadsQty.Text == "")
        {
            //ValidData = true;
            BentLeadsCount = 0;
        }
        else 
        {
            if (int.TryParse(txtBentLeadsQty.Text.Trim(), out BentLeadsCount))
                ValidData = true;
            else
            {
                ValidData = false;
                lblError.Text = "Bent Lead Qty must be a numeric value";
                txtBentLeadsQty.SelectAll();
                txtBentLeadsQty.Focus();
            }
        }

我已经有办法检查数值,并且我输入代码来选择输入的所有文本,如果值不是数字则给予焦点,我只想在文本时清除标签控件是变化,如果用户点击退格键或开始输入错误发生的原因,我突出显示该文本框中的所有文本,如果它无效。如果我在每个文本框TextChanged事件中放置代码,我可以这样做,但是为了保存编码,我想知道是否有办法清除标签控件,如果任何文本框从我的验证方法抛出错误而不是添加单个事件20个文本框。注意:并非所有文本框都会输入数据,这些是我放入代码的数量文本框,如果文本框为null,则为变量赋值0。

6 个答案:

答案 0 :(得分:7)

您可以使用以下代码:

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Control ctrl in this.Controls)
    {
        if ((ctrl as TextBox) != null)
        {
            (ctrl as TextBox).TextChanged += Form1_TextChanged;
        }
    }
}
private void Form1_TextChanged(object sender, EventArgs e)
{
    MessageBox.Show((sender as TextBox).Name);
}

答案 1 :(得分:2)

我假设您想要动态地向表单中的所有文本框添加相同的处理程序,即无需为可视编辑器(或代码)中的每个文本框添加它们。

如果是这样,这可能就是您所需要的:

// Iterate over all controls in the current form:
foreach (var ctl in Controls)
{
    // Check if the current control is a textbox 
    // (will be null if it is of another type)
    var txtBox = ctl as TextBox;
    if (txtBox != null)
    {
        txtBox.TextChanged += YourMethod();
    }
}

答案 2 :(得分:1)

听起来您希望以编程方式在每个文本框上触发该方法。

首先,创建一个包含大约20个文本框的数组。

var textBoxes = new []{textBox0, textBox1, textBox2};

循环显示每个框并调用文本更改方法

foreach(var textBox in textBoxes)
{
     TextChangedMethod(textBox);
}

如果您调用的方法是由Visual Studio生成的,则它将为EventArgs采用第二个参数。您可以简单地为其传递null值。

TextChangedMethod(textBox, null);

答案 3 :(得分:0)

使用foreach声明。

实施例

List<TextBox> TextblockCollection = null;//You have to add them all individually to the list
foreach (var text in TextblockCollection)
{
    //Change the text to the same thing, firing the method
    text.Text = text.Text
}

答案 4 :(得分:0)

创建一个方法,如下所示:

public void TextChanged(object sender, EventArgs e)
{
    //Text-changed code here.
}

此时,您可以单击表单上的每个文本框,并将新方法添加到要发生的事件中。单击表单上的文本框,然后单击属性菜单中的thunderbolt图标并向下滚动到“TextChanged”事件。将该事件的下拉列表更改为新方法。

OR

初始化表单组件后,在运行时添加事件:

textBox1.TextChanged += new EventHandler(TextChanged);
textBox2.TextChanged += new EventHandler(TextChanged);
textBox3.TextChanged += new EventHandler(TextChanged);

如果将所有文本框添加到数组中,并且使用foreach循环遍历它们以将事件添加到每个文本框,则可以更轻松地完成此操作。您也可以从表单中获取所有文本框并以相同的方式循环,但我不知道您是否有其他控件/文本框可以让您避免使用此方法。

答案 5 :(得分:0)

因此,您要检查何时更改了任何文本框,然后检查更改后的文本框中的新输入是否为数字(我假设为整数),然后在标签中显示消息(如果& #39;不是数字。

public MainForm()
{
    InitializeComponent();

    foreach (Control control in this.Controls)
    {
        if (typeof(control)==typeof(TextBox))
        {
            (control as TextBox).TextChanged += CommonHandler_TextChanged;
        }
    }
}

private void CommonHandler_TextChanged(object sender, EventArgs e)
{
    int number;
    string input=(sender as TextBox).Text;
    bool isnumber=false;
    isnumber = Int32.TryParse(input, number);
    if(isnumber==false)
    {
        yourLabel.Text = "This textbox contains an incorrect number: "
                         +(sender as TextBox).Name;
    }
    else{ /*use the number*/ }
}