【问题标题】:GridView not Returning RowsGridView 不返回行
【发布时间】: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


    【解决方案1】:

    在您的存储过程中,将您的两个可选参数初始化为 NULL。

    @CustomerName varchar(50),
    @Date date = NULL,
    @Heat varchar(50) = NULL
    

    存储过程的参数并不是真正的“可选”,除非它们已经被初始化为某种东西。

    【讨论】:

    • 我刚刚做了,但仍然没有记录。请记住,当我将用户重定向到另一个页面时,此 sp 有效。不过,我会将 Date 和 Heat 初始化为 NULL,这是有道理的。
    • 您对两个可选字段使用会话变量有什么特别的原因吗?您可以将这些参数更改为 asp:controlparameters:
    • 我也很好奇如果您按两次按钮是否会得到任何结果。可能是某种奇怪的回发问题,在页面发布(或重定向)之前,不会将文本框中的值保存到会话中。
    • 我真的不知道 ControlParameter 控件。我会在几分钟内调查一下。按两次按钮会产生相同的结果。
    • 明白了。如果不需要逐页保留这些值,我肯定会使用 ControlParameter。 “名称”属性应与 SP 参数名称相同。我突然想到,您可能还缺少 gridview 上的 databind() 方法。更新参数后试一试。 Gridview1.Databind();
    【解决方案2】:

    终于在这里找到了答案:

    empty gridview although the sqldatasource has values

    基本在 SqlDatasource 上设置 CancelSelectOnNullParameter="false"。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多