多くのラベルとテキスト ボックスを含むフォームがあります。いずれかのフィールドが変更された場合、タイトルを赤く強調表示したいと思います。これを行う簡単な方法はありますか、それともイベント コールバックを各フォーム オブジェクトに個別に追加する必要がありますか? ありがとう!
4 に答える
私の頭の上から、イベントを追加するためにフォームロードイベントでこのようなことをすることができます...
foreach (var control in this.Controls)
{
if (control is Label)
{
((Label)control).TextChanged += Controls_TextChanged;
}
else if (control is TextBox)
{
((TextBox)control).TextChanged += Controls_TextChanged;
}
}
はい、同じイベントにコントロールを簡単に追加できます。この例では、「ラベル」と「テキスト ボックス」を同じイベントに配置します。
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control x in this.Controls)
{
if(x is Label)
((Label)x).MouseHover+=new EventHandler(AllLabels_HoverEvent);
else if(x is TextBox)
((TextBox)x).MouseHover+=new EventHandler(AllTextboxes_HoverEvent);
}
}
void AllLabels_HoverEvent(object sender, EventArgs e)
{
Label label = (Label)sender;
// label.dowhateveryouwant...
}
void AllTextboxes_HoverEvent(object sender, EventArgs e)
{
Textbox textbox = (Textbox)sender;
// textbox.dowhateveryouwant...
}
さらに明確にする必要がある場合は、以下にコメントしてください。回答に追加するか、特定のニーズに合わせて変更します。ただし、コントロールが他のコンテナーにネストされている場合、それらは .xml には含まれないことに注意してくださいthis.Controls
。
各コントロールに関連付けられたイベントを見ていると、フォームにコード化されたすべてのイベントのリストを「ドロップダウン」できることがわかります。たとえば、「Text Changed」イベントをダブルクリックすると、 になりますcontrolname_textchanged(...)
。ただし、すべての汎用ハンドラーがある場合は、それを呼び出すことができますtextchangedevent(...)
。汎用イベント ハンドラーには、パラメーター内のそのイベントに関連付けられた送信者とイベント オブジェクトが必要です。
ユーザー コントロールでこれを行っていて、メイン フォームを更新する必要がある場合は、これを を通じてバブルアップし、public event eventobject youreventname
そのイベントをメイン フォームにバインドします。
このようなものが動作するはずです:
foreach (System.Windows.Forms.Control cont in this.Controls)
cont.Validating += new System.Windows.Forms.ValidationEventHandler(this.Control_Validating_Method)
次に、イベント コードでコントロール タイプをテストし、その値を元の値と比較できます。