2016-07-18 3 views
0

SelectIndexChanged 이벤트를 사용하여 사용자 및 프로그래밍 방식으로 변경 내용을 캡처 할 수있는 콤보 상자가 있습니다.프로그래밍 방식으로 인덱스 0 (-1에서)을 선택할 때 Combobox가 실행되지 않음

콤보 박스에 바인딩 된 목록을 지우고 다시로드하면 자연히 인덱스 -1로 이벤트 핸들러가 실행됩니다.

는하지만 selectedIndex의로 = -1 두 경우 모두

combobox1.SelectedIndex = 0 ; // will NOT fire the event. 

하지만

combobox1.SelectedIndex = 1 ; // or higher number WILL fire the event. 

나는 프로그래밍 selextedindex을 변경하고 이벤트가 발생 될 것으로 예상하고있다.

간단한 동작으로 동작을 확인했습니다.

namespace cmbTest 
{ 
    public partial class Form1 : Form 
    { 
     private BindingList<string> items = new BindingList<string>(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      comboBox1.DataSource = items; 
      loadItems(); 
     } 

     private void loadItems() 
     { 
      items.Add("chair"); 
      items.Add("table"); 
      items.Add("coffemug"); 
     } 

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      MessageBox.Show("Fired with selected item index:" + comboBox1.SelectedIndex); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      int index = comboBox1.SelectedIndex; 

      // Clear and reload items for whatever reason. 
      items.Clear(); 
      loadItems(); 

      // try select old item index; if it doesnt exists, leave it. 
      try { comboBox1.SelectedIndex = index; } 
      catch { } 
     } 





    } 
} 

양식에 combobox1 및 button1이 있습니다. 선명도 (I 희망)에 대한

편집 :

  • 선택 '의자'

    1. 프로그램 실행. 메시지 "선택한 항목 인덱스로 실행 : 0"
    2. 조회 버튼. 메시지 "선택한 항목 색인으로 시작 : -1"
    3. '테이블'을 선택하십시오. 메시지 "선택한 항목 인덱스로 실행 : 1"
    4. 조회 버튼. 메시지 "선택한 항목 색인으로 시작되었습니다 : -1"AND "선택한 항목 색인으로 실행 : 1"

    내가 "의자"도를 선택하면 내가 프로그래밍 0

    에 인덱스를 변경하기 때문에, 버튼을 눌렀을 때이 메시지를 얻을 것으로 예상 그래서, 나는 그것이 어떻게 예상대로 이유가 작동하지 않는, 허용 가능한 해결 방법은 무엇입니까?

  • +0

    예외를 삼키는를? 그 좋지 않다. 예외가 Throw되고 있는지 어떤지를 확인한다. catch {}를 (를) 참조하는 – user3185569

    +0

    ? try 문은 재로드 목록에 항목이 더 이상 존재하지 않는 경우에만 발생합니다. 이 경우에는 해당되지 않으며이 예제에서는 필요하지 않습니다. –

    +0

    코드에서'comboBox1.SelectedIndex = 0;'을 볼 수 없습니다. 문제가 정확히 어디입니까? – user3185569

    답변

    1

    첫 번째 항목이 항목 컬렉션에 추가되면 색인이 자동으로 0으로 변경됩니다. 이전 색인이 0으로 저장된 다음이 줄을 사용하여 다시 설정하면 comboBox1.SelectedIndex = index; 색인이 변경되지 않습니다. 그래서 이벤트가 시작되지 않습니다.

    ComboBox의 소스 코드를 살펴보면 이벤트가 2 건 발생하지 않습니다. expcetion이 던져 지거나 인덱스가 있던 값과 같은 값으로 설정됩니다.

    당신이 정말로이 주변에 몇 가지 해킹을 원하는 경우에, 당신이 이런 식으로 수행 할 수 있습니다

    int index = comboBox1.SelectedIndex; 
    
    // Clear and reload items for whatever reason. 
    items.Clear(); 
    loadItems(); 
    
    if(comboBox1.SelectedIndex == index) 
    { 
        comboBox1.SelectedIndexChanged -= comboBox1_SelectedIndexChanged; 
        comboBox1.SelectedIndex = -1; 
        comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged; 
    } 
    
    // try select old item index; if it doesnt exists, leave it. 
    try { comboBox1.SelectedIndex = index; } 
    catch 
    { 
    } 
    
    +0

    당신이 옳습니다. 목록이 다시 설정되면 선택한 색인이 0으로 설정됩니다. 이상한 점은 내 디버그 창은 여전히 ​​0으로 설정하기 전에 -1이라고 말합니다. 그러나 여분의 메시지 상자는 0으로 다시 설정하려고 시도하기 전에 선택된 인덱스가 이미 0이라고 분명하게 명시했습니다. –

    +0

    @ NickSick은 해결 방법 작업을 수행했습니다. 너를 위해서? – user3185569

    +0

    그것은 나에게 som 팁을 주었지만 내 이벤트 핸들러가 항상 -1을 건너 뛸 것이므로, 나는 적절하게 loaditems 메서드에서 -1로 선택된 항목을 강제로 가져갈 것입니다. –

    관련 문제