2011-08-03 66 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

這是不明確的,因爲你寫道:「我只想要點擊項目的行動」。在這個CAS中,我認爲tzup告訴你要走的路。 –

相關問題