Pergunta

Eu não posso pegar meu GridView para habilitar um usuário classificar uma coluna de dados quando eu estou usando um SqlDataSource personalizado.

Eu tenho um GridView em que o código na referência ASP a ele no HTML é mínima:

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

No código-behind eu anexar um SqlDataSource dinamicamente criado (as colunas que contém não são sempre os mesmos para que o SQL usado para criá-lo é construído em tempo de execução). Por exemplo:

Eu configurar as colunas ...

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

grid.Columns.Add(column);

a fonte de dados ...

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

então o gridview ...

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

No momento, nada acontece quando um usuário clica em um título de coluna quando eu esperaria que para classificar os dados da coluna. Qualquer pessoa alguma idéia o que eu estou perdendo?

Se há uma maneira mais agradável de fazer isso que seria útil também como isso parece confuso para mim!

Foi útil?

Solução

Primeiro você precisa adicionar um evento:

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

Depois que o evento se parece com:

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

Você tem basicamente para obter seus dados novamente.

Você está certo que ele parece confuso e não há uma maneira melhor: ASP.Net MVC

Infelizmente esse é um modelo de página drasticamente diferente.

Outras dicas

Você também pode apenas transferir o datasource.SelectCommand antes da chamada DataBind () no manipulador de classificação. Algo parecido com isto:

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

Espero que isso ajuda. Deixe-me saber se você precisar de ajuda extra para implementá-lo.

Aproveite!

Eu não tenho certeza sobre este, mas se você usar um SqlDataSource padrão e você clique em um campo para classificar de acordo com esse campo, o SqlDataSource é preenchida novamente com os dados e é rebote para a rede. Assim, a classificação não acontece no lado do cliente e também pode ser feito somente quando o SelectMethod do SQLDataSource não é DataReader.

Ao manusear o evento de triagem, você recriar o SqlDataSource e rebote para o GridView? você pode colocar o campo e direção de classificação à generatedSelectCommand, que você usa? Ou colocá-lo para a propriedade SortParameterName do SQLDataSource?

Estou absolutamente certo de que você tem para se recuperar a SqlDataSource para a rede, e desde que você criá-lo em tempo real, você tem que preenchê-lo novamente.

Melhor tarde do que nunca?

Alguns adição para a sugestão de Keith, que é basicamente o caminho certo.

A verdade é que você tem que lidar com a classificação no evento gridView_Sorting. Não há necessidade de DataBind () o GridView anteriormente, por exemplo, no evento Page_Load. Lá você só deve chamar o método GridView.Sort () em vez de .DataBind (). Aqui é como vai:

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

Em seguida, vamos ter um olhar sobre gridView_Sorting evento.

Lá você tem que empurrar a fonte de dados para a classificação correta. O próprio GridView não lidar com isso (neste caso, pelo menos).

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

Não há necessidade de código de qualquer funcionalidade de classificação na fonte de dados como passar parâmetros de classificação de procedimento armazenado. Todos ordenação tem lugar nas peças acima de código.

Além disso, é bom ter a gridView.EnableViewState mudou para Falso que faz com que a página para ser muito mais leve para o tráfego de rede e para o navegador também. Pode fazer isso como a grade é recriado inteiramente sempre que a página está de volta post.

Tenha um bom dia!

Martin

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top