【问题标题】:Sort GridView textbox column that is allowed to edit对允许编辑的 GridView 文本框列进行排序
【发布时间】:2015-10-22 01:36:19
【问题描述】:

我有一个 5 列的 GridView。两个是文本框字段,两个是下拉字段,一个是行序号。 AllowSorting 设置为“true”

每个字段都是一个带有各自 SortExpressions 的 TemplateField。 ASP 页面看起来像这样:

<asp:GridView ID="GVDoc" runat="server" AllowPaging="false" AllowSorting="true" AutoGenerateColumns="false" OnRowDataBound="GVDoc_ItemDataBound">
    <asp:TemplateField HeaderText="Sequence" SortExpression="Sequence" >
        <ItemTemplate>
            <asp:Label ID="lblOrder" Text='<%# Eval("Sequence")%>' runat="server"></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Property (Yes/No)" SortExpression="Property" >
        <ItemTemplate>
            <asp:DropDownList ID="ddlProperty" runat="server" DataValueField='<%# Eval("Property")%>'>
                <asp:ListItem Value="No">No</asp:ListItem>
                <asp:ListItem Value="Yes">Yes</asp:ListItem>
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Valid (Yes/No)" SortExpression="Valid">
        <ItemTemplate>
           <asp:DropDownList ID="ddlValid" runat="server" DataValueField='<%# Eval("Valid")%>'>
                <asp:ListItem Value="No">No</asp:ListItem>
                <asp:ListItem Value="Yes">Yes</asp:ListItem>
           </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Name" SortExpression="Name" >
        <ItemTemplate>
            <asp:TextBox ID="txtName" runat="server" Text='<%# Eval("Name") %>'></asp:TextBox>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Description" SortExpression="Description" >
        <ItemTemplate>
            <asp:TextBox ID="txtDescription" runat="server" Text='<%# Eval("Description")%>'></asp:TextBox>
        </ItemTemplate>
    </asp:TemplateField>
</asp:GridView>

每个字段都是从数据库中填充的。允许用户编辑文本并更改下拉值。编辑后的数据不会在数据库中更新。只是为了能在屏幕上看到。

我需要允许根据每一列进行排序。我可以对所有列进行排序。

代码如下:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        Dim dt As DataTable
        Dim sql As String = "SELECT ROW_NUMBER() OVER(ORDER BY File_Id) as Sequence, 'No' as Property, 'No' as Valid, File_Id, Name, Description FROM FILE

        Using conn As SqlConnection = New SqlConnection(...ConnectionString...)
            Using comm As SqlCommand = New SqlCommand(sql, conn)
                conn.Open()
                Using da As SqlDataAdapter = New SqlDataAdapter(comm)
                    dt = New DataTable("table")
                    da.Fill(dt)
                End Using
            End Using
        End Using
        GVDoc.DataSource = dt
        GVDoc.DataBind()
        Cache("ABC") = dt
        ViewState("Sequence") = "Sequence ASC"
        ViewState("Property") = "Property ASC"
        ViewState("Valid") = "Valid ASC"
        ViewState("Name") = "Name ASC"
        ViewState("Description") = "Description ASC"            
    End If
End Sub

Protected Sub GVDoc_Sorting(sender As Object, e As GridViewSortEventArgs) Handles GVDoc.Sorting
    If ViewState("Sequence").ToString().Contains(e.SortExpression) Then
        If ViewState("Sequence").ToString().Contains("ASC") Then
            RebindData(e.SortExpression, "DESC", "Sequence")
        Else
            RebindData(e.SortExpression, "ASC", "Sequence")
        End If
    ElseIf ViewState("Property").ToString().Contains(e.SortExpression) Then
        If ViewState("Property").ToString().Contains("ASC") Then
            RebindData(e.SortExpression, "DESC", "Property")
        Else
            RebindData(e.SortExpression, "ASC", "Property")
        End If
    ElseIf ViewState("Valid").ToString().Contains(e.SortExpression) Then
        If ViewState("Valid").ToString().Contains("ASC") Then
            RebindData(e.SortExpression, "DESC", "Valid")
        Else
            RebindData(e.SortExpression, "ASC", "Valid")
        End If
    ElseIf ViewState("Name").ToString().Contains(e.SortExpression) Then
        If ViewState("Name").ToString().Contains("ASC") Then
            RebindData(e.SortExpression, "DESC", "Name")
        Else
            RebindData(e.SortExpression, "ASC", "Name")
        End If
    ElseIf ViewState("Description").ToString().Contains(e.SortExpression) Then
        If ViewState("Description").ToString().Contains("ASC") Then
            RebindData(e.SortExpression, "DESC", "Description")
        Else
            RebindData(e.SortExpression, "ASC", "Description")
        End If
    End If
End Sub

Private Sub RebindData(ColumnName As String, SortOrder As String, SortExpression As String)
    Dim dt As DataTable = CType(Cache("ABC"), DataTable)
    dt.DefaultView.Sort = ColumnName + " " + SortOrder
    GVDoc.DataSource = dt
    GVDoc.DataBind()
    ViewState(SortExpression) = ColumnName + " " + SortOrder
End Sub

我找到了各种关于不同排序方式的文章,我可以对其进行排序。

但我的实际问题是,我能够以这种方式按每一列排序。但是,当我更改下拉值或文本框值,然后尝试按任何列排序时,它会排序并显示我从数据库中获取的数据,而不是我在排序前刚刚编辑的数据。编辑的数据会消失。

有没有办法在排序后保留编辑过的数据?我不想更新数据库。

【问题讨论】:

    标签: asp.net vb.net sorting gridview


    【解决方案1】:

    编辑数据后,我更新了DataTable,将DataTable重新分配给Cache,然后调用DataBind()。

    要保留下拉字段的编辑值,请从 RowDataBound 中的 DataTable 更新下拉字段。

    感谢您的解决方案。

    【讨论】:

      【解决方案2】:

      如果您编辑数据表的值,那么您应该更新您的数据表以缓存。

      然后调用您的 RebindData 它应该可以工作。

      请也发布您的行更新功能。这将使编辑后发生的事情更加清晰。

      【讨论】:

      • 我没有行更新功能,因为我没有将它更新到数据库。列值是可编辑的,因为它们是下拉列表和文本框。
      • 好吧,至少你应该更新你的 DataTable 并重新绑定以反映对 GridView 的更改。您可以使用 EditItemTemplate 和更新按钮来提交对 DataTable 的更改。并使用标签作为 ItemTemplate 控件进行查看。
      • 更新 DataTable 然后重新绑定对我有用。但现在我有一些其他问题。我编写了一个用于更新 DataTable 的选择查询。选择查询对每个字段都有值,但是当我在网格视图上进行数据绑定时,弹出下拉字段的默认值,而不是我在选择查询中编辑和提到的值。
      • 确定 onrowdatabound 从数据表中获取值并相应地选择下拉列表。如果答案有帮助,请标记为答案。
      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 2012-06-02
      • 2015-12-23
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2012-10-21
      相关资源
      最近更新 更多