我在我的应用程序中创建一个将重新创建CTRL + Z的功能。我有几个文本框,我做了一个像这样的表:
hashtable textChanges[obj.Name, obj.Text] = new HashTable(50);
我有问题从chossen键中提取值。我得到钥匙,因为keyDown被解雇了。
如果我正在寻找具有焦点的控件,并使用他的名字来提取他进入表格的最后一个值。
这是事件代码:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyData == Keys.Z)
{
for (int i = 0; i < this.Controls.Count; i++)
{
if (this.Controls[i].Focused)
{
if (this.Controls[i].GetType() == typeof(TextBox))
{
TextBox obj = (TextBox)this.Controls[i];
obj.Text = textChanges[obj.Name]; // <--- compile error
//Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)
}
}
}
}
}
这就是我添加键和键的方式。值为HashTable
private void textBox_OnTextChange(object sender, EventArgs e)
{
if (sender.GetType() == typeof(TextBox))
{
TextBox workingTextBox = (TextBox)sender;
textChanges.Add(workingTextBox.Name, workingTextBox.Text);
}
if (sender.GetType() == typeof(RichTextBox))
{
RichTextBox workingRichTextBox = (RichTextBox)sender;
textChanges.Add(workingRichTextBox.Name, workingRichTextBox.Text);
}
}
为什么我会错过演员错误?
(对不起我的英文)
答案 0 :(得分:3)
您需要将其转换为字符串。如果你使用字典会更好。 Dictionary是一种泛型类型,您不需要哈希表所需的类型转换。 Hashtable stores the object type and you are required to type cast the object back to your desired type
。
obj.Text = textChanges[obj.Name].ToString();
答案 1 :(得分:2)
是的,你需要打字。
但请考虑重构代码。用户generic dictionary而不是哈希表:
Dictionary<string, string> textChanges = new Dictionary<string, string>(50);
使用Linq检索重点文本框:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyData == Keys.Z)
{
foreach (var textBox in Controls.OfType<TextBox>().Where(x => x.Focused))
textBox.Text = textChanges[textBox.Name];
}
}