사용자 정의 데이터 소스를 사용하는 경우 asp.net gridview에서 열을 정렬하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/138412

문제

사용자 정의 SQLDatasource를 사용할 때 사용자가 데이터 열을 정렬 할 수 있도록 GridView를 얻을 수 없습니다.

HTML의 ASP 참조 코드가 최소화되는 그리드 뷰가 있습니다.

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

Code-Behind에서 동적으로 만들어진 SQLDATASOURCE를 첨부합니다 (포함 된 열은 항상 동일하지 않으므로 생성하는 데 사용되는 SQL이 런타임에 구성됩니다). 예를 들어:

열을 설정했습니다 ...

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);

그럼 gridview ...

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

현재 사용자가 열 데이터를 정렬 할 것으로 예상 할 때 열 제목을 클릭하면 아무 일도 일어나지 않습니다. 내가 놓친 아이디어가 있습니까?

더 좋은 방법이 있다면 이것이 나에게 지저분 해 보이기 때문에 도움이 될 것입니다!

도움이 되었습니까?

해결책

먼저 이벤트를 추가해야합니다.

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

그러면 그 이벤트는 다음과 같습니다.

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

기본적으로 데이터를 다시 가져와야합니다.

당신은 그것이 지저분 해 보이고 더 나은 방법이 있다는 것이 옳습니다 : ASP.NET MVC

불행히도 그것은 매우 다른 페이지 모델입니다.

다른 팁

DataBind ()가 정렬 핸들러에서 호출하기 전에 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;
}

이 도움이되기를 바랍니다. 구현하기 위해 추가 도움이 필요한지 알려주세요.

즐기다!

나는 이것에 대해 잘 모르겠지만 표준 sqldatasource를 사용하고 해당 필드에 따라 분류를 클릭하면 SQLDATASOURCE가 데이터로 다시 채워져 있으며 그리드에 반등됩니다. 따라서 정렬은 클라이언트 측에서 발생하지 않으며 SQLDATASOURCE의 선택 메드가 DataReader가 아닌 경우에만 수행 할 수 있습니다.

분류 이벤트를 처리 할 때 SQLDatasource를 재현하고 GridView로 리바운드합니까? 정렬 필드와 방향을 생성 SelectCommand에 넣을 수 있습니까? 아니면 sqldatasource의 SortParameterName 속성에 넣으시겠습니까?

나는 당신이 sqldatasource를 그리드로 반등해야한다고 확신하며, 즉시 그것을 만들기 때문에 다시 채워야합니다.

안하는 것보다 늦게하는 것이 낫다?

기본적으로 옳은 것인 Keith의 제안에 대한 추가.

진실은 GridView_Sorting 이벤트의 정렬을 다루어야한다는 것입니다. 예를 들어 Page_load 이벤트에서 GridView를 DataBind () 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로 전환하여 네트워크 트래픽과 브라우저에 대해 페이지가 훨씬 가벼워지는 것이 좋습니다. 페이지가 다시 게시 될 때마다 그리드가 완전히 재현되므로 그렇게 할 수 있습니다.

좋은 하루 되세요!

남자 이름

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top