2011-01-13 7 views
6

코드 숨김에 ListItems를 추가하는 ListBox가 있습니다. 내가 가진 문제는 ListBox가 선택된 항목을 보지 못하고 있다는 것입니다. DropDownList에 AutoPostBack이 true로 설정되도록 사용자가 DropDownList에서 선택하는 항목에 따라 동적으로 채워지는 ListBox를 갖습니다. 나는 이것이 어떻게 든 문제를 일으키는 것이라고 생각한다.ListBox에서 선택한 항목을 가져 오지 못했습니다.

SelectedIndexChanged 메서드는 DropDownList의 항목을 선택할 때마다 사용되며 PopulateListBox 메서드를 호출합니다.

<asp:DropDownList runat="server" ID="type" width="281px" OnSelectedIndexChanged="SelectedIndexChanged" AutoPostBack="true" /> 

<asp:ListBox runat="server" ID="listbox" width="281px" height="200px" selectionmode="Multiple" /> 

는 내가 뭘하려고 오전 문자열이 선택되고 (문자열의 목록을 추가 할 수 있습니다 : 그것은 가치가 무엇인지에 대한

protected void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string typeStr = type.SelectedItem.Text; 
    MyType = Api.GetType(typeStr); 
    PopulateListBox(); 
} 

private void PopulateListBox() 
{ 
    listbox.Items.Clear(); 
    foreach (PropertyInfo info in MyType.GetProperties()) 
     listbox.Items.Add(new ListItem(info.Name)); 
} 

, 여기에 DropDownList로와 목록 상자가 : 여기처럼 그 방법이 어떻게 표시되는지를 보여줍니다 항목)을 제출 버튼을 클릭하면 세션 변수로 사용할 수 있습니다. 목록에 세션이 추가 된 후 단추가 새 페이지로 리디렉션됩니다. 디버거를 거치면서 문자열 목록은 세션에 추가되는 지점에서 비어 있습니다.

listbox.GetSelectedIndices() 아무 것도 반환하지 않습니다. 나는 DropDownList로의 변화를하지 않는 경우

업데이트

내가 선택한 항목에 액세스 할 수 있습니다. ListBox는 처음에는 페이지로드시 채워지며 선택하면 인식됩니다. DropDownList에서 무언가를 선택하고 ListBox를 다시 채우면 선택 항목이 인식되지 않습니다.

Page_Load 메서드는 두 가지 작업 만 수행합니다. 그것은 다음과 같이 보이는, 내 API를 변수를 초기화하고 PopulateDropDown를 호출

private void PopulateDropDown() 
{ 
    foreach (Type t in Api.GetAllTypes()) 
     type.Items.Add(new ListItem(t.Name)); 
    string typeStr = type.Items[0].Text; 
    Type = Api.GetType(typeStr); 
    PopulateListBox(); 
} 
+0

그러나 목록 상자에서 선택한 항목을 볼 수 없습니까? 드롭 다운 목록에서 선택을 변경하면 어떻게됩니까? 또는 포스트 백을 수행하는 다른 컨트롤이 있습니까? – dzendras

+0

@dzendras : 나는 이것에 관한 하단의 게시물을 업데이트했다. –

+0

언제 목록 상자에 액세스합니까? PageLoad? ASP.NET 페이지 수명주기에 따라 액세스하는 곳이 맞는지 확인하십시오 (요청 컨트롤을 처리하는 초기 단계에서 해당 속성이 설정되지 않음). 또한 페이지 수명주기의 초기에 목록 상자를 지우지 않았는지 확인하십시오. – dzendras

답변

13

문제는 당신이 목록 상자를 삭제하고 다시 채 웁니다 PopulateListBox()를 호출 매 Page_Load()PopulateDropDown()를 호출 할 것입니다. 목록 상자를 지우면 선택을 취소합니다.

Page_Load()PopulateDropDown()으로 전화를 교체해야하는 경우 다음 코드를 사용하십시오. 생각하지 못한 문제는 페이지가 모든 포스트 백에로드된다는 것입니다. 페이지 수명주기에서 페이지로드는 이벤트 전에 발생합니다. 따라서 드롭 다운 항목을 선택하면 Page_Load() 이벤트를 먼저 실행합니다 (LoadListBox 메서드를 간접적으로 실행하여 선택을 지우는 이벤트). 다음 코드는 페이지가 처음으로로드 될 때 드롭 다운 목록을 채 웁니다. . 로

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Do your API code here unless you want it to occur only the first 
    // time the page loads, in which case put it in the IF statement below. 
    if (!IsPostBack) 
    { 
     PopulateDropDown(); 
    } 
} 

가 IsPostBack을 페이지 처음 ("거짓")에 대한로드되기 때문에 서버 측 코드가 실행되고 있는지 여부를 나타내는 부울을 반환하거나 : 당신은 부하 드롭 방법을 사용하는 곳마다 다른 같은 유지 포스트 백 ("true").

다른 곳에서 말했듯이 여러 개의 선택된 값을 가질 가능성이있는 목록 상자는 단일 선택 가능성이있는 목록 상자와 다르게 처리해야합니다.오히려 listbox.SelectedItem를 참조하지만,하지 마십시오

foreach (ListItem item in lbFullNames) 
{ 
    if (item.Selected) 
    { 
     // TODO: Whatever you are doing with a selected item. 
    } 
} 
+0

아, 고맙네 저스틴. DropDownList는 AutoPostBack이 true로 설정되어 있기 때문에 포스트 백만 호출합니다. 나는 당신의 해결책을 내일 한 발 맞춰보고 다시보고 할 것이다. –

+0

예, AutoPostBack을 false로 설정하면 인덱스를 변경할 때 C# 코드가 실행되지 않습니다. 즉, 목록 상자가 다시 채워지지 않습니다. –

1

을 나는 또한 당신이 목록 상자의 서버 측을 사용하지 않으면 다음과 같은 코드를 사용하여 목록 상자를 사용하려면 클라이언트 측 코드를 사용하는 것이 발견, 당신은 얻을 수 없다 선택된 아이템 서버 측.

$('.css-class-assigned-to-listbox').attr('disabled', ''); 

수정 한 다음, 확인이 활성화되어 서버 측 (기본값)을 만들어 비활성화 (타격을 참조)가 클라이언트 측 코드를 사용하여 (위 참조)을 활성화하는 것입니다.

$('.css-class-assigned-to-listbox').attr('disabled', 'disabled'); 
관련 문제