2012-10-23 4 views
2
이 아닙니다.

격자보기가 잘 표시되고 두 열 중 정렬이 잘됩니다. 그러나 링크 버튼을 클릭하면 반환되는 CommandArgument가 올바른 값이 아닙니다. 마치 CommandArgument가 행에 바인딩되어 있고 정렬되지 않은 것입니다.GridView는 정렬하지만 LinkButton의 CommandArgument는

즉, 전 종류의

Text Command 
abc A 
aaa B 
aab C 

AAA에 일종의

Text Command 
aaa A 
aab B 
abc C 

클릭의 인수로 "A"를 반환 후 정상적으로처럼, B 없습니다.

의 GridView는 영문 파일에 다음과 같이 정의된다 :

<asp:GridView ID="GridView1" runat="server" 
       AllowSorting="True" 
       AutoGenerateColumns="False" 
       EmptyDataText="No Results to Display" 
       GridLines="None" 
       onsorting="GridView1_Sorting" > 
    <Columns> 
     <asp:TemplateField HeaderText="File Name" SortExpression="Path"> 
      <ItemTemplate> 
       <asp:LinkButton ID="linkbutton1" runat="server" Text='<%# Eval("Title") %>' OnCommand="LinkButton_Click" CommandArgument='<%# Bind("Path") %>' ></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField HeaderText="Document Type" DataField="DocumentCategory (Text)" SortExpression="DocumentCategory (Text)" /> 
    </Columns> 
</asp:GridView> 

그것은 viewstate가있는 SQL 쿼리에 의해 채워진 DataView를 결합 및 저장은

ViewState["GridView1_DataSource"] = ds.Tables[0]; 
DataView dv = new DataView(ds.Tables[0]); 
GridView1.DataSource = dv; 
GridView1.DataBind(); 

내 정렬 방법은

입니다
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    string sortDir = "ASC"; 
    if (ViewState["SortDirection"] == null) 
     ViewState["SortDirection"] = "ASC"; 

    if (ViewState["SortDirection"].ToString() == "ASC") 
    { 
     sortDir = "DESC"; 
     ViewState["SortDirection"] = "DESC"; 
    } 
    else 
    { 
     ViewState["SortDirection"] = "ASC"; 
    } 

    DataTable dt = (DataTable)ViewState["GridView1_DataSource"]; 
    DataView dv = new DataView(dt); 
    dv.Sort = e.SortExpression + " " + sortDir; 
    GridView1.DataSource = dv; 
    GridView1.DataBind(); 
} 
+0

당신이 해결책을 찾았나요? 나는 같은 문제가있다. – Zafar

+0

나는 동일한 문제가있다. 아무도? – Apollo

답변

1

GridView1_Sorting을 통해 정렬 할 때 Page_Load가 처리 된 다음 GridView1_Sorting . 따라서 데이터가 올바르게 표시됩니다. LinkButton을 클릭하면 Page_Load가 GridView1__RowCommand보다 먼저 처리됩니다. 일반적으로 Gridview의 DataBind는 Page_Load에 있으므로 데이터는 원래 순서대로 유지됩니다. 수정하려면 Page_Load DataBind에도 정렬을 넣으십시오.

(dt.Rows.Count> 0)

{

DataView를

의 DV = DataView를 새로운 (DT)의 경우;

dv.Sort = ViewState["SortExpression"].ToString() + " " + ViewState["SortDirection"].ToString(); 
GridView1.DataSource = dv; 

GridView1.DataBind(); 

}

난 당신이 빈 데이터 테이블을 정렬 할 수 있습니다 생각하지 않습니다.

디버깅으로 쉽게 확인하고 정렬 및 Page_Load에 중단 점을 추가 할 수 있습니다.

0

해결책을 찾았습니다. 이것은 나를 위해 일했다. 이 시도.

protected void LinkButton_Click(object sender, EventArgs e) 
{ 
    sortExpr = "Path"; 
    GridView1_Sorting(null, null); 
} 

이 변경 :

string sortExpr; 
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 
     String sortExpression = null; 
     if (sortExpr == null) 
     { 
      sortExpression = e.SortExpression; 

     } 
     else 
     { 
      sortExpression = sortExpr; 
     } 

    Session["SortExpression"] = sortExpression; 

     if (Session["SortDirection"] != null && Session["SortDirection"].ToString() == SortDirection.Descending.ToString()) 
     { 
      Session["SortDirection"] = SortDirection.Ascending; 
      SortGridview(sortExpression, "ASC"); 
     } 
     else 
     { 
      Session["SortDirection"] = SortDirection.Descending; 
      SortGridview(sortExpression, "DESC"); 
     } 
} 

private void SortGridview(string sortExpression, string Direction) 
    { 
     DataView dv = null; 
     DataTable dt = GridView1.DataSource as DataTable; 
     dv = new DataView(dt); 
     dv.Sort = sortExpression + " " + Direction; 
     GridView1.DataSource = dv; 
     GridView1.DataBind(); 

    }