これは古い質問ですが、私が使用した方法を追加すると思いました。それが良いかどうかは分かりません。 ComboBox
には、IndexChanging
のイベントや何かがありますが、これは取り消すことができます。
解決策は@ AftabAhmedKalhoroと@ jeffamaphoneの投稿の組み合わせですが、代わりにTag
プロパティを使用しています。
私はComboBox
をサブクラス化したくない、あるいは余分なプライベート変数をフォーム内に浮かべたくありませんでした。しかし、一部の人はTag
プロパティが気に入らないかもしれません。なぜなら、それを使用するのに使い慣れていないと隠されているからです(VB6から残されたもの)。
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ComboBox1.Items.Add("Item1")
ComboBox1.Items.Add("Item2")
ComboBox1.Items.Add("Item3")
ComboBox1.Items.Add("Item4")
' Load Value from database or whatever and set the value or index.
ComboBox1.SelectedIndex = 0
ComboBox1.Tag = ComboBox1.SelectedIndex
' I add the handler at the end because I don't want it to fire during loading the form.
AddHandler ComboBox1.SelectedIndexChanged, New EventHandler(AddressOf ComboBox1_SelectedIndexChanged)
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
If (ComboBox1.Tag <> ComboBox1.SelectedIndex) Then
If MessageBox.Show("Warning! You are changing the index." & vbCrLf & _
"Do you wish to continue?", _
"Changing Index", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
ComboBox1.Tag = ComboBox1.SelectedIndex
' Do Something.
Else
ComboBox1.SelectedIndex = ComboBox1.Tag
End If
End If
End Sub
SelectedIndex
をリセットするイベントがこの行に再び火に原因があることに注意してください:
ComboBox1.SelectedIndex = ComboBox1.Tag
コンボボックスの選択の変更のためのe.Cancelようなもの? – IsmailS