當再次單擊同一專案或簡單地單擊串列框(如果可能的話)時,我正在努力形成取消選擇專案的邏輯。
目前我已經設定了一個變數prevSelectedIndex = -2,然后在selectedIndexChanged()listBox 的方法中 -> 我檢查如果那list.SelectedIndex == prevSelectedIndex
是真的然后我呼叫ClearSelected()list 的方法。
如果為假,我設定prevSelectedIndex = SelectedIndex并傳遞selectedIndex給一個函式,以便我可以使用所選專案中的資料預先設定一些輸入欄位。但是,它永遠無法洗掉它,因為我認為selectedIndexChanged()listbox 的方法顯然只在它發生變化時才被呼叫,而不是保持不變(再次單擊同一專案時嘗試取消選擇)。
此外,當我單擊串列框內/外而不是某個專案時,我嘗試檢查輸出是否可能會更改為索引以外的其他內容,例如 -1 但這不會發生。
任何幫助表示贊賞!
謝謝
uj5u.com熱心網友回復:
如果您需要通過滑鼠輸入切換專案的選擇狀態,則該ListBox.SelectedIndexChanged事件不適合處理。您需要處理滑鼠事件。
例如,您可以處理MouseClick事件以呼叫IndexFromPoint回傳專案索引的方法,如果您單擊它或-1單擊客戶區域。然后,您可以將該索引與通過滑鼠或鍵盤箭頭存盤最后選擇的索引的類欄位進行比較,如果您獲得相同的數字,則取消選擇該專案。
將它們與其他要求放在一起
public partial class YourForm : Form
{
private int toggleIndex = -1;
public YourForm()
{
InitializeComponent();
}
private void yourListBox_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
var s = sender as ListBox;
var i = s.IndexFromPoint(e.Location);
if (i >= 0)
{
if (i == toggleIndex)
{
s.SetSelected(i, false);
// or
// s.ClearSelected();
i = -1;
}
}
else
{
s.ClearSelected();
}
toggleIndex = i;
}
}
private void yourListBox_SelectedIndexChanged(object sender, EventArgs e)
{
toggleIndex = yourListBox.SelectedIndex;
}
private void yourListBox_Leave(object sender, EventArgs e)
{
toggleIndex = -1;
yourListBox.ClearSelected();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466794.html
