2009-05-25 15 views
19

私はC#2.0 Windowsフォームアプリケーションでリストボックスを使用しています。リストボックスを移入する方法は、しかし、それはまた、私は上記の方法で選択されたインデックスを設定しておりませんにもかかわらず、リストボックスのSelectedIndexChangedイベントハンドラを呼び出すメソッドを実行したときListBox.SelectedIndexChangedイベントを防ぐ方法は?

private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
    { 
     lb.DataSource = reportColumnList.ReportColumns; 
     lb.DisplayMember = "ColumnName"; 
     lb.ValueMember = "ColumnName"; 
    } 

です。 SelectedIndexChangedイベントハンドラが上記のコードに対して呼び出されないようにするにはどうすればよいですか?

ユーザーがListBoxで選択を行った場合にのみ、イベントを呼び出すようにします。または、マウスクリックを使用してリストボックス項目を選択するための他のイベントはありますか?

ユーザーがリストボックスの空の領域をクリックしても、SelectedIndexChangedイベントが発生します。だから私はMouseClickイベントとはどう違うのだろう?

+1

をほとんどの場合、あなたはイベントを上げからオブジェクトを防ぐことはできません..あなただけに選択することができますイベント通知の受信を停止します。 – Gishu

+0

私は、何らかの形でイベントを発生させるコードの部分を防ぐことができれば意味しました。しかし、私たちが見ることができるように、PopulateListBox()内の3行がすべてreqdであるため、私は何もできません:) –

答えて

15

あなたがlb.Items.AddRangeを使用してリストボックス()の代わりに、データソースの設定を読み込むことができます。 SelectedIndexChangedをトリガーしないことに加えて、これも最初の項目をあらかじめ選択しません。

lb.Items.Clear(); 
lb.Items.AddRange(reportColumnList.ReportColumns.ToArray()); 
+1

はい...まさに私が望むものです。あなたの答えごとに私のコードを変更し、それは魅力のように動作します:)百万、ありがとう! –

18

これについては、3つの方法があります。

A)このメソッドを呼び出した後まで、SelectedIndexChangedイベントにフックしないでください。

B)クラスにプライベートブール値を持っていますが、最初はtrueに設定されています。 PopulateListBoxメソッドの開始時にfalseに設定し、最後にtrueに戻します。 SelectedIndexChangedのイベントハンドラで、フラグがfalseの場合は、ただ返して何もしません。

C)PopulateListBoxメソッドの開始時に、イベント(this.listbox1.SelectedIndexChanged - = myMethod;)からフックを外して、メソッドが終了する直前に、そのイベントに再フックします。

+0

答えをありがとう。ただし、上記の手順の代わりに、ユーザー選択の変更を処理するためにMouseClickイベントを使用するとどうなりますか? PopulationListBox()が呼び出されたときに、ユーザーの選択が変更され、呼び出されない場合にのみ、MouseClickイベントが発生します。このシナリオでMouseClickイベントを使用すると、何らかの欠点がありますか?私はそれをテストし、正常に動作しますが、私はこれによって将来私が直面するいくつかの隠されたバグを知りたいと思います。 –

+0

MouseClickのアプローチは使用できません。理由:MultiExtendedリストボックスの場合、マウスクリックが発生したとき、複数の項目を選択しても、選択したインデックスの数に反映されません。 SelectedIndexChangedが呼び出されたときのみ、私は適切なカウントを取得します。 –

+0

私は通常Option Aと一緒に行きます。+1 – Cerebrus

1

イベントを処理しなくても、DataSourceプロパティを割り当てるときに、リストの最初の項目が自動的に選択されることに注意してください。ユーザーに選択を強制するには、自動的に選択された項目の選択を解除する必要があります。

アイテムが選択されているときに、SelectedIndexChangedイベントハンドラがいくつかの機能をトリガした場合でも、実行をブロックすることができます。これを行うための1つの方法は、コードが現在リストボックスに入力しているかどうかを追跡することです。リストボックスが移入されている間、SelectedIndexChangedイベントがトリガされている場合は、それらのアクションの実行を回避することができます

private bool _populating = false; 
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 
    _populating = true; 
    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    // clear the automatically made selection 
    lb.SelectedIndex = -1; 
    _populating = false; 
} 

private void ListBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (!_populating) 
    { 
     // perform the action associated with selecting an item 
    } 

} 
6

この問題の最も簡単な答えはあり:以下 Aのコードスニペットは、回避策を提案することができます。

lstBxState.SelectionMode = SelectionMode.None; 
lstBxState.DataSource = lstStates; 
lstBxState.ValueMember = "StateId"; 
lstBxState.DisplayMember = "StateName"; 
lstBxState.ClearSelected(); 
lstBxState.SelectionMode = SelectionMode.One; 

これは、選択モードを「なし」にして、幸いにデータをコントロールにバインドすることを意味します。次に、モードを必要なモードに変更します(ここでは、これをOneに変更しました。複数を選択することもできます)。SelectedIndexChanged方法、SelectedIndex == -1は他に何もしない場合は、言うif文でちょうどピット内

+0

'System.Web.UI.WebControls.ListSelectionMode'に 'None'の定義が含まれていません – Homer

+1

この質問はWindowsフォームについてです。この名前空間はASP.NETコントロール用です。 – KyleMit

1

、あなたがこの方法でやりたいものは何でも、おそらく最も効率的なコードが、私のために働いた:)

0
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 

    lb.SelectedIndexChanged -= this.*MethodnamewhichhandlesthisEvent*; //unset eventhandler 

    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    lb.SelectedIndexChanged += this.*MethodnamewhichhandlesthisEvent*; //set the eventhandler 
} 

基本的に、イベントからデリゲートを削除し、完了したら追加してください。

0

私の状況は一意であるかもしれませんが、誰かを助ける場合に備えてここに掲載します。

私はリストボックスをバインドする代わりにItems.AddRangeに挿入していました。なぜかわからないけど、PostBackでは、SelectedIndexは-1から0になっていた。リストボックスがSelectionMode="Single"だったからかもしれない。

私の問題を修正する修正プログラムを手動で0にSelectedIndexを設定代わりにする-1人口後のことでした。

listBox.Items.AddRange(items); 
listBox.SelectedIndex = 0; 
関連する問題