2016-05-14 34 views
1

试图在我的gridview上实现一个排序如下,它不像我期望的那样工作1.它不按第一列排序,因为我想,第一列降序2 。当我点击每一列他们似乎改变顺序,但我不能确定什么是实际排序asc/desc。我真的只需要第一列这是ID排序desc。在vb.net上排序gridview

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> 

忍不住要使用另一种方法再重新写了很多,因为我有一种拼凑了一起,从在网络上一对夫妇的来源和推测它会没事的?可能像视图状态那样小,但目前无法理解它!?

+1

您可以在您的SQL字符串中添加“Order By”语句。 – OneFineDay

回答

0

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

排序参数可以被存储在ViewState(或会议):

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 
+0

谢谢,这是辉煌的! :) :)只是一个其他问题,我推测在SQL查询中按1 desc排序可能会给我排序上第一列降序时,我的gridview被加载,但似乎忽略这是有一种正确的方法来得到一个排序desc在第一列时第一次加载... – user3005409

+0

我已经为IsAscendingSort属性默认指定了True。我修改了答案以返回'False';应该做你想做的事。 – ConnorsFan

+0

顺便说一句,您可以通过设置'SortExpression'的默认值来选择初始排序列。在我的回答中,默认是'id'字段。 – ConnorsFan