2015-01-12 2 views
1

У меня проблема, связанная с этим вопросом: How can I handle ComboBox selected index changing? Первый комментарий ответа на вопрос в основном запрашивает то же, что и здесь.Как вернуться к ранее выбранному индексу при событии смены индекса

В нем описывается, как поймать событие изменения индекса. Это прекрасно работает, однако у меня есть провайдер ошибок, ожидающий этого события, что фактически делает определенные поля обязательными. Если он приравнивается к истинному (или, другими словами, обязательное поле пуст), он выходит из суб.

Это прекрасно работает; данные остаются неизменными, а обязательные поля выделяются, однако проблемы возникают из-за того, что выбранный индекс уже изменился. Другими словами, вы видите данные из исходного индекса, но фактический выделенный индекс в комбинированном поле уже изменился. Событие ChangedIndex, оно срабатывает при изменении индекса.

Есть ли способ переустановить предыдущий индекс и/или отменить переход к новому индексу? Есть ли такое событие, как ChangingIndex в подобной усадьбе, для того, что DeletingRecord относится к событию RecordDeleted?

EDIT- Я использую ListBox не ComboBox, у которого нет события SelectedIndexChanging.

ответ

1

Если вы используете ListBox из System.Windows.Controls пространства имен, вы можете добавить обработчик событий для ListBox.SelectionChanged:

listBox.SelectionChanged += new SelectionChangedEventHandler(listBox_SelectionChanged);

сделать чек, если поставщик ошибок имеет значение true, если да, то я считаю, что это должно работать (я имею подобную логику на ComboBox управления с использованием того же самого события):

Вы можете добавить этот обработчик событий:

//Check if error provider returned true 
if(hasError) 
{ 
    //Cast the sender object as ListBox 
    ListBox listbox = (ListBox)sender; 

    //If there was already something selected before, set it as the SelectedItem 
    if(e.RemovedItems.Count > 0) 
    { 
     listBox.SelectedItem = e.RemovedItems[0]; 
    } 
} 

Конечно, это может не сработать, если вы можете выбрать несколько элементов.

EDIT: Так как это кажется, что вы используете ListBox в System.Windows.Forms пространства имен (которое не имеет SelectionChanged события), вы могли бы попытаться иметь свойство в коде позади, который представляет выбранный индекс для ListBox

В рамках вашего мероприятия SelectedIndexChanged проверьте состояние у поставщика ошибок. Если у него есть ошибка, верните элемент, который сохраняется в вашем свойстве, иначе обновите значение для вновь выбранного элемента.

Не самое изящное решение, но оно должно работать.

int _CurrentSelectedIndex = -1; //variable to keep track of the SelectedIndex initialized to default value (-1) 

//Add event listener to the ListBox.SelectedIndexChanged event 
ListBox listBox.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged); 


    //Event handler implementation 
    void listbox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //Cast the sender object as ListBox 
     ListBox listbox = (ListBox)sender; 

     //validation function detected an error 
     if(!passedValidation) 
     { 
      listBox.SelectedIndex = _CurrentSelectedIndex; //revert to the previously selected item 
     } 

     //Passed validation - update variable to keep track of the SelectedIndex 
     else 
     { 
      _CurrentSelectedIndex = listBox.SelectedIndex 
     } 
    } 
+0

Я попытался поместить это в свой код, однако кажется, что sysargs не имеет аргумента «RemovedItems». Я работаю из события SelectedIndexChanged и VB.net.Не уверен, что это имеет к этому какое-то отношение? –

+0

Есть только несколько аргументов, которые я могу использовать, никто не делает то, что мне нужно. –

+0

@Noodlemanny Похоже, вы используете 'ListBox' в' System.Windows.Forms' пространстве имен, а не в 'System.Windows.Controls', так как вы используете событие' SelectedIndexChanged', а не 'SelectionChanged ' 'событие. Вам нужно использовать ListBox в 'System.Windows.Forms'? – Saggio

0

Одумав проблему, я придумал простое решение. Я просто создал новую переменную с именем «ListBoxIndex» и дал ей начальный индекс по умолчанию. Когда все обязательные поля заполняются, а функция проверки выполняется через true, я устанавливаю значение ListBoxIndex в listBox.SelectedIndex. Когда подтверждение возвращается false, я просто переустанавливаю listBox.SelectedIndex на значение ListBoxIndex, возвращая его обратно в предыдущий индекс.

+0

Рад, что вы получили его на работу! Но разве это не то же самое решение, что и у меня (с единственным изменением, которое я сделал это в событии на «ListBox», как вы пытались в OP)? : p – Saggio

+0

Чтобы быть справедливым, я не совсем понял ваше решение, не говоря уже о том, чтобы заставить его работать:/Спасибо в любом случае –

+0

По сути, это то, что вы описали выше - я добавил обработчик событий в событие 'SelectedIndexChanged' для' ListBox' и если функция validation возвращает 'false' (представлен логической переменной'! passValidation'), она устанавливает 'SelectedIndex' в индекс, сохраненный в переменной' _CurrentSelectedIndex'. Если он прошел проверку, обновите значение в '_CurrentSelectedIndex' до значения, которое оно было изменено. С какой частью было трудно следовать? Я немного обновил его, но дайте мне знать, если я должен добавить более подробную информацию, чтобы помочь кому-либо в будущем иметь аналогичную проблему. – Saggio

Смежные вопросы