3

多くの NumericUpDown コントロールを含む WinForms アプリがあります。簡単に言えば、ユーザーがコントロールに値を入力してからテキストを削除した場合、コントロールがフォーカスを失ったときにそれ (テキスト) を復元したいと考えています。そこで、コントロールがフォーカスを失ったときに .Text をチェックし、空の場合は .Text = .Value.ToString() を設定することにしました。

Leave イベント ハンドラーでこれを行っていますが、問題なく動作します。しかし、私が言ったように、私はこれらのコントロールの多くを持っています (正確には 18)。すべてが同じことを行う 18 の Leave イベント ハンドラーを作成するのは好きではないので、次のような一般的なハンドラーを作成しました。

private void numericUpDown_GenericLeave(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(((NumericUpDown)sender).Text))
        ((NumericUpDown)sender).Text = ((NumericUpDown)sender).Value.ToString();
}

すべてのコントロールをこの汎用イベント ハンドラーに接続し始めましたが、すぐに飽きてしまいました。

numericUpDown1.Leave += numericUpDown_GenericLeave;
numericUpDown2.Leave += numericUpDown_GenericLeave;
numericUpDown3.Leave += numericUpDown_GenericLeave;
...
numericUpDown18.Leave += numericUpDown_GenericLeave;

そこで、指定されたタイプのすべてのコントロールのリストを返し、そのリストをループしてイベント ハンドラーを接続する関数を作成しようと考えました。その関数は次のようになります。

public static List<Control> GetControlsOfSpecificType(Control container, Type type)
{
    var controls = new List<Control>();

    foreach (Control ctrl in container.Controls)
    {
        if (ctrl.GetType() == type)
            controls.Add(ctrl);

        controls.AddRange(GetControlsOfSpecificType(ctrl, type));
    }

    return controls;
}

この関数を次のように呼び出します。

var listOfControls = GetControlsOfSpecificType(this, typeof(NumericUpDown));

foreach (var numericUpDownControl in listOfControls)
{
    numericUpDownControl.Leave += numericUpDown_GenericLeave;
}

しかし、アプリを実行すると、各コントロールをジェネリック イベント ハンドラーに手動で接続したときに発生する期待される動作が見られません。このコードは現在私のフォームのコンストラクターにあり、InitializeComponent() の呼び出しの前と後に呼び出してみましたが、どちらも機能していないようです。期待していた動作が見られないだけで、いかなる種類のエラーも発生しません。汎用イベント ハンドラー内にブレークポイントを設定しましたが、デバッガーがブレークしないため、イベント ハンドラーが正しく接続されていないようです。これがなぜなのか、またはさらにトラブルシューティングする方法を知っている人はいますか? ありがとう!

編集

私はちょうど次の呼び出しに気付きました:

var listOfControls = GetControlsOfSpecificType(this, typeof(NumericUpDown));

InitializeComponent() の呼び出しの前に起こっていたので、もちろん、返されるコントロールのリストは空でした。ドー!すべての返信をありがとう。みんなの時間を無駄にしてごめんなさい。:-(

4

3 に答える 3

1

NumericUpDown コントロールを含むユーザー コントロールを作成してみませんか。

次に、これをユーザー コントロール イベントで処理します。

これは私のために働いた:

 private decimal _previous = 0;

  private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            if (((NumericUpDown)sender).Text.Length > 0)
            {
                _previous = this.numericUpDown1.Value;
            }
        }

        private void UserControl1_Leave(object sender, EventArgs e)
        {
            if (this.numericUpDown1.Text == "")
            {
                this.numericUpDown1.Value = _previous;
                this.numericUpDown1.Text = System.Convert.ToString(_previous);
            }
        }

Leave イベントは、アップダウン コントロール自体ではなく、ユーザー コントロールにあることに注意してください。

于 2011-10-21T15:08:56.660 に答える
1

メソッドに渡しthisていますが、これはおそらく への参照formです。メソッドは、フォームに直接配置されたコントロールのみをキャッチします。フォーム上に直接ない NumericUpDown コントロール (つまり、パネルなどの上にあるもの) は見逃されます。

于 2011-10-21T14:36:10.210 に答える
0

質問に答えました。上記の編集を参照してください。私を正しい方向に向けてくれた bsegraves に感謝します。

于 2011-11-16T16:57:58.673 に答える