私のC#WindowsフォームMyFormには、いくつかのTextBoxがあります。これらのTextBoxでは、TextChangedイベントが発生したかどうかを検出する必要があります。これらのテキストボックスに変更があり、閉じるボタンをクリックすると、フォームを閉じるときに変更をキャンセルするかどうかを尋ねられます。ただし、MyFormを実行すると、textchangedイベントプロパティなしでユーザーが入力したために発生した各テキストボックスのテキストの変更を知ることができません。しかし、TextBoxのTextChangedに、textchangedイベントなしでユーザーが入力したことによって引き起こされたイベントを認識させるにはどうすればよいでしょうか。手伝ってくれてありがとう。英語でごめんなさい。
3 に答える
TextChanged
またはLeave
イベントなしで何が入力されたかを知る(まともな)方法はありません。
入力したコンテンツを取得するには、これらのイベントの1つを使用する必要があります。これを行うと、クローズ時にチェックして保存時にクリアできる「ダーティ」フラグを設定できます。
古い値と新しい値を比較しても、この原因がなければ意味がありません。何かが変更されたことを知らなければ、値を何に設定すべきかわかりません。
1つの例外を除いて、元のデータがデータベースからのものである場合は、データベースからのもののテキストボックスを比較するのと同じように、新旧の比較アプローチを使用できます。
アップデート:
このコメントへの対処:
「Myformには多くのテキストボックスがあり、テキストが変更されていない場合、確認メッセージは表示されません。すべてのテキストボックスでtextchangedイベントをキャッチすると、これは非常に多くのコードになります。」
共通のハンドラーを使用して、1つのメソッドですべてのテキストボックスの変更を収集できます。オブジェクトを使用してsender
(テキストボックスにキャスト)、必要に応じて変更されたテキストボックスを特定するか、変更されたテキストボックスにダーティフラグを設定します。
bool isDirty = false;
void SomeInitMethod() //ie. Form_Load
{
textbox1.TextChanged += new EventHandler(DirtyTextChange);
textbox2.TextChanged += new EventHandler(DirtyTextChange);
textbox3.TextChanged += new EventHandler(DirtyTextChange);
//...etc
}
void DirtyTextChange(object sender, EventArgs e)
{
isDirty = true;
}
void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (isDirty) {
//ask user
}
}
// to clear
void Save()
{
SaveMyDataMethod();
isDirty = false;
}
フォームに多数のテキストボックスがある場合は、フォームコントロールコレクションをループしてtypeof
、テキストボックスのアドレス指定に使用します。異なるアプローチを必要とするテキストボックスがある場合Tag
は、テキストボックスのプロパティを使用して区別します。
テキストボックスにテキストが含まれているかどうかを数間隔でチェックするタイマーを使用しないのはなぜですか
考えられるアプローチは、タイマーを使用することです。1000ミリ秒ごとにチェックし(たとえば)、textBox.Textをチェックするタイマーを用意します。
2番目に考えられるアプローチはWndProc
、テキストボックスをオーバーライドして(新しいクラスを継承することにより)、変更テキストメッセージを処理することです。これは、オーバーライドするのと同じTextBox.OnTextChanged
です。