如何将10个类似的事件方法转换为单个事件方法以适应上述10个事件?

时间:2013-08-21 17:34:00

标签: c# winforms

如果我无法正确地说出我的问题,我很抱歉,我不确定是否有我正在寻找的名称。

我有以下词典:

Dictionary<int, string> captions = new Dictionary<int, string>();

这样的方法:

public string disallowChar(string input)
    {
        if (input.Contains(@"|") || input.Contains(@"\"))
        {
            MessageBox.Show("You may not enter the characters | or \\.");
            input = "";
        }
        return input;
    }

最后,我有10个不同文本框的“验证”代码,全部名为'caption1','caption2'...'caption10'(使用winforms设计器脚本中的EventHandlers):

private void caption1_Validated(object sender, EventArgs e)
    {
        captions[1] = disallowChar(caption1.Text);
        caption1.Text = captions[1];
    }

    private void caption2_Validated(object sender, EventArgs e)
    {
        captions[2] = disallowChar(caption2.Text);
        caption2.Text = captions[2];
    }

    //.
    //.
    //Skip unnecessarily pasted methods 3-9 (Point made)
    //.
    //.

    private void caption10_Validated(object sender, EventArgs e)
    {
        captions[10] = disallowChar(caption10.Text);
        caption10.Text = captions[10];
    }

此代码工作正常。而且由于我的小程序有很多输入,我对其他所有东西都有类似的“做法”,如按钮,numericaUpDowns等。 然而,即使作为初学者,我知道这不是正确的方法。通过这样做,我有超过1000行,当我可能有100。 我知道我可以转到“事件属性”并将“验证”属性设置为每个文本框的单个验证方法。我只是不知道什么方法可以包含所有方法。

不幸的是,我只是不知道我正在寻找的是什么。我查看了“this”属性,但无法理解它如何帮助解决一堆类。否则我的搜索会干涸。

假设我以某种方式为每个文本框设置1-10整数(让我们称之为keyValue)我想象一个解决方案如下所示,当我放置this.Textthis.keyValue时关键字this“神奇地”引用所涉及的文本框(但是当我在程序中的任何地方尝试this.Text方法时,它会返回我程序的窗口名称):

private void caption_Validated(object sender, EventArgs e)
    {
        captions[this.keyValue] = disallowChar(this.Text);
        this.Text = captions[this.keyValue];
    }

是否有替代this关键字才能实现此功能?或者我误解了如何使用它?

使用答案进行编辑:我是一名新手,但是当我搜索并使用此网站时,我总是喜欢当用户使用最终解决方案编辑他们的问题时。感谢接受的回答,我用过这个:

private void caption_Validated(object sender, EventArgs e)
    {
        TextBox textBox = sender as TextBox;
        int keyValue = Convert.ToInt32(textBox.Tag);
        captions[keyValue] = disallowChar(textBox.Text);
        textBox.Text = captions[keyValue];
    }

winforms Designer的位置我将每个标题textBox的“Tag”属性设置为各自的编号。 (int)textBox.Tag发出错误。谷歌搜索后,我发现“Tag继承自Control类,并且是System.Object类型。”以及使用Convert课程的建议,并且有效。

使用字典以及我如何验证字符串可能效率低下,但这确实更好,并且在object senderTag部分给了我很多启发。希望有一天可能会帮助别人。感谢。

3 个答案:

答案 0 :(得分:4)

我能想到的最快的解决方法:

使用sender参数,并将整数放入每个标题的Tag属性中:

//...
caption1.Tag = 0;
caption2.Tag = 1;
//...
  • 您可以在设计器中创建TextBoxes(控件属性中的Tag属性)时执行此操作。
  • 或者如果在代码中以某种方式生成字幕,则应该很容易自动分配其标签

然后:

private void caption_Validated(object sender, EventArgs e)
{
    TextBox textBox = sender as TextBox;
    captions[(int)textBox.Tag] = disallowChar(textBox.Text);
    textBox.Text = captions[(int)textBox.Tag];
}

但无论如何,我不确定你为什么需要captions字典 - 似乎是多余的,因为所有字幕都存储在每个TextBox的Text属性中。

答案 1 :(得分:2)

请按照以下步骤操作

将键值分配给文本框的标签

将所有文本框注册到此活动。

private void caption_Validated(object sender, EventArgs e)
{
    TextBox textBox = sender as TextBox;
    int key = (int)textBox.Tag;
    string result = disallowChar(textBox.Text);
    captions[key] = result;
    textBox.Text = result;
}

答案 2 :(得分:2)

Dictionary<int, string> captions = new Dictionary<int, string>();

密钥需要int吗? 如果是,那么试试@BartoszKP的解决方案。别试试这个

Dictionary<TextBox, string> captions = new Dictionary<TextBox, string>();

将实际文本框存储在字典

private void caption_Validated(object sender, EventArgs e)
{
    TextBox textBox = (TextBox)sender;
    textBox.Text = captions[textBox] = disallowChar(textBox.Text);
}

或者......这个怎么样?

Dictionary<string, string> captions = new Dictionary<string, string>();//use textbox names as key

private void caption_Validated(object sender, EventArgs e)
{
    TextBox textBox = (TextBox)sender;
    textBox.Text = captions[textBox.Name] = disallowChar(textBox.Text);
}