【问题标题】:sorting on vb.net gridview在 vb.net gridview 上排序
【发布时间】:2016-09-10 15:55:24
【问题描述】:

尝试在我的 gridview 上实现如下排序,它不像我期望的那样工作 1. 它没有按我想要的第一列排序,第一列降序 2. 当我单击每个他们似乎改变了列的顺序,但我无法确定实际按 asc/desc 排序的内容。我真的只需要第一列是 id 来排序 desc。

Imports System.Data.SqlClient

Public Class Query
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then            
        BindGrid()
    End If
End Sub

Protected Sub BindGrid()
    Dim dt As New DataTable()
    Dim strConnString As [String] = System.Configuration.ConfigurationManager.ConnectionStrings("constr").ConnectionString()
    Dim strQuery As String = "select id,relates_to,'../../' + location as location from Files;"
    Dim cmd As New SqlCommand(strQuery)
    Dim con As New SqlConnection(strConnString)
    Dim sda As New SqlDataAdapter()
    cmd.CommandType = CommandType.Text
    cmd.Connection = con
    Try
        con.Open()
        sda.SelectCommand = cmd
        sda.Fill(dt)
        ViewState("dt") = dt
        GridView1.DataSource = dt
        GridView1.DataBind()
    Catch ex As Exception
        Response.Write(ex.Message)
    Finally
        con.Close()
        sda.Dispose()
        con.Dispose()
    End Try
End Sub

Protected Sub OnRowDataBound(sender As Object, e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim item As String = e.Row.Cells(0).Text
        For Each button As Button In e.Row.Cells(3).Controls.OfType(Of Button)()
            If button.CommandName = "Delete" Then
                button.Attributes("onclick") = "if(!confirm('Do you want to delete " + item + "?')){ return false; };"
            End If
        Next
    End If
End Sub

Protected Sub OnRowDeleting(sender As Object, e As GridViewDeleteEventArgs)
    Try
        Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("constr").ToString())                
            Dim cmd As New SqlCommand()
            cmd.Connection = conn
            cmd.CommandText = "DELETE FROM Files WHERE id = @id"
            cmd.CommandType = CommandType.Text
            Dim strBetID As String = GridView1.Rows(e.RowIndex).Cells(0).Text
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = strBetID
            conn.Open()
            cmd.ExecuteNonQuery()
        End Using
        BindGrid()
    Catch ex As Exception
        Response.Write(ex.Message)
    End Try
End Sub

Private Sub LinkButtonUsers_Click(sender As Object, e As EventArgs) Handles LinkButtonUsers.Click
    Response.Redirect("/Admin/Admin/Users.aspx")
End Sub

Private Sub LinkButtonTips_Click(sender As Object, e As EventArgs) Handles LinkButtonTips.Click
    Response.Redirect("/Admin/Admin/Admin.aspx")
End Sub

Private Sub LinkButtonEmail_Click(sender As Object, e As EventArgs) Handles LinkButtonEmail.Click
    Response.Redirect("/Admin/Admin/Email.aspx")
End Sub

Private Sub LinkButtonKnowledge_Click(sender As Object, e As EventArgs) Handles LinkButtonKnowledge.Click
    Response.Redirect("/Admin/Admin/Knowledge.aspx")
End Sub

Protected Sub LinkButtonQuery_Click(sender As Object, e As EventArgs) Handles LinkButtonQuery.Click
    Response.Redirect("/Admin/Admin/Query.aspx")
End Sub

Protected Sub OnPageIndexChanging(sender As Object, e As GridViewPageEventArgs)
    GridView1.PageIndex = e.NewPageIndex
    Me.BindGrid()
End Sub

Protected Sub GridView1_Sorting(sender As Object, e As GridViewSortEventArgs)
    Dim dt As DataTable = ViewState.Item("dt")
    Dim dv As DataView = dt.DefaultView
    Dim sd As String = ""

    If Not dt Is Nothing Or Not dt Is "" Then
        If e.SortDirection.ToString.Contains("asc") Then
            sd = "asc"
        ElseIf e.SortDirection.ToString.Contains("desc") Then
            sd = "desc"
        Else
            sd = "asc"
        End If
    End If

    Try
        dv.Sort = e.SortExpression + " " + sd
        dt = dv.ToTable
        GridView1.DataSource = dt
        GridView1.DataBind()
    Catch ex As Exception

    End Try        
End Sub
End Class

aspx 是这样的:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDeleting="OnRowDeleting" 
                    OnRowDataBound="OnRowDataBound" EnableModelValidation="True" AllowSorting="true"  
                    OnSorting="GridView1_Sorting" AllowPaging="True" OnPageIndexChanging="OnPageIndexChanging">
                    <Columns>
                        <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="id" />
                        <asp:BoundField DataField="relates_to" HeaderText="relates_to" SortExpression="relates_to" />                                                        
                        <asp:TemplateField HeaderText="Preview Image" SortExpression="location">
                         <ItemTemplate>
                                <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl='<%# Eval("location")%>'
                                Width="100px" Height="100px" Style="cursor: pointer" OnClientClick="return LoadDiv(this.src);" />
                        </ItemTemplate>    
                            </asp:TemplateField>                        
                        <asp:CommandField ShowDeleteButton="True" ButtonType="Button" />
                    </Columns> 
                </asp:GridView>

我很想用另一种方法重新编写很多东西,因为我从网上的几个来源拼凑起来,并认为它会好起来吗?可能是像视图状态方面这样的小事,但目前无法理解!?..

【问题讨论】:

  • 您可以在 SQL 字符串中添加 Order By 语句。

标签: asp.net vb.net sorting gridview


【解决方案1】:

您可以从 Sorting 事件中调用 BindGrid 来填充 GridView,而不是将 DataTable 存储在 ViewState 中。如果您在该方法中包含数据排序,它将适用于所有情况。

排序参数可以存储在ViewState(或Session)中:

Protected Property SortExpression As String
    Get
        Dim value as Object = ViewState("SortExpression")
        Return If(Not IsNothing(value), CStr(value), "id")
    End Get
    Set(value As String)
        ViewState("SortExpression") = value
    End Set
End Property

Protected Property IsAscendingSort As Boolean
    Get
        Dim value as Object = ViewState("IsAscendingSort")
        Return If(Not IsNothing(value), CBool(value), False)
    End Get
    Set(value As Boolean)
        ViewState("IsAscendingSort") = value
    End Set
End Property

它们可以在排序事件处理程序中设置:

Protected Sub GridView1_Sorting(sender As Object, e As GridViewSortEventArgs)
    If e.SortExpression = SortExpression Then
        IsAscendingSort = Not IsAscendingSort
    Else
        SortExpression = e.SortExpression
    End If
    BindGrid()
End Sub

并用在BindGrid方法中:

Protected Sub BindGrid()
    ...
    sda.Fill(dt)
    Dim dv As DataView = dt.DefaultView
    dv.Sort = SortExpression + " " + If(IsAscendingSort, "ASC", "DESC")
    GridView1.DataSource = dv
    GridView1.DataBind()
    ...
End Sub

【讨论】:

  • 感谢这太棒了! :) :) 我假设在 sql 查询中按 1 desc 排序的另一个问题可能在加载我的 gridview 时对第一列进行了降序排序,但似乎忽略了这一点是否有正确的方法来获得排序 desc首次加载时在第一列...
  • 我默认为IsAscendingSort 属性指定了True。我修改答案返回False;那应该做你想做的。
  • 对了,可以通过设置SortExpression的默认值来选择初始排序列。在我的回答中,默认是 id 字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多