Я знаю, что это старый вопрос, но я думал, что добавлю метод, который использовал. Я не уверен, что это лучше. Должно быть событие IndexChanging
или что-то в обычном ComboBox
, которое можно отменить.
Решение представляет собой комбинацию сообщений @ 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 для изменения выбора COMBOBOX? – IsmailS