【发布时间】:2016-03-22 17:16:58
【问题描述】:
我有一个使用 3 个会话变量的简单 GridView;用户登录时捕获的 CoName 以及在文本框中捕获的 PurchaseOrderDate 和 HeatNumber(这两个都是可选的)作为 SQLServer 2012 数据库上存储过程的输入参数。我有一个 CustomerLanding.aspx 页面,上面有一个搜索按钮,单击该按钮时,会将用户重定向到当前具有 GridView 的 TestReportLanding.aspx 页面。在这种情况下,一切正常。
我想将 GridView 移动到 CustomerLanding.aspx,以便可以在具有搜索参数和搜索按钮的同一页面上显示搜索结果。最终我想使用 AJAX 进行更新,但现在我只是将 GridView 放在不同的 div 中。当我使用此设置时,查询仅在提供可选参数(PurchaseOrderDate 和 HeatNumber)时返回结果。我的存储过程只需要 CoName 进行搜索,所以我应该得到更多的行返回,可选参数留空。
对 .NET 有点陌生,我希望我在这里遗漏了一些简单的东西。
这是我在 CustomerLanding 中的 GridView 代码以及 SqlDataSource:
<div class="col-xs-12 col-lg-10">
<asp:Label ID="NoRecordsFound" runat="server" Visible ="false" Text="No records found."></asp:Label>
<asp:GridView ID="GridView1" runat="server" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" GridLines="Vertical" BackColor="White" ForeColor="Black" AllowSorting="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
<AlternatingRowStyle BackColor="#CCCCCC" />
<Columns>
<asp:BoundField DataField="doc" HeaderText="doc" SortExpression="doc" />
<asp:BoundField DataField="Date" HeaderText="Date" SortExpression="Date" />
<asp:BoundField DataField="Heat" HeaderText="Heat" SortExpression="Heat" />
<asp:BoundField DataField="Dir" HeaderText="Dir" SortExpression="Dir" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:iiConnectionString %>" SelectCommand="sp_test_reports" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:SessionParameter Name="CustomerName" SessionField="CoName" Type="String" />
<asp:SessionParameter DbType="Date" Name="Date" SessionField="PurchaseOrderDate" />
<asp:SessionParameter Name="Heat" SessionField="HeatNumber" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
</div>
这里值得一提的是我的存储过程(我确信这不是问题,因为当 DataGrid 位于单独的页面上时它可以工作:
CREATE PROCEDURE [dbo].[sp_test_reports]
-- Add the parameters for the stored procedure here
@CustomerName varchar(50),
@Date date,
@Heat varchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
IF @Heat IS NULL AND @Date IS NULL
SELECT DISTINCT TOP 1000 d.doc, d.Date, dl.Heat, d.Dir
FROM documents d
INNER JOIN Documents_Line_Items dl ON d.Doc = dl.Doc
WHERE d.type = 2 and d.Customer = @CustomerName;
ELSE IF @Heat IS NOT NULL AND @Date IS NULL
SELECT DISTINCT(d.doc), d.Date, dl.Heat, d.Dir
FROM documents d
INNER JOIN Documents_Line_Items dl ON d.Doc = dl.Doc
WHERE d.type = 2 AND d.Customer = @CustomerName AND dl.Heat = @Heat;
ELSE IF @Heat IS NULL AND @Date IS NOT NULL
SELECT DISTINCT(d.doc), d.Date, dl.Heat, d.Dir
FROM documents d
INNER JOIN Documents_Line_Items dl ON d.Doc = dl.Doc
WHERE d.type = 2 AND d.Customer = @CustomerName AND d.Date = @Date;
ELSE IF @Heat IS NOT NULL AND @Date IS NOT NULL
SELECT DISTINCT(d.doc), d.Date, dl.Heat, d.Dir
FROM documents d
INNER JOIN Documents_Line_Items dl ON d.Doc = dl.Doc
WHERE d.type = 2 AND d.Customer = @CustomerName AND d.Date = @Date AND dl.Heat = @Heat;
END
这是我的搜索按钮背后的代码: 请注意,如果我在此处取消注释 Response.Redirect,则 GridView 会正常工作。
protected void TestReports_Click(object sender, EventArgs e)
{
Session["PurchaseOrderDate"] = DatePurchaseOrder.Text;
Session["HeatNumber"] = HeatText.Text;
GridView1.Visible = true;
MessageBox.Show(Session["CoName"].ToString());
MessageBox.Show(Session["HeatNumber"].ToString());
if (GridView1.Rows.Count == 0)
{
NoRecordsFound.Visible = true;
}
else
{
NoRecordsFound.Visible = false;
}
//Response.Redirect("TestReportLanding.aspx", false);
}
提前感谢您的帮助。
【问题讨论】:
标签: c# asp.net sql-server gridview