2017-02-11 21 views
0

我有連接到一個SqlDataSource一個GridView,它工作正常,我可以與原始數據正確排序。ASPX代碼隱藏 - 更改的SelectCommand導致排序恢復到原始數據

如果我告訴代碼隱藏找到通過ASPX頁面(SqlDataSource2)上預先定義SqlDataSource的具體信息,隨後的分揀工作正常。

如果我告訴代碼隱藏修改預先存在的SqlDataSource和綁定的是,後續的分揀工作不正常,但返回原始數據。

上一篇: SQL在Web.config中定義的數據源連接字符串,其中包含表document_index中的id,last_modified和view_count列。

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按鈕排序正確,但後續排序不起作用。

+0

您尚未發佈足夠的代碼。基本上它取決於這個代碼在頁面事件生命週期中執行的位置,這是陳舊和難以解釋的。如果可能的話,我會推薦將您的整個代碼放在後面。 –

+0

對不起,我編輯了我的原始文章併發布了完整的代碼。 –

回答

0

我已決定通過在基於我的代碼隱藏參數的單個SQL語句中使用IF/BEGIN/END/ELSE IF子句來解決此問題。這似乎是最好的方式,考慮動態改變選擇命令會導致其他問題。

0

但後續的分揀不起作用

爲什麼後續排序不工作的原因是,您要重新提交頁面和網格重新綁定到默認數據源(DataSourceID="SqlDataSource1")。

你必須抓住它是「送」的排序reguest數據源,並重新綁定網格

類似:

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"在網格控制

+0

ASPX GridView沒有Rebind屬性,所以GridView1.Rebind();不管用。除非我需要使用額外的庫,如果需要,請詳細說明。 –

+0

是的你是對的。我只是習慣於暴露Rebind()方法(用於asp.net網格)的第三方供應商。 最重要的只是想傳達引起你所看到的行爲的邏輯。這是Webforms最棘手的部分之一。習慣什麼時候發生什麼事以及哪些順序。 我添加了一些更多的代碼,但沒有寫出所有的條件邏輯來獲取哪個排序請求,但是讓我們知道是否您自己填寫代碼。我會盡力協助。祝你好運! – DaniDev

+0

這是否適合你?讓我知道,如果需要進一步的援助? – DaniDev