2008-09-26 2 views
4

사용자 지정 SqlDataSource를 사용할 때 사용자가 데이터 열을 정렬 할 수 있도록 GridView를 가져올 수 없습니다. 내가 포함 된 열이없는 (동적으로 생성의 SqlDataSource를 부착 숨김 코드에서사용자 정의 데이터 소스를 사용하는 경우 ASP.NET GridView에서 열을 정렬하는 방법은 무엇입니까?

<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True"> 
</asp:GridView> 

:

나는 a를 HTML에서 그것의 ASP 참조의 코드가 최소 인의 GridView이 항상 동일하므로 런타임에 작성되는 SQL이 작성됩니다). 예를 들어 :

나는 다음의 gridview ... 상기

grid.DataSource = dataSource; 
grid.DataKeyNames = mylistOfKeys; 
grid.DataBind(); 

를 열 ...

BoundField column = new BoundField(); 
column.DataField = columnName; 
column.HeaderText = "Heading"; 
column.SortExpression = columnName; 

grid.Columns.Add(column); 

데이터 소스 ...

SqlDataSource dataSource = new SqlDataSource(
    "System.Data.SqlClient", 
    connectionString, 
    generatedSelectCommand); 

을 설정 사용자가 열 데이터를 정렬 할 때 열 머리글을 클릭 할 때 아무 일도 일어나지 않습니다. 내가 누락 된 어떤 아이디어라도?

나에게 지저분 해 보이는 것처럼 도움이 될만한 방법이 있다면!

답변

4

먼저 당신이 이벤트를 추가해야합니다 : 당신은 기본적으로 다시 데이터를 얻을 수 있습니다

protected void gvName_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    ... 
    //rebind gridview 
} 

: 같은

<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ... 

그런 다음 해당 이벤트 보인다. ASP.Net MVC는

그러나 불행하게도이 크게 다른 페이지 모델의 :

당신은 지저분한 외모와 더 나은 방법이 그 권리입니다.

0

표준 SqlDataSource를 사용하고 해당 필드에 따라 정렬 할 필드를 클릭하면 SqlDataSource에 데이터가 다시 채워지고 표로 리바운드됩니다. 따라서 정렬은 클라이언트 측에서 일어나지 않으며 SQLDataSource의 selectmethod가 DataReader가 아닌 경우에만 수행 할 수도 있습니다.

정렬 이벤트를 처리 할 때 SqlDataSource를 다시 만들고 GridView에 리바운드 하시겠습니까? 당신이 사용하는 generatedSelectCommand에 정렬 필드와 방향을 넣을 수 있습니까? 또는 SQLDataSource의 SortParameterName 속성에 넣으시겠습니까?

그리드에 SqlDataSource를 리바운드해야한다는 것은 확실합니다. 그리고 즉시 작성하기 때문에 다시 채워야합니다.

+0

현재 정렬 작업을 처리하지 않고 기본 동작으로 남겨두고 있습니다. 그러나 Sorting 이벤트 내에서 SortExpression 및 SortDirection이 의미가 있으며 공백이 아닌지 확인했습니다. 데이터 소스가 포스트 백의 격자에 다시 바인딩됩니다. –

+0

Keith가 언급 한대로 이벤트를 처리해야합니다. 표준 SqlDataSource 컨트롤을 사용하면 자동으로 수행되지만이 경우 직접 처리해야합니다. – Biri

0

키이스의 제안에 대한 추가 사항은 기본적으로 올바른 것입니다.

진실은 gridView_Sorting 이벤트에서 정렬을 처리해야한다는 것입니다. 예를 들어, Page_Load 이벤트와 같이 이전에 GridView를 DataBind() 할 필요가 없습니다. 여기서는 .DataBind() 대신 GridView.Sort() 메서드 만 호출해야합니다.다음은 어떻게 진행되는지입니다.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If Not IsPostBack Then 

     Me.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection")) 

    End If 

End Sub 

다음은 gridView_Sorting 이벤트에 대해 살펴 보겠습니다.

여기에서 데이터 소스를 올바른 정렬로 푸시해야합니다. GridView 자체에서 처리하지 않습니다 (이 경우에는 최소한).

Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting 
    If IsPostBack Then 
     e.Cancel = True 
     Dim sortDir As SortDirection = SortDirection.Ascending 
     If e.SortExpression = Me.Q_SortExpression And Me.Q_SortDirection = SortDirection.Ascending Then 
      sortDir = SortDirection.Descending 
     End If 
     RedirectMe(e.SortExpression, sortDir) 
    Else 
     Dim sortExpr As String = e.SortExpression + " " + IIf(e.SortDirection = SortDirection.Ascending, "ASC", "DESC") 
     Dim dv As System.Data.DataView = Me.dsrcView.Select(New DataSourceSelectArguments(sortExpr)) 
     Me.gridView.DataSource = dv 
     Me.gridView.DataBind() 
    End If 
End Sub 

정렬 매개 변수를 저장 프로 시저에 전달하는 것과 같은 데이터 정렬 기능을 코딩 할 필요가 없습니다. 모든 정렬은 위 코드에서 수행됩니다.

또한 gridView.EnableViewState를 False로 전환하면 네트워크 트래픽과 브라우저에 대한 페이지가 훨씬 가벼워집니다. 페이지가 다시 게시 될 때마다 그리드가 완전히 다시 만들어지기 때문에 그렇게 할 수 있습니다.

좋은 하루 되세요!

마틴

4

또한 단지 정렬 처리기에서 데이터 바인딩() 호출하기 전에 datasource.SelectCommand를 재 할당 할 수 있습니다. 다음과 같이 입력하십시오 :

protected void gvItems_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    GridView gv = (GridView)sender; 
    SqlDataSource ds = (SqlDataSource)gv.DataSource; 
    ds.SelectCommand = ds.SelectCommand + " order by " 
     + e.SortExpression + " " + GetSortDirection(e.SortDirection); 
    gvItems.DataSource = ds; 
    gvItems.DataBind(); 
} 

string GetSortDirection(string sSortDirCmd) 
{ 
    string sSortDir; 
    if ((SortDirection.Ascending == sSortDirCmd)) 
    { 
     sSortDir = "asc"; 
    } 
    else 
    { 
     sSortDir = "desc"; 
    } 
    return sSortDir; 
} 

이 도움이 되었기를 바랍니다. 그것을 구현하는 데 추가 도움이 필요하면 알려주십시오.

즐기십시오!

+0

이것이 유효한 버전입니까? – SearchForKnowledge

관련 문제