ASPX Codebehind - 更改 SelectCommand 会导致排序恢复为原始数据
ASPX Codebehind - Changing SelectCommand causes sorting to revert to original data
我有一个 GridView 附加到 SQL 数据源,它工作正常,我可以使用原始数据对其进行正确排序。
如果我告诉代码隐藏通过 ASPX 页面 (SqlDataSource2) 上预定义的 SQLDataSource 查找特定信息,后续排序将正常工作。
如果我告诉代码隐藏修改预先存在的 sqldatasource 并绑定它,后续排序将无法正常工作,但 returns 原始数据。
先决条件:
SQL 数据源连接字符串在 Web.config 中定义,id、last_modified 和 view_count 列在 table document_index.
中
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" />
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
SelectCommand="SELECT id, last_modified, view_count FROM [document_index] ORDER by id"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>" />
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
SelectCommand= "SELECT id, last_modified, view_count FROM [document_index] WHERE view_count LIKE '7'"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button runat="server" Text="Select View Using ASPX SQL Source2 (Sort Works)" OnClick="aspxviewchange" />
<asp:Button runat="server" Text="Select View Using Codebehind SQL Source1 Change Data (Sort Breaks)" OnClick="cbviewchange" />
<asp:GridView ID="GridView1" EnableSortingAndPagingCallbacks= "true" runat="server" AllowSorting="True" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" Width="100%" CellPadding="4" Padding="20" DataKeyNames="id" ForeColor="#333333" GridLines="None" AllowPaging="True" PageSize="25" AllowCustomPaging="True">
<Columns>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
C# 代码隐藏:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
CreateNewColumn("last_modified", "Last Modified");
CreateNewColumn("view_count", "Views");
}
}
protected void CreateNewColumn(string SQLcolname, string header)
{
BoundField NewColumnName = new BoundField();
NewColumnName.DataField = SQLcolname;
NewColumnName.SortExpression = SQLcolname;
NewColumnName.HeaderText = header;
GridView1.Columns.Add(NewColumnName);
}
protected void aspxviewchange(object sender, EventArgs e) // SUBSEQUENT SORTING WORKS
{
GridView1.DataSourceID = "SQLDataSource2";
GridView1.DataBind();
}
protected void cbviewchange(object sender, EventArgs e) // SUBSEQUENT SORTING BROKEN
{
SqlDataSource1.SelectCommand = "SELECT id, last_modified, view_count FROM [document_index] WHERE view_count LIKE '7'";
GridView1.DataSourceID = "SQLDataSource1";
GridView1.DataBind();
}
}
选择 ASPX SQL 按钮正确排序,后续排序工作。
选择 Codebehind SQL 按钮排序正确,但后续排序不起作用。
but subsequent sorting does not work
后续排序不起作用的原因是您 re-submitting 页面和网格正在重新绑定到默认数据源 (DataSourceID="SqlDataSource1"
)。
您将必须捕获哪个数据源是 "sending" SORT 请求并重新绑定网格
类似于:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
//capture SORT request (which View?)
string RequestType = (get the grid request type);
if(RequestType = "SortView1")
{
GridView1.datasourceID = datasource1;
GridView1.DataBind();
}
else if(RequestType = "SortView2")
{
GridView1.datasourceID = datasource2;
GridView1.DataBind();
}
}
else
{
GridView1.datasourceID = datasource1;
GridView1.DataBind();
}
}
或者,您可以(覆盖)编写自己的 'onGridView1Submit' 方法
无论哪种方式,您还应该删除网格控件
中的默认数据源 DataSourceID="SqlDataSource1"
我决定根据我的代码隐藏参数在单个 SQL 语句中使用 IF/BEGIN/END/ELSE IF 子句来解决此问题。这似乎是最好的方法,考虑动态更改 select 命令会导致其他问题。
我有一个 GridView 附加到 SQL 数据源,它工作正常,我可以使用原始数据对其进行正确排序。
如果我告诉代码隐藏通过 ASPX 页面 (SqlDataSource2) 上预定义的 SQLDataSource 查找特定信息,后续排序将正常工作。
如果我告诉代码隐藏修改预先存在的 sqldatasource 并绑定它,后续排序将无法正常工作,但 returns 原始数据。
先决条件: SQL 数据源连接字符串在 Web.config 中定义,id、last_modified 和 view_count 列在 table document_index.
中ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" />
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
SelectCommand="SELECT id, last_modified, view_count FROM [document_index] ORDER by id"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>" />
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
SelectCommand= "SELECT id, last_modified, view_count FROM [document_index] WHERE view_count LIKE '7'"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button runat="server" Text="Select View Using ASPX SQL Source2 (Sort Works)" OnClick="aspxviewchange" />
<asp:Button runat="server" Text="Select View Using Codebehind SQL Source1 Change Data (Sort Breaks)" OnClick="cbviewchange" />
<asp:GridView ID="GridView1" EnableSortingAndPagingCallbacks= "true" runat="server" AllowSorting="True" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" Width="100%" CellPadding="4" Padding="20" DataKeyNames="id" ForeColor="#333333" GridLines="None" AllowPaging="True" PageSize="25" AllowCustomPaging="True">
<Columns>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
C# 代码隐藏:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
CreateNewColumn("last_modified", "Last Modified");
CreateNewColumn("view_count", "Views");
}
}
protected void CreateNewColumn(string SQLcolname, string header)
{
BoundField NewColumnName = new BoundField();
NewColumnName.DataField = SQLcolname;
NewColumnName.SortExpression = SQLcolname;
NewColumnName.HeaderText = header;
GridView1.Columns.Add(NewColumnName);
}
protected void aspxviewchange(object sender, EventArgs e) // SUBSEQUENT SORTING WORKS
{
GridView1.DataSourceID = "SQLDataSource2";
GridView1.DataBind();
}
protected void cbviewchange(object sender, EventArgs e) // SUBSEQUENT SORTING BROKEN
{
SqlDataSource1.SelectCommand = "SELECT id, last_modified, view_count FROM [document_index] WHERE view_count LIKE '7'";
GridView1.DataSourceID = "SQLDataSource1";
GridView1.DataBind();
}
}
选择 ASPX SQL 按钮正确排序,后续排序工作。 选择 Codebehind SQL 按钮排序正确,但后续排序不起作用。
but subsequent sorting does not work
后续排序不起作用的原因是您 re-submitting 页面和网格正在重新绑定到默认数据源 (DataSourceID="SqlDataSource1"
)。
您将必须捕获哪个数据源是 "sending" SORT 请求并重新绑定网格
类似于:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
//capture SORT request (which View?)
string RequestType = (get the grid request type);
if(RequestType = "SortView1")
{
GridView1.datasourceID = datasource1;
GridView1.DataBind();
}
else if(RequestType = "SortView2")
{
GridView1.datasourceID = datasource2;
GridView1.DataBind();
}
}
else
{
GridView1.datasourceID = datasource1;
GridView1.DataBind();
}
}
或者,您可以(覆盖)编写自己的 'onGridView1Submit' 方法
无论哪种方式,您还应该删除网格控件
中的默认数据源DataSourceID="SqlDataSource1"
我决定根据我的代码隐藏参数在单个 SQL 语句中使用 IF/BEGIN/END/ELSE IF 子句来解决此问题。这似乎是最好的方法,考虑动态更改 select 命令会导致其他问题。