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