Я пытался исправить это в течение хорошей части дня с помощью исследований, и я не смог найти ответ, который работает с моим текущим кодом. Я настроил 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-коде, который я извлек изначально, чтобы он показывал что-то интересное если не было данных. Так что просто собираюсь оставить его там и двигаться дальше!
Благодарим вас за предложения! Я изучаю модификацию своего кода, чтобы убедиться, что он работает более эффективно с помощью StoredProcedure, хотя мне нужно провести некоторое исследование того, как обрабатывать тот факт, что возможно 24 комбинации с предложением WHERE. Это связано с тем, что с тремя выпадающими списками и одним текстовым полем возможно, что пользователь может выбрать ни один из них, один из них, два из них, три из них или все четыре. –
Ну, это соображения дизайна. Но вы также можете настроить любое количество 'SqlDatasource' для использования одних и тех же элементов управления вводом, но предоставить разные хранимые процедуры для каждого, а затем установить GridView' DataSourceID' в соответствующий источник. Также имейте в виду, что свойство «Видимость» в элементах управления привязкой данных работает в операции привязки данных. Невидимые элементы управления не получат привязку данных, даже если задан «DataSourceID» – fnostro