2011-08-03 4 views
3

ユーザーがリストボックス内の項目をクリックすると、listboxItems_SelectedIndexChangedが呼び出されます。しかし、ユーザーがアイテムを見落として、リストボックスの中をランダムにクリックしても(アイテム上ではない)、listboxItems_SelectedIndexChangedが呼び出されます。マウスクリックがリストボックスにない項目にヒットするかどうかを検出する[C#]

どうすれば変更できますか?私はアイテムのクリックにのみアクションが必要です。

注:キーボードを使用してアプリケーションをナビゲートする機能を削除することはオプションではありません。

+0

Winforms?もしそうなら、タグに追加してください。 –

+0

@Merlyn、リストボックスを使用しているので、それはかなり明らかです。 –

+0

必ずしもそうではありません - WPFにはListBoxコントロールもあります。 Merlynのコメントを見る前に、私はあなたの質問に実際に答えを出すつもりでした。 – Eternal21

答えて

0

私はので、あなたが持っている、いくつかのケースでは、あなたのコントロールに十分なリストアイテムを持っていないことを推測いくつかのスペースをクリックしてSelectedIndexChangedが解雇されました。

あなたはリストアイテムの数に常に合うようにコントロールを動的にサイズ変更することはできないと思います。そうしないと、この質問は表示されません。

ユーザーが同じリストアイテムをクリック(選択)したらどうなりますか?選択されたインデックスが同じであっても、何らかのロジックが発生する必要がありますか(同じロジックが最初に発生したときにクリックされたとき)

あなたは、あなたが以下のハックを使用することができ、一度無視されるべきであるよりも多くの同じインデックスを選択することが必要な場合:

フォームスコープ(ListBoxコントロールを含むフォーム)とその都度選択で変数を保管してくださいインデックスの変更はその変数を設定します。その後、後で使用して、イベントの処理を無視するように同じ選択が行われたかどうかを確認します。ここに例があります:

private int _currSelIdx = -1; // Default value for the selected index when no selection 
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     if (listBox1.SelectedIndex == _currSelIdx) 
     return; 

     Console.WriteLine(listBox1.SelectedIndex); 
     _currSelIdx = listBox1.SelectedIndex; 
} 

これはかなりうまくいきます。

0

おそらくSelectedIndexChangedは、キーボードで選択を変更してもトリガーされるため、ロジックを配置するのに適切な場所ではありません。 代わりにMouseClickを使用して、選択したアイテム、つまり次のようなアイテムがクリックされたかどうかを確認します。

private void listBox1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (listBox1.SelectedIndex < 0 || !listBox1.GetItemRectangle(listBox1.SelectedIndex).Contains(e.Location)) 
      MessageBox.Show("no click"); 
     else 
      MessageBox.Show("click on item " + listBox1.SelectedIndex.ToString()); 
    } 
+0

キーボードナビゲーションの削除はオプションではありません。 –

+0

あなたは「私はアイテムクリックでアクションが欲しい」と書いたので、それは明確ではありませんでした。このカスでは、tzupはあなたに行く方法を示したと思います。 –

関連する問題