確かに!ラムダを使用して、未使用の引数を簡単に処理できます。
button3.Click += (sender, args) => UpdateTextLabel();
checkBox1.CheckedChanged += (sender, args) => UpdateTextLabel();
numericUpDown1.ValueChanged += (sender, args) => UpdateTextLabel();
comboBox1.SelectedIndexChanged += (sender, args) => UpdateTextLabel();
または、一部の開発者が流行しているように、引数を気にしない場合は、読みやすくするためにアンダースコアを使用してそれらを「無視」できます。
button3.Click += (_, __) => UpdateTextLabel();
checkBox1.CheckedChanged += (_, __) => UpdateTextLabel();
numericUpDown1.ValueChanged += (_, __) => UpdateTextLabel();
comboBox1.SelectedIndexChanged += (_, __) => UpdateTextLabel();
強力な Jon Skeet がかつて私に教えてくれたように、これは CONTROLNAME_EVENTNAME のデフォルトの Visual Studio 命名スキームよりもはるかに優れています。テキストラベル」。また、コード ファイルが解放され、不要なメソッド ラッパーが大量に削除されます。:)
編集: 24 回繰り返すと、設計の観点からは少し奇妙に思えます。...もう一度読みます。コメントを見逃しました。特定のコードを実行し、テキスト ボックスを更新したいと考えています。複数のイベントを登録できます。
button3.Click += (_, __) => SubmitForm();
button3.Click += (_, __) => UpdateTextLabel();
これに関する問題は、技術的には、イベントリスナーが順番どおりに起動することが保証されていないことです。ただし、この単純なケース (特に、イベント ハンドラーを使用したり組み合わせたりしない場合-=
) では、実行順序を維持しても問題ありません。(私はあなたが後UpdateTextLabel
に発砲する必要があると仮定しています) SubmitForm
UpdateTextLabel
または、呼び出しをボタン ハンドラーに移動することもできます。
button3.Click += (_, __) => SubmitForm();
private void SubmitForm(object sender, EventArgs e)
{
//do submission stuff
UpdateTextLabel();
}
どちらがあなたを同じボートに入れますか(メソッドの命名はより良いですが)。UpdateTextLabel
おそらく代わりに、フォームの一般的な「再バインド」に移動する必要があります。
button3.Click += (_, __) => SubmitForm();
private void SubmitForm(object sender, EventArgs e)
{
//do submission stuff
Rebind();
}
private void Rebind()
{
GatherInfo();
UpdateTextLabel();
UpdateTitles();
}
このようにして、テキスト ラベルを更新する以外に追加の作業を行う必要がある場合、すべてのコードがジェネラルRebind
(または任意の名前) を呼び出し、更新が容易になります。
EDITx2: もう 1 つのオプションは、アスペクト指向プログラミングを使用することです。PostSharpのようなものを使用すると、コンパイルされる特別なコードを実行するメソッドを装飾できます。PostSharp でイベントにアタッチできると 99% 確信しています (ただし、具体的に行ったことはありません)。
button3.Click += (_, __) => SubmitForm();
[RebindForm]
private void SubmitForm(object sender, EventArgs e)
{
//do submission stuff
}
[Serializable]
public class RebindFormAttribute : OnMethodBoundaryAspect
{
public override void OnSuccess( MethodExecutionArgs args )
{
MyForm form = args.InstanceTarget as MyForm; //I actually forgot the "InstanceTarget" syntax off the top of my head, but something like that is there
if (form != null)
{
form.Rebind();
}
}
}
したがって、どこでも明示的に呼び出しを行わなくてもRebind()
、属性とアスペクト指向プログラミングはOnSuccess
、メソッドが正常に呼び出されるたびに、そこで追加のコードを実行することになります。