2012-05-01 4 views
0

나는 dropdownlist 열이있는 gridview가 있고, 나는 페이징 기능을 활성화했다. 문제는 다음 페이지로 넘어갈 때마다, 이전 페이지의 드롭 다운 목록에서 선택한 값이 기본값으로 돌아갑니다. gridview에서 드롭 다운리스트 값 읽기

나는 첫 페이지 만 사용할 수있는 다른 페이지가 사라지고 있으며, if(!ispostback)와 코드를 포장하려

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<CPDEmployee> employeelist = (List<CPDEmployee>)Cache["EmployeeList"]; 

      unverifiedlist.DataSource = employeelist; 
      unverifiedlist.AllowPaging = true; 
      unverifiedlist.PageSize = 10; 
      unverifiedlist.DataBind(); 
     } 
    } 
protected void PageSelect_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int page = int.Parse(PageSelect.SelectedItem.Text); 
    unverifiedlist.PageIndex = page; 
    DataBind(); 
} 





<asp:GridView ID="unverifiedlist" runat="server" AutoGenerateColumns="false" AllowSorting="true" AllowPaging="true" ViewStateMode="Enabled"> 
         <Columns><asp:TemplateField HeaderText="Options" > 
           <ItemTemplate> 
            <asp:DropDownList ID="options" runat="server" AutoPostBack="true"> 
             <asp:ListItem Value="1">Verified</asp:ListItem> 
             <asp:ListItem Value="0">Rejected</asp:ListItem> 
            </asp:DropDownList> 
           </ItemTemplate> 
          </asp:TemplateField> 
        </Columns> 
        <PagerSettings Visible="false"/>    
     </asp:GridView> 
<asp:DropDownList ID="PageSelect" runat="server" AutoPostBack="true" OnSelectedIndexChanged="PageSelect_SelectedIndexChanged"></asp:DropDownList> 
내가 IsPostBack을 넣어해야하는 위치

사람이 그것을 해결하는 방법을 알고 있나요? 감사

+0

나는이 링크는 당신이 당신의 문제를 해결하는 데 도움이되기를 바랍니다. http://stackoverflow.com/questions/4189158/asp-net-dropdownlist-not-retaining-selected-item-on-postback –

+0

코드를 추가했습니다. girdview의 드롭 다운 목록에 데이터 소스가 없으며 두 개의 값만 있습니다. gridview 페이징을 제어하는 ​​또 다른 드롭 다운 목록이 있습니다. 다음 페이지로 돌아 가면 페이지가 다시 게시되고 이전 페이지의 드롭 다운 목록이 다시 기본값으로 돌아갑니다. – pita

답변

1

OnRowDataBound를 처리하고 적절한 요소를 프로그래밍 방식으로 설정해야합니다. 예 : 같은

<asp:GridView ID="unverifiedlist" runat="server" 
    OnRowDataBound="unverifiedlist_RowDataBound" AutoGenerateColumns="false" 
    AllowSorting="true" AllowPaging="true" ViewStateMode="Enabled"> 

그리고 구현 뭔가 :

protected void unverifiedlist_RowDataBound(Object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
    ((DropDownList)e.Row.FindControl("options")).SelectedValue=((CPDEmployee)e.Row.DataItem).Unverified; 

    } 
} 

당신이 속성은 비즈니스 오브젝트에 확인되지 않은 전화가 있는지, 분명히, 가정. 적절한 것을 사용해야합니다. 이것은 단지 예일뿐입니다.

UPDATE : 아래 그리드 내부의 드롭 이후

다시 자동으로 게시, 난 그리드 내부의 드롭 다운 목록에 OnSelectedIndexChanged에 대한 이벤트 처리기를 추가합니다. 뭔가 같이 :

<asp:DropDownList ID="options" runat="server" AutoPostBack="true" OnSelectedIndexChanged="options_SelectedIndexChanged"> 
    <asp:ListItem Value="1">Verified</asp:ListItem> 
    <asp:ListItem Value="0">Rejected</asp:ListItem> 
</asp:DropDownList> 

그리고

protected void options_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string selecteValue = ((DropDownList)sender).SelectedValue; 
    //Now persist this value in the appropriate business object 
    //this is the difficult part because you don't know for which row in the gridview 
    //you are changing this selection. You'll need to devise a way to pass an extra 
    //value (an Employee ID, I would imagine) that would allow you to grab the 
    // record from the List<CDPEmployee> and change the property to the new selection. 
} 
+0

@lcarus 대단히 감사합니다. 그게 내가 필요한 것입니다.하지만 질문이 하나 더 있습니다. 제가 선택한 드롭 다운 목록에서 원하는 값을 유지하고 싶습니다. 미리 채워진 값이 아니라 원하는 값을 저장하는 방법을 알려주시겠습니까? thanks – pita

+0

그리드에 바인딩하는 비즈니스 개체에 선택 항목을 기본적으로 유지해야합니다. 나는 이것을하는 많은 방법을 생각할 수있다. 그러나 gridview 내부의 드롭 다운리스트가 어떤 CDPEmployee에 대해 선택을 바꾸고 있는지 알려줄 필요가 있기 때문에 모두 해킹된다. 그래서 캐시에서 목록을 가져올 수있다. CDPEmployee- 목록을 저장하고 해당 특성을 적절한 오브젝트로 갱신하십시오. 나는 출발점 접근법을 게시 할 것이다. – Icarus