У меня есть текстовое поле, в котором я хочу ограничить количество выбранных элементов до MaxSelection. Желаемое поведение состоит в том, что после выбора элементов MaxSelection любые дальнейшие выборы игнорируются. (Таким образом, этот вопрос отличается от " предельных значений в списке в vb.net ").
У меня есть обработчик события SelectedIndexChanged для списка, который пытается это сделать. Если пользователь использует Ctrl-щелчок, чтобы выбрать (MaxSelection + 1) -й элемент, выбор возвращается к предыдущему.
Проблема заключается в том, что пользователь выбирает элемент, а затем нажимает Shift и щелкает элемент вниз по списку, то есть MaxSelection + 1 элемент дальше по списку. В этом случае возникает более одного события SelectedIndexChanged: одно для Shift-click, которое выбирает элемент, который был нажат Shift, и одно для выбора всех элементов между исходным выбором и выбором Shift-clicked. Первое из этих событий позволяет пользователю выбрать элемент, нажатый по нажатию клавиши Shift (что технически правильно), затем второе событие возвращает выбор к выбору, как это было после первого события (которое будет первоначально выбранным элементом и кнопкой Shift). щелкнул пункт). Желательно, чтобы код возвращал выбор к выбору до первого события (которое является только первоначально выбранным элементом).
Есть ли способ сохранить выделение до нажатия Shift?
Спасибо,
Rob
Вот обработчик события 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();
}
}