我有一個文本框,我想將所選項目的數量限制爲MaxSelection。期望的行爲是一旦MaxSelection項目被選中,任何進一步的選擇都將被忽略。 (因此這個問題不同於「limit selections in a listbox in vb.net」)。如果在列表框中選擇了多於X個項目,請回到上一個選擇
我有一個嘗試完成此操作的列表框的SelectedIndexChanged事件的事件處理程序。如果用戶使用Ctrl單擊選擇(MaxSelection + 1)項目,則選擇將恢復爲上一個選擇。
問題是當用戶選擇一個項目,然後按住Shift並單擊MaxSelection +列表中下一個項目。在這種情況下,將引發多個SelectedIndexChanged事件:一個用於按住Shift鍵點按選擇按住Shift鍵單擊的項目,另一個用於選擇原始選擇項和Shift按下的選擇項之間的所有項目。這些事件中的第一個允許用戶選擇按住Shift鍵的項目(技術上是正確的),然後第二個事件將選擇恢復爲選擇,因爲它在第一個事件之後(這將是最初選擇的項目和Shift點擊項目)。我們希望的是代碼會在第一個事件之前(這只是最初選擇的項目)將選擇恢復爲選擇。
有沒有辦法在按住Shift鍵之前保留選擇?
感謝, 羅布
這裏的SelectedIndexChanged事件處理程序:
void ChildSelectionChanged(object sender, EventArgs e)
{
ListBox listBox = sender as ListBox;
//If the number of selected items is greater than the number the user is allowed to select
if ((this.MaxSelection != null) && (listBox.SelectedItems.Count > this.MaxSelection))
{
//Prevent this method from running while reverting the selection
listBox.SelectedIndexChanged -= ChildSelectionChanged;
//Revert the selection to the previous selection
try
{
for (int index = 0; index < listBox.Items.Count; index++)
{
if (listBox.SelectedIndices.Contains(index) && !this.previousSelection.Contains(index))
{
listBox.SetSelected(index, false);
}
}
}
finally
{
//Re-enable this method as an event handler for the selection change event
listBox.SelectedIndexChanged += ChildSelectionChanged;
}
}
else
{
//Store the current selection
this.previousSelection.Clear();
foreach (int selectedIndex in listBox.SelectedIndices)
{
this.previousSelection.Add(selectedIndex);
}
//Let any interested code know the selection has changed.
//(We do not do this in the case where the selection would put
//the selected count above max since we revert the selection;
//there is no net effect in that case.)
RaiseSelectionChangedEvent();
}
}
不幸的是,我發現的MouseDown和的KeyDown是在SelectedValueChanged事件後開火。然而,你已經啓發了一個使用MouseUp的解決方案,我將很快發佈。非常感謝。 – 2009-04-15 15:39:01