2016-04-08 11 views
0

Ich habe versucht, dies für einen guten Teil des Tages mit der Forschung zu beheben, und ich konnte nicht eine Antwort finden, die mit meinem aktuellen Code funktioniert. Ich habe eine GridView eingerichtet, die von drei Dropdown-Listen und einem Textfeld gesteuert wird. Wenn diese Änderungen vorgenommen werden, wird der WHERE-Teil meiner SQL-Anweisung erstellt, sodass ich nur die Daten abrufen kann, die ich möchte.ASP.NET C# GridView Verlieren von Suchoptionen beim Paging oder Sortieren

Meine Sorge ist, dass die meisten von diesen Tausende von Datenpunkten ziehen, so würde ich gerne die Option verwenden, um durch die GridView und/oder sortieren Sie es durch die Spalten.

Die Seite und Sortierung funktionierte zunächst, aber jetzt bekomme ich nur jedes Mal eine leere GridView, wenn ich versuche, jetzt zu sortieren.

Die ASPX-Datei:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAsset.Default" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <hr /> 
    <div> 
     <a href="Upload.aspx">Manual Assets</a> 
    </div> 
     <hr /> 
    <div> 
     <asp:DropDownList ID="ddlSource" runat="server" AutoPostBack="true" Width="100px" OnSelectedIndexChanged="ddlSource_SelectedIndexChanged"> 
      /* Removed to Protect the Innocent */ 
     </asp:DropDownList> 
     <asp:DropDownList ID="ddlAssetType" runat="server" AutoPostBack="true" Width="150px" OnSelectedIndexChanged="ddl_SelectedIndexChanged"> 
      <asp:ListItem Selected="True" Text="ALL" Value="0" /> 
     </asp:DropDownList> 
     <asp:TextBox ID="tbAsset" runat="server" AutoPostBack="false" Width="500px" OnTextChanged="ddl_SelectedIndexChanged" /> 
     <asp:DropDownList ID="ddlSSP" runat="server" AutoPostBack="true" Width="250px" OnSelectedIndexChanged="ddl_SelectedIndexChanged"> 
      <asp:ListItem Selected="True" Text="ALL" Value="0" /> 
     </asp:DropDownList> 
    </div> 
     <hr /> 
    <div> 
     <asp:GridView ID="gvAllAssets" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="Vertical" PageSize="25" OnPageIndexChanging="gvAllAssets_PageIndexChanging" OnSorting="gvAllAssets_Sorting"> 
      <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
      <EditRowStyle BackColor="#999999" /> 
      <EmptyDataTemplate>No Data Found</EmptyDataTemplate> 
      <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
      <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
      <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
      <SortedAscendingCellStyle BackColor="#E9E7E2" /> 
      <SortedAscendingHeaderStyle BackColor="#506C8C" /> 
      <SortedDescendingCellStyle BackColor="#FFFDF8" /> 
      <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> 
      <Columns> 
       <asp:BoundField DataField="SOURCENAME" HeaderText="Source" InsertVisible="false" ReadOnly="true" SortExpression="SOURCENAME"> 
        <ItemStyle Width="100px" Wrap="false" /> 
       </asp:BoundField> 
       <asp:BoundField DataField="ASSETNAME" HeaderText="Asset Type" InsertVisible="false" ReadOnly="true" SortExpression="ASSETNAME"> 
        <ItemStyle Width="150px" Wrap="false" /> 
       </asp:BoundField> 
       <asp:BoundField DataField="ASSET" HeaderText="Asset" InsertVisible="false" ReadOnly="true" SortExpression="ASSET"> 
        <ItemStyle Width="500px" Wrap="false" /> 
       </asp:BoundField> 
       <asp:BoundField DataField="SSP" HeaderText="System Security Plan" InsertVisible="false" ReadOnly="true" SortExpression="SSP"> 
        <ItemStyle Width="250px" Wrap="false" /> 
       </asp:BoundField> 
       <asp:BoundField DataField="LAST_UPDATED" HeaderText="Last Updated" InsertVisible="false" ReadOnly="true" SortExpression="LAST_UPDATED"> 
        <ItemStyle Width="250px" Wrap="false" /> 
       </asp:BoundField> 
      </Columns> 
     </asp:GridView> 

     <asp:SqlDataSource ID="dsAllAssets" runat="server" ConnectionString="<%$ ConnectionStrings:TestAssetConnectionString %>" /> 
    </div> 
     <hr /> 
    <div> 
     <asp:Label ID="lblSQLStatement" runat="server" /> 
    </div> 
     <hr /> 
    </form> 
</body> 
</html> 

den Code hinter Datei: jetzt

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace TestAsset 
{ 
public partial class Default : System.Web.UI.Page 
{ 
    private string strWhere = String.Empty; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      ddlSource_SelectedIndexChanged(this, EventArgs.Empty); 
     } 
    } 

    protected void ddlSource_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     strWhere = String.Empty; 

     ddl_SelectedIndexChanged(sender, e); 

     Update_DropdownLists(ddlAssetType, "ASSETID", "ASSETNAME"); 
     Update_DropdownLists(ddlSSP, "DENSE_RANK() OVER (ORDER BY SSP) AS Row", "SSP"); 
    } 

    protected void ddl_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     strWhere = String.Empty; 

     if (ddlSource.SelectedValue != "0") 
     { 
      if (strWhere == String.Empty) 
      { 
       strWhere = "WHERE SDBs.SOURCE = " + ddlSource.SelectedValue; 
      } 
      else 
      { 
       strWhere = strWhere + " AND SDBs.SOURCE = " + ddlSource.SelectedValue; 
      } 
     } 

     if (ddlAssetType.SelectedValue != "0") 
     { 
      if (strWhere == String.Empty) 
      { 
       strWhere = "WHERE Assets.ASSET_TYPE = " + ddlAssetType.SelectedValue; 
      } 
      else 
      { 
       strWhere = strWhere + " AND Assets.ASSET_TYPE = " + ddlAssetType.SelectedValue; 
      } 
     } 

     if (tbAsset.Text != "") 
     { 
      if (strWhere == String.Empty) 
      { 
       strWhere = "WHERE Assets.ASSET LIKE '%" + tbAsset.Text + "%'"; 
      } 
      else 
      { 
       strWhere = strWhere + " AND Assets.ASSET LIKE '%" + tbAsset.Text + "%'"; 
      } 
     } 

     if (ddlSSP.SelectedValue != "0") 
     { 
      if (strWhere == String.Empty) 
      { 
       strWhere = "WHERE Assets.SSP = '" + ddlSSP.SelectedItem + "'"; 
      } 
      else 
      { 
       strWhere = strWhere + " AND Assets.SSP = '" + ddlSSP.SelectedItem + "'"; 
      } 
     } 

     Update_GridView(); 
    } 

    protected void Update_GridView() 
    { 
     string selectStatement = 
      "SELECT " + 
       "SDBNames.SOURCENAME AS 'SOURCENAME', " + 
       "AssetNames.ASSETNAME AS 'ASSETNAME', " + 
       "Assets.ASSET AS 'ASSET', " + 
       "Assets.SSP AS 'SSP', " + 
       "SDBs.LAST_UPDATED AS 'LAST_UPDATED' " + 
      "FROM " + 
       "Assets " + 
      "INNER JOIN AssetNames " + 
       "ON Assets.ASSET_TYPE = AssetNames.ASSETID " + 
      "INNER JOIN SDBs " + 
       "ON Assets.SDBID = SDBs.ID " + 
      "INNER JOIN SDBNames " + 
       "ON SDBs.SOURCE = SDBNames.SOURCEID " + 
      strWhere + " ;"; 

     lblSQLStatement.Text = selectStatement; 

     dsAllAssets.SelectCommand = selectStatement; 
     DataView dv = (DataView)dsAllAssets.Select(DataSourceSelectArguments.Empty); 
     DataTable dt = dv.ToTable(); 

     dsAllAssets.DataBind(); 

     if (dt.Rows.Count > 0) 
     { 
      gvAllAssets.DataSourceID = "dsAllAssets"; 
      gvAllAssets.DataBind(); 
     } 
     else 
     { 
      gvAllAssets.DataSourceID = ""; 
      ShowNoResultFound(dt, gvAllAssets); 
      gvAllAssets.Rows[0].Cells[0].Width = 1250; 
     } 
    } 

    protected void Update_DropdownLists(DropDownList ddl, string valueField, string textField) 
    { 
     string modifiedValue; 

     if (valueField.Contains(" AS ")) 
     { 
      modifiedValue = valueField.Split(' ').Last(); 
     } 
     else 
     { 
      modifiedValue = valueField; 
     } 

     string strSSPCommand = "" + 
      "SELECT DISTINCT " + 
       valueField + ", " + 
       textField + " " + 
      "FROM " + 
       "Assets " + 
      "INNER JOIN AssetNames " + 
       "ON Assets.ASSET_TYPE = AssetNames.ASSETID " + 
      "INNER JOIN SDBs " + 
       "ON Assets.SDBID = SDBs.ID " + 
      "INNER JOIN SDBNames " + 
       "ON SDBs.SOURCE = SDBNames.SOURCEID " + 
      strWhere + " " + 
      "ORDER BY " + modifiedValue + " ;"; 

     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestAssetConnectionString"].ConnectionString); 
     SqlCommand cmd = new SqlCommand(strSSPCommand, con); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 

     ddl.DataValueField = modifiedValue; 
     ddl.DataTextField = textField; 
     ddl.DataSource = dt; 
     ddl.DataBind(); 
     ddl.Items.Insert(0, new ListItem("ALL", "0")); 
    } 

    protected void ShowNoResultFound(DataTable source, GridView target) 
    { 
     source.Rows.Add(source.NewRow()); 

     target.DataSource = source; 
     target.DataBind(); 

     int columnsCount = target.Columns.Count; 
     target.Rows[0].Cells.Clear(); 
     target.Rows[0].Cells.Add(new TableCell()); 

     target.Rows[0].Cells[0].ColumnSpan = columnsCount; 
     target.Rows[0].Cells[0].ForeColor = System.Drawing.Color.Red; 
     target.Rows[0].Cells[0].Font.Bold = true; 
     target.Rows[0].Cells[0].HorizontalAlign = HorizontalAlign.Center; 
     target.Rows[0].Cells[0].Text = "NO RESULTS FOUND!"; 
    } 

    protected void gvAllAssets_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     gvAllAssets.PageIndex = e.NewPageIndex; 
     gvAllAssets.DataBind(); 
    } 

    protected void gvAllAssets_Sorting(object sender, GridViewSortEventArgs e) 
    { 
     gvAllAssets.Sort(e.SortExpression, e.SortDirection); 
     gvAllAssets.DataBind(); 
    } 


} 
} 


EDIT 04/11/2016


Ich gebe es zu, ich Ich bin nicht der Beste bei ASP.net, aber mir wurde gesagt, dass ich nee ded, nur etwas zu machen, um zu zeigen, was wir in der Datenbank haben. War etwas übereifrig mit den Suchoptionen und kämpfte es für eine Weile, um es zur Arbeit zu bringen. Dann ging ich einfach weiter und restaurierte eine Sicherungskopie meines Codes und es funktionierte mit Suchen, Paging und Sortieren wieder ... als ich die DataSourceID wieder im HTML-Code hatte, die ich anfangs herausnahm, damit es etwas Interessantes zeigen würde wenn keine Daten angezeigt wurden. Also lass es jetzt erst einmal dort stehen und mach weiter!

Antwort

0

Als erstes versuchen Sie dies, verwenden Sie die Eigenschaft .DataSource von GridView und nicht .DataSourceID. Die Bereitstellung der DataSourceID bewirkt, dass bestimmte automatische Bindungsvorgänge während des Seitenlebenszyklus auftreten. Da Sie versuchen, die Datenbindung über bestimmte Eingabeereignisse selbst zu verwalten, möchten Sie nicht, dass zusätzliche Datenindizes aufgerufen werden.

Auch - Sie machen die Dinge wirklich viel schwieriger für Sie. Gespeicherte Prozeduren funktionieren viel besser, wenn Sie versuchen, einen Datensatz mit Benutzereingaben zu reduzieren. Weit besser die volle Leistungsfähigkeit des SqlDataSource zu nutzen WebControls als Eingangsparameter zu akzeptieren, zum Beispiel:

<asp:SqlDataSource ID="dsAllAssets" runat="server" ConnectionString="<%$ ConnectionStrings:TestAssetConnectionString %>" 
     SelectCommand="sp_SomeProcedureYouCreate" 
     SelectCommandType="StoredProcedure"> 
     <SelectParameters> 
     <asp:ControlParameter Name="sp_var_1" ControlID="ddlAssetType" PropertyName="SelectedValue" Type="Int32" /> 
     <asp:ControlParameter Name="sp_var_2" ControlID="tbAsset" PropertyName="Text" Type="String" /> 
     <asp:ControlParameter Name="sp_var_3" ControlID="ddlSSP" PropertyName="SelectedValue" Type="Int32" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 

Auf diese Weise können Sie dies einstellen:

<asp:GridView ID="gvAllAssets" runat="server" DataSourceID="dsAllAssets" ... /> 

Stellen Sie den Eingang DropDownList und TextBox Kontrollen Postback beim Wechsel zum Rebind. Oder richten Sie eine Schaltfläche ein, um nur einmal zu postback, nachdem der Benutzer seine Eingabevorwahlen macht

+0

Vielen Dank für die Vorschläge! Ich bin dabei, meinen Code zu ändern, um zu sehen, ob er mit einem StoredProcedure effizienter läuft, obwohl ich einige Nachforschungen darüber anstellen muss, wie man mit der Tatsache umgehen kann, dass es 24 Kombinationen mit der WHERE-Klausel gibt. Dies liegt daran, dass es bei drei Dropdown-Listen und einem Textfeld möglich ist, dass der Benutzer keine von ihnen auswählen kann, eine von ihnen, zwei von ihnen, drei von ihnen oder alle vier. –

+0

Nun, das ist eine Design-Überlegung. Sie können jedoch auch eine beliebige Anzahl von 'SqlDatasource's einrichten, um die gleichen Eingabesteuerelemente zu verwenden, jedoch unterschiedliche gespeicherte Prozeduren für jedes Element bereitzustellen und dann die GridView' DataSourceID' auf die entsprechende Quelle zu setzen. Beachten Sie auch, dass die Sichtbarkeitseigenschaft von datengebundenen Steuerelementen in Datenbindungsoperationen einbezogen wird. Unsichtbare Steuerelemente werden nicht datengebunden, selbst wenn die 'DataSourceID' festgelegt ist – fnostro

Verwandte Themen