对允许编辑的 GridView 文本框列进行排序
Sort GridView textbox column that is allowed to edit
我有一个包含 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
我找到了各种关于不同排序方式的文章,我可以排序。
但我的实际问题是,我可以通过这种方式对每一列进行排序。但是,当我更改下拉值或文本框值,然后尝试按任何列排序时,它会排序并显示我从数据库中获取的数据,而不是我在排序前刚刚编辑的数据。编辑的数据消失了。
有没有办法在排序后保留编辑的数据?我不想更新数据库。
如果您编辑数据的值 table 那么您应该更新您的 DataTable 以进行缓存。
然后调用您的 RebindData 它应该可以工作。
请post您的行更新功能也正常。这将使编辑后发生的事情更加清晰。
编辑数据后,我更新了 DataTable,将 DataTable 重新分配给 Cache,然后调用了 DataBind()。
要保留下拉字段的编辑值,从 RowDataBound 中的 DataTable 更新下拉字段。
感谢您的解决方案。
我有一个包含 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
我找到了各种关于不同排序方式的文章,我可以排序。
但我的实际问题是,我可以通过这种方式对每一列进行排序。但是,当我更改下拉值或文本框值,然后尝试按任何列排序时,它会排序并显示我从数据库中获取的数据,而不是我在排序前刚刚编辑的数据。编辑的数据消失了。
有没有办法在排序后保留编辑的数据?我不想更新数据库。
如果您编辑数据的值 table 那么您应该更新您的 DataTable 以进行缓存。
然后调用您的 RebindData 它应该可以工作。
请post您的行更新功能也正常。这将使编辑后发生的事情更加清晰。
编辑数据后,我更新了 DataTable,将 DataTable 重新分配给 Cache,然后调用了 DataBind()。
要保留下拉字段的编辑值,从 RowDataBound 中的 DataTable 更新下拉字段。
感谢您的解决方案。