1

如果我无法正确表达我的问题,我深表歉意,我不确定是否有我正在寻找的名称。

我有以下字典:

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];
    }

这段代码工作正常。而且由于我的小程序有很多输入,所以我对按钮、numeraUpDowns 等其他所有内容都有类似的“执行方式”。但是,即使作为初学者,我也知道这不是正确的执行方式。通过这样做,我有超过 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 中,我将每个标题文本框的“Tag”属性设置为其各自的编号。给出了(int)textBox.Tag一个错误。谷歌搜索了一下后,我发现“Tag是从类继承的Control并且是System.Object类型。” 以及使用该Convert课程的建议,它奏效了。

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

4

3 回答 3

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字典 - 似乎是多余的,因为所有标题都存储在Text每个 TextBox 的属性中。

于 2013-08-21T17:37:54.827 回答
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;
}
于 2013-08-21T17:41:51.293 回答
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);
}
于 2013-08-21T17:46:38.663 回答