2016-10-26 35 views
1

私はComboBoxを持っています。別の項目を選択すると、いくつかのデータを削除する必要があります。vb.net SelectedIndexChangedをキャンセルして前の項目を再選択

誤って削除しないように、私はSelectedIndexChangedイベントで確認メッセージを追加しました。

このようにして、データは確認後に取り消されます。

私の問題は:確認されていない場合、選択したアイテムの変更を避けるにはどうしたらいいですか?

(私は以前、選択されたインデックスをmantainしたい)

私は私がまた私がグローバル変数に実際の値を格納し、それを使用することができることを知っているe.cancelまたはe.handled

を使用することができないことに気づきました以前の値を復元することができますが、私はより良い解決策を探しています(可能な場合)。

EDIT
当時、私は、フォームレベルの変数にインデックスを格納していると私は二回イベントを実行しないようにするブール値を使用しています。以下は、私のコードを見ることができます:

Private Sub ComboBoxEx1_SelectedIndexChanging(sender As Object, e As SelectedIndexChangingEventArgs) Handles ComboBoxEx1.SelectedIndexChanging 
    Dim SN As DialogResult = MessageBox.Show("Are you sure?", "Changing confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) 
    If SN = DialogResult.No Then 
     e.Cancel = True 
     Exit Sub 
    End If 
    Me.Lbl_Text.Text = Me.ComboBoxEx1.SelectedItem.ToString 
End Sub 

しかしイベントは、二回発射行によって呼び出されます:

Private Sub CBox_AmType_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CBox_AmType.SelectedIndexChanged 
    If DontRunSelChange Then 
     DontRunSelChange = False 
     Exit Sub 
    End If 
    '...some code 
    Dim OkCanc As DialogResult = MessageBox.Show("Are you sure?", "Changing confirmation", 
           MessageBoxButtons.OKCancel, MessageBoxIcon.Question) 
     If OkCanc = vbCancel Then 
      DontRunSelChange = True 'This to avoid running twice 
      CBox_AmType.SelectedIndex = AmType_Index 
      Exit Sub 
     End If 
    '...some code 
End sub 

EDIT 2
次はPlutonixコードを使用して、私の試みです

MyBase.SelectedIndex = MyBase.Items.IndexOf(selectedObject) 
+0

'onclientselectedindexchanged =" return confirm( 'Are you sure?'); "' – Santi

+0

フォームレベルの変数では効率が悪いのはなぜですか? (ListBox?ComboBox?)コントロールをサブクラス化し、変更を取り消すことができる新しいイベント(例えば、 'SelectedIndexChanging')を追加することです。それだけで同じロジックを内在化します。 – Plutonix

+0

@Plutonixオクラホマ、それを手に入れました。私はあなたを信じています。もしあなたがそう言えば、私はあなたが言うようにします。 ;)ありがとう – genespos

答えて

1

これは、あなたが望むもののほとんどを行うはずです。 SelectedIndexChangedイベントの前に発生する新しいイベントを追加するには、ComboBoxサブクラスをサブクラス化します。キャンセルすると、そのイベントは発生しません。

Public Class SelectedIndexChangingEventArgs 
    Inherits EventArgs 

    Public Property Cancel As Boolean = False 
    Public Property NewIndex As Int32 = -1 

    Friend Sub New(index As Int32) 
     NewIndex = index 
    End Sub 
End Class 


Public Class ComboBoxEx 
    Inherits ComboBox 

    Private selectedObject As Object = Nothing 

    Public Event SelectedIndexChanging(sender As Object, 
          e As SelectedIndexChangingEventArgs) 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs) 
     Dim evArgs As New SelectedIndexChangingEventArgs(MyBase.SelectedIndex) 
     RaiseEvent SelectedIndexChanging(Me, evArgs) 

     If evArgs.Cancel Then 
      If selectedObject IsNot Nothing Then 
       MyBase.SelectedIndex = MyBase.Items.IndexOf(selectedObject) 
      Else 
       MyBase.SelectedIndex = -1 
      End If 
      Return  ' do not fire Changed event 
     End If 

     MyBase.OnSelectedIndexChanged(e) 
     selectedObject = MyBase.Items(MyBase.SelectedIndex) 
    End Sub 
End Class 

それはちょうどあなたがおそらく既に持っているが、フォーム上に複数の「キャンセル可能な」コントロールがある場合、あなたは文句を言わない複数のインデックストラッキング変数を持っている必要がロジックを内部化。たぶんそれは簡単です。

使用法:

Private Sub ComboBoxEx1_SelectedIndexChanging(sender As Object, 
      e As SelectedIndexChangingEventArgs) Handles ComboBoxEx1.SelectedIndexChanging 
    If ComboBoxEx1.Items(e.NewIndex).ToString.Contains("o") Then 
     e.Cancel = True 
    End If 
End Sub 

Itemsコレクションを変更することができますので、簡単なLastIndex変数が十分ではないかもしれない - 何かが追加または削除された後に、それは間違った項目を参照することができます。これは、最後に選択されたオブジェクトを追跡し、現在のリストでそのオブジェクトを検索しようとします。

DataSourceでも動作しますが、他の多くの状況が考えられます。

+0

私はあなたのコードを読んでいます(後で自分のフォームでテストしようとします)毎回たくさんのことを与えるために+1します – genespos

+0

私のせいかどうかわかりませんが、私はこの解決法を使うことができませんでした。私は多くの方法を試しました:1)私のクラスの終了後にコードを追加する(私のフォームのコードウィンドウで)。 2)あなたのコードでクラスを追加する。 3)コードに「コンポーネントクラス」を追加します。結果は常に同じ:私は新しいComboBoxExを見つけましたが、挿入しようとするとエラーが発生し、コンポーネントがリストから削除されてしまうというメッセージが表示されます(ロードできないため) – genespos

+0

クラス)をプロジェクトに追加し、そこにコードを追加します。プロジェクトをコンパイルしたら、ツールボックスに追加されます – Plutonix

0

あなたが行うことでどのような現在の選択項目に、これが等しくなるように設定することができますコンボボックスのドロップダウンイベントに続いて

Dim selected As Object 

のようにグローバル変数に現在選択されている項目を保存することができます。

selected = ComboBox.SelectedItem 

次に、SelectedIndexChangedイベントを変更したくないときに、選択した項目を元に戻すことができます。

ComboBox.SelectedItem = selected 

おそらくよりクリーンな方法がありますが、これはちょうど私の頭の上にあります。

オブジェクト全体とインデックスだけを格納したくない場合は、.SelectedIndexを使用して、変数をIntegerとして宣言してください。

関連する問題