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

最後に、すべて「caption1」、「caption2」、「caption10」という名前の 10 個の異なるテキスト ボックスの「検証」コードがあります (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 などの他のすべてについても同様の「やり方」があります。これを行うことで、おそらく 100 行必要なときに、1000 行を超えています。「イベント プロパティ」に移動し、「検証済み」プロパティを各テキスト ボックスの単一の検証メソッドに設定できることを知っています。すべてを網羅するためにどのような方法が機能するかはわかりません。

残念ながら、これを行うために何を探しているのかわかりません。「this」プロパティを調べましたが、それが一連​​のクラスでどのように役立つのか理解できません。そうでなければ、私の検索は枯渇します。

何らかの方法で各テキストボックスに1〜10の整数を設定すると仮定すると(それを と呼びましょう)、またはキーワードを「魔法のように」keyValue配置すると、関連するテキストボックスを参照する次のようなソリューションを想像します(ただし、どこでもアプローチを試みると私のプログラムでは、プログラムのウィンドウ名を返します):this.Textthis.keyValuethisthis.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エラーが発生していました。少しグーグルで調べたところ、「TagControlクラスから継承され、System.Object型である」ことがわかりました。Convertクラスを使用するという提案があり、それはうまくいきました。

object sender辞書を使用して文字列を検証する方法は非効率的かもしれませんが、これは確かに優れており、およびTag部分について多くのことを教えてくれました。これがいつか他の誰かを助けることを願っています。ありがとう。

4

3 に答える 3

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 に答える