私は VBA の世界から来ましたがBeforeUpdate
、コンボボックスで呼び出すことができる呼び出しがあったことを覚えています。今、私はC#にいます(そしてそれを愛しています) 、WinformでのBeforeUpdate
呼び出しがあるのだろうかと思っていましたか?ComboBox
目に見えないテキストボックスを作成してそこに必要な情報を保存し、更新後にそのボックスで必要なものを確認できますが、もっと簡単な解決策があることを望んでいました.
私は VBA の世界から来ましたがBeforeUpdate
、コンボボックスで呼び出すことができる呼び出しがあったことを覚えています。今、私はC#にいます(そしてそれを愛しています) 、WinformでのBeforeUpdate
呼び出しがあるのだろうかと思っていましたか?ComboBox
目に見えないテキストボックスを作成してそこに必要な情報を保存し、更新後にそのボックスで必要なものを確認できますが、もっと簡単な解決策があることを望んでいました.
WF の利点の 1 つは、自分で簡単に作成できることです。プロジェクトに新しいクラスを追加し、以下のコードを貼り付けます。コンパイル。ツールボックスの上部から新しいコントロールをフォームにドロップします。BeforeUpdate イベントを実装します。
using System;
using System.ComponentModel;
using System.Windows.Forms;
public class MyComboBox : ComboBox {
public event CancelEventHandler BeforeUpdate;
public MyComboBox() {
this.DropDownStyle = ComboBoxStyle.DropDownList;
}
private bool mBusy;
private int mPrevIndex = -1;
protected virtual void OnBeforeUpdate(CancelEventArgs cea) {
if (BeforeUpdate != null) BeforeUpdate(this, cea);
}
protected override void OnSelectedIndexChanged(EventArgs e) {
if (mBusy) return;
mBusy = true;
try {
CancelEventArgs cea = new CancelEventArgs();
OnBeforeUpdate(cea);
if (cea.Cancel) {
// Restore previous index
this.SelectedIndex = mPrevIndex;
return;
}
mPrevIndex = this.SelectedIndex;
base.OnSelectedIndexChanged(e);
}
finally {
mBusy = false;
}
}
}
を検討してSelectionChangeCommited
ください。
MSDN から:
SelectionChangeCommitted は、ユーザーがコンボ ボックスの選択を変更した場合にのみ発生します。SelectedIndexChanged または SelectedValueChanged を使用してユーザーの変更をキャプチャしないでください。これらのイベントは、プログラムによって選択が変更されたときにも発生するためです。
ただし、ユーザーがテキストボックスに入力できるようにコンボボックスを設定している場合、これは機能しません。また、「最後に」選択されたアイテムが何であったかはわかりません。この情報をキャッシュする必要があります。ただし、情報をテキストボックスに保存する必要はありません。文字列を使用できます。
ValueMemberChanged、Validating、SelectedIndexChanged、または TextChanged を試すことができます。それらは BeforeUpdate のようには起動しませんが、何が更新されるかを見て、更新されたものを処理するか、拒否することができます。
箱から出して、そのようなものは何もありません。コンボ ボックスの変更を処理するすべてのイベントは、新しい値が既に選択された後に発生します。その時点で、値 USED が何であるかを知る方法はありません。あなたが最善の策は、あなたが逃したものです。ComboBox が設定されたらすぐに、SelectedItem を一時変数に保存します。次に、SelectedValueChanged イベントにフックします。その時点で、一時変数は古い値になり、SelectedItem は現在の値になります。
private object oldItem = new object();
private void button3_Click(object sender, EventArgs e)
{
DateTime date = DateTime.Now;
for (int i = 1; i <= 10; i++)
{
this.comboBox1.Items.Add(date.AddDays(i));
}
oldItem = this.comboBox1.SelectedItem;
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
//do what you need with the oldItem variable
if (oldItem != null)
{
MessageBox.Show(oldItem.ToString());
}
this.oldItem = this.comboBox1.SelectedItem;
}
あなたが欲しかったのはDropDownイベントだったと思います。ユーザーが値を変更する前に、値が何であるかがわかります。ただし、ユーザーは何も変更しないことになりかねないため、BeforeUpdateとまったく同じではありません。