2016-04-08 2 views
0

Я пытался исправить это в течение хорошей части дня с помощью исследований, и я не смог найти ответ, который работает с моим текущим кодом. Я настроил GridView, который управляется тремя выпадающими списками и текстовым полем. Поскольку это изменение, это строит часть WHERE моего SQL-заявления, поэтому я могу извлекать только те данные, которые я хочу.ASP.NET C# GridView, теряющий параметры поиска при пейджинге или сортировке

Меня беспокоит то, что большинство из них вытаскивают тысячи точек данных, поэтому я хотел бы использовать этот параметр для просмотра через GridView и/или сортировки по столбцам.

Страница и сортировка работали изначально, но теперь я получаю пустой GridView каждый раз, когда я пытаюсь отправить страницу или сортировать сейчас.

Файл ASPX:

<%@ 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> 

Кодекс За Файл:

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


Я признаю это сейчас, я я не лучший на ASP.net, но мне сказали, что я чтобы просто сделать «что-то», чтобы показать, что у нас есть в базе данных. Немного переусердствовал с вариантами поиска и некоторое время боролся с ним, чтобы заставить его работать. Затем я просто пошел вперед и восстановил резервную копию моего кода, и он снова работал с поиском, поиском и сортировкой ... так как у меня снова был установлен DataSourceID в HTML-коде, который я извлек изначально, чтобы он показывал что-то интересное если не было данных. Так что просто собираюсь оставить его там и двигаться дальше!

ответ

0

Первое, что нужно попробовать, это использовать свойство .DataSource GridView, а не .DataSourceID. Предоставление DataSourceID приводит к возникновению определенных операций автоматического связывания во время жизненного цикла страницы. Поскольку вы пытаетесь управлять привязкой данных через определенные входные события, вы не хотите, чтобы вызывались дополнительные данные.

Кроме того - вы действительно делаете вещи намного сложнее для себя. Хранимые процедуры работают намного лучше, когда вы пытаетесь уменьшить набор данных с помощью пользовательских входов. Гораздо лучше использовать все возможности в SqlDataSource принимать WebControls в качестве входных параметров, например:

<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> 

Таким образом, вы можете установить это:

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

Установите вход DropDownList и TextBox управления обратной передачи о переходе на повторное воспроизведение. Или настройте кнопку для обратной передачи только один раз после того, как пользователь сделает свой выбор для ввода

+0

Благодарим вас за предложения! Я изучаю модификацию своего кода, чтобы убедиться, что он работает более эффективно с помощью StoredProcedure, хотя мне нужно провести некоторое исследование того, как обрабатывать тот факт, что возможно 24 комбинации с предложением WHERE. Это связано с тем, что с тремя выпадающими списками и одним текстовым полем возможно, что пользователь может выбрать ни один из них, один из них, два из них, три из них или все четыре. –

+0

Ну, это соображения дизайна. Но вы также можете настроить любое количество 'SqlDatasource' для использования одних и тех же элементов управления вводом, но предоставить разные хранимые процедуры для каждого, а затем установить GridView' DataSourceID' в соответствующий источник. Также имейте в виду, что свойство «Видимость» в элементах управления привязкой данных работает в операции привязки данных. Невидимые элементы управления не получат привязку данных, даже если задан «DataSourceID» – fnostro

Смежные вопросы