如果我无法正确地说出我的问题,我很抱歉,我不确定是否有我正在寻找的名称。
我有以下词典:
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.Text
或this.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 sender
和Tag
部分给了我很多启发。希望有一天可能会帮助别人。感谢。
答案 0 :(得分:4)
我能想到的最快的解决方法:
使用sender
参数,并将整数放入每个标题的Tag
属性中:
//...
caption1.Tag = 0;
caption2.Tag = 1;
//...
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);
}