Wyjątek po odświeżeniu zawartości comboBox, jak obsłużyć?

0

Witam.

Mam problem z obsłużeniem wyjątku występującego po odświeżeniu listy w comboBox(Windows Forms, C++/CLI, VS2010).

Schemat działania jest następujący:

  • przy starcie aplikacji w Form1_Load wyszukiwane są dostępne porty COM i dopisywane na listę comboBox,
    dodatkowo jeżeli lista nie jest pusta SelectedIndex jest ustawiany na 0,
  • podczas pracy aplikacji mamy możliwość odświeżenia listy portów, tutaj używam comboBox_KeyDown przy czym
    najpierw cała lista jest czyszczona, a dopiero potem następuje wyszukanie i uzupełnienie nowymi wartościami,
    tutaj również sprawdzam czy lista nie jest pusta i ustawiam wartość początkową na 0:
if(comboBox1->Items->Count > 0){
	comboBox1->SelectedIndex = 0;}
		else {comboBox1->SelectedIndex = -1;}

problem w tym, że jeśli lista comboBox po ponownym wyszukaniu będzie pusta to pomimo ustawienia wartości początkowej aplikacja kończy działanie zgłaszając wyjątek:

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Windows.Forms.dll

Additional information: InvalidArgument=Wartość '0' nie jest prawidłową wartością dla 'index'.

O ile zgłaszany błąd jest dla mnie zrozumiały to nie rozumiem skąd się on bierze... i tutaj proszę o pomoc.
Ewentualnie jak ten wyjątek przechwycić i obsłużyć na tyle żeby aplikacja nie zakończyła działania.

Poniżej część kodu aplikacji:

void RefreshPortsList(){

	comboBox1->Items->Clear();//czyszczenie listy

	//----------------- WYSZUKIWANIE PORTÓW -------------------------
	for (int com=0;com<256;com++){
	//tu następuje wyszukanie i uzupełnienie listy comboBox1
		...
		comboBox1->Items->Add(numer_portu);
	}

	if(comboBox1->Items->Count > 0){
		comboBox1->SelectedIndex = 0;}//ustawienie wartości początkowej
			else {comboBox1->SelectedIndex = -1;}
}


private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
		
		RefreshPortsList();
}
 
private: System::Void comboBox1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) {

	if ( e->KeyCode == Keys::F5){	
		RefreshPortsList();}
}
0

a jak wywalisz to else z ustawianiem -1?

0

Warunek else z "-1" był próbą rozwiązania problemu. Początkowo nie ustawiałem wartości początkowej po odświeżeniu zawartości comboBox1
a tylko przy starcie aplikacji w Form1_Load. Problem właśnie w tym, że pomimo ustawienia wartości aplikacja zgłasza wyjątek dla index = 0.

Dodatkowo... zauważyłem, że problem występuje tylko wtedy, kiedy lista comboBox jest rozwinięta.
Jeśli zwinę listę(kontrolka pozostaje aktywna) i wtedy odświeżę listę przez F5 wszystko działa poprawnie.

0

Znalazłem rozwiązanie problemu.
Przed odświeżeniem wymuszam na kontrolce zwinięcie listy i wszystko działa poprawnie.

private: System::Void comboBox1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) {

	if ( e->KeyCode == Keys::F5){
		
		comboBox1->DroppedDown = false;

		RefreshPortsList();
  }
}

Mimo tego gdyby ktoś potrafił wyjaśnić takie zachowanie kontrolki comboBox odpowiedź będzie mile widziana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1