1

CTRL+Zのものを再作成する機能をアプリで作成しています。私はいくつかのテキストボックスを手に入れました、そして私はこのようなテーブルを作りました:

hashtable textChanges[obj.Name, obj.Text] = new HashTable(50);

選択したキーから値を抽出するのに問題があります。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);
        }
    }

キャストエラーを見逃すのはなぜですか?

(私の英語でごめんなさい)

4

2 に答える 2

3

文字列に変換する必要があります。辞書を使うといいでしょう。ディクショナリはジェネリック型であり、ハッシュテーブルに必要な型キャストは必要ありません。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();
于 2012-10-20T14:41:09.687 に答える
2

はい、型キャストが必要です。

ただし、コードのリファクタリングを検討してください。ハッシュテーブルの代わりのユーザー汎用辞書:

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];
    }
}
于 2012-10-20T15:02:31.867 に答える