2009-05-25 5 views
19

C# 2.0 Windows 양식 응용 프로그램에서 목록 상자를 사용하고 있습니다. 이 방법은 또한 내가 위의 방법에서 선택한 인덱스를 설정하고 있지 않다하더라도, 목록 상자의의 SelectedIndexChanged 이벤트 핸들러를 호출을 실행할 때 목록 상자를 채우는 방법은, 그러나ListBox.SelectedIndexChanged 이벤트를 방지하는 방법은 무엇입니까?

private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
    { 
     lb.DataSource = reportColumnList.ReportColumns; 
     lb.DisplayMember = "ColumnName"; 
     lb.ValueMember = "ColumnName"; 
    } 

입니다. SelectedIndexChanged 이벤트 처리기가 위 코드에서 호출되지 않게하려면 어떻게해야합니까?

사용자가 ListBox에서 선택하는 경우에만 이벤트를 호출하려고합니다. 아니면 사용자가 마우스 클릭만으로 목록 상자 항목을 선택하는 다른 이벤트가 있습니까?

사용자가 목록 상자의 빈 영역을 클릭해도 SelectedIndexChanged 이벤트가 발생하는 경우가 있습니다. 그래서 MouseClick 이벤트와 다른 점이 궁금합니다.

+1

, 당신은 ... 당신은 선택할 수있는 이벤트를 발생에서 개체를 막을 수 없다 이벤트 알림 수신을 중지합니다. – Gishu

+0

사건을 발생시키는 코드의 일부를 어떻게 든 막을 수 있다면 의미가 있습니다. 그러나 우리가 볼 수 있듯이 PopulateListBox()의 세 줄이 모두 필요하기 때문에 할 수있는 일은별로 없습니다. –

답변

15

당신은 lb.Items.AddRange를 사용하여 목록 상자() 대신에 데이터 소스를 설정을 채울 수 있습니다. SelectedIndexChanged를 트리거하지 않는 것 외에도 첫 번째 항목을 미리 선택하지 않습니다. 강령 주변의 일을 제안 할 수 있습니다 아래의 스 니펫 :

lb.Items.Clear(); 
lb.Items.AddRange(reportColumnList.ReportColumns.ToArray()); 
+1

예 ... 정확히 내가 원했던 것입니다. 귀하의 답변 당 내 코드를 변경하고 그것은 매력처럼 작동 :) 감사합니다 백만, 김! –

18

세 가지 방법으로이 문제를 해결할 수 있습니다.

가)이 메서드를 호출 할 때까지 SelectedIndexChanged 이벤트에 연결하지 마십시오.

B) 클래스에 처음에 true로 설정된 개인용 부울이 있습니다. PopulateListBox 메서드의 시작 부분에서 false로 설정하고 끝에서 다시 true로 설정합니다. SelectedIndexChanged 이벤트 처리기에서 플래그가 false이면 반환하고 아무 것도 수행하지 않습니다.

C) PopulateListBox 메서드의 시작 부분에서 이벤트 (this.listbox1.SelectedIndexChanged - = myMethod;)에서 언 후크 한 다음 메서드가 완료되기 바로 전에 해당 이벤트로 다시 이동합니다.

+0

답변 해 주셔서 감사합니다. 그러나 위의 단계 대신 사용자 선택 변경 사항을 처리하기 위해 MouseClick 이벤트를 사용하면 어떻게됩니까? 그렇게하면 MouseClick 이벤트는 사용자 선택이 변경되고 PopulateListBox()가 호출 될 때 호출되지 않을 경우에만 발생합니다. 이 시나리오에서 MouseClick 이벤트를 사용하면 어떤 단점이 있습니까? 나는 이것을 테스트하고 잘 작동하지만, 앞으로 내가 직면 할 수있는 숨겨진 버그를 알고 싶습니다. –

+0

MouseClick 방식을 사용할 수 없습니다. 이유 : MultiExtended listbox의 경우, 마우스 클릭이 발생하면 둘 이상의 항목을 선택해도 선택한 인덱스 수가 반영되지 않습니다. SelectedIndexChanged가 호출 될 때에 만 적절한 카운트를 얻습니다. –

+0

보통 옵션 A와 함께 사용합니다. +1 – Cerebrus

1

이벤트를 처리하지 않더라도 DataSource 속성을 할당 할 때 목록의 첫 번째 항목이 자동으로 선택된다는 점에 유의해야합니다. 사용자가 강제로 선택을하려면 자동 선택 항목을 선택 취소해야합니다.

항목을 선택하면 SelectedIndexChanged 이벤트 처리기가 일부 기능을 트리거하면이 항목이 실행되지 않도록 차단할 수 있습니다. 한 가지 방법은 코드가 현재 목록 상자에 채워져 있는지 여부를 추적하는 것입니다. 목록 상자가 채워되는 동안의 SelectedIndexChanged 이벤트가 트리거 될 경우 해당 작업을 수행 피할 수 있습니다 :

private bool _populating = false; 
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 
    _populating = true; 
    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    // clear the automatically made selection 
    lb.SelectedIndex = -1; 
    _populating = false; 
} 

private void ListBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (!_populating) 
    { 
     // perform the action associated with selecting an item 
    } 

} 
6

이 문제에 대한 가장 간단한 해답이 있습니다.

lstBxState.SelectionMode = SelectionMode.None; 
lstBxState.DataSource = lstStates; 
lstBxState.ValueMember = "StateId"; 
lstBxState.DisplayMember = "StateName"; 
lstBxState.ClearSelected(); 
lstBxState.SelectionMode = SelectionMode.One; 

즉, 선택 모드를 "없음"으로 설정하고 행복하게 데이터를 컨트롤에 바인딩합니다. 그런 다음 원하는 모드로 모드를 변경하십시오 (여기에서 이것을 One로 변경 했으므로 Multiple을 선택할 수도 있습니다).SelectedIndexChanged 방법 내부

+0

'System.Web.UI.WebControls.ListSelectionMode'에 '없음'에 대한 정의가 없습니다. – Homer

+1

이 질문은 Windows Forms에 대한 것이며,이 네임 스페이스는 ASP.NET 컨트롤 용입니다. – KyleMit

1

말한다 if 문에서 단지 구덩이, SelectedIndex == -1 다른 아무것도하지 않는 경우, 당신은이 방법에서 아마 가장 효율적인 코드를하고 싶은 건 뭐든지 그러나 저 :

0
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 

    lb.SelectedIndexChanged -= this.*MethodnamewhichhandlesthisEvent*; //unset eventhandler 

    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    lb.SelectedIndexChanged += this.*MethodnamewhichhandlesthisEvent*; //set the eventhandler 
} 
근무

기본적으로 이벤트에서 대리인을 제거한 다음 완료되면 추가하십시오.

0

내 상황이 고유 할 수도 있지만 도움이 될만한 경우 여기에 게시하겠습니다.

바인딩 대신 내 ListBox를 채우기 위해 Items.AddRange을 수행하고있었습니다. 이유는 모르겠지만 PostBack에서 SelectedIndex는 -1에서 0으로 갈 것입니다. ListBox가 SelectionMode="Single" 이었기 때문일 수 있습니다.

내 수정 수동으로 0으로 selectedIndex의 설정 대신 -1 인구 후했다 :

대부분의 경우
listBox.Items.AddRange(items); 
listBox.SelectedIndex = 0; 
관련 문제