【问题标题】:Gridview will not display if null value is passed as parameter to the sqldatasource used by the Gridview如果将 null 值作为参数传递给 Gridview 使用的 sqldatasource,则不会显示 Gridview
【发布时间】:2019-10-29 15:02:30
【问题描述】:

我正在使用两个文本框按电话号码或姓氏进行搜索。我希望能够使用文本框或两者进行搜索。我已经测试了我的存储过程,它工作正常。当我运行我的应用程序时,单击“搜索”按钮没有任何反应。在 Visual Studio 或 Web 应用程序中,我没有收到错误消息。就是完全没有反应。有一个 gridview 应该填充存储过程的结果。这是我的代码。我以前有它工作过,但我完全不知道为什么它突然停止工作了..

 <div class="col-xs-6 col-xs-offset-2" style="left: 0px; top: 0px; width: 80%; height: 1717px;">
    <div class="panel panel-primary">
            <div class="panel-heading">
                <h3>Customer Search Form</h3>
            </div>
            </div>
            <div class="panel-body">
                <div class="form-group">
                    <label for="inputLastname" class="control-label col-xs-2">
                        LastName
                    </label>
                    <div class="col-xs-10">
                        &nbsp;<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>
                    </div>
                </div>

                <div class="form-group">
                    <label for="inputPhoneNumber" class="control-label col-xs-2">
                        PhoneNumber
                    </label>
                    <div class="col-xs-10">
                        &nbsp;<asp:TextBox ID="txtPhoneNumber" runat="server"></asp:TextBox>
                    </div>
                </div>


                <div class="form-group">
                    <div class="col-xs-10 col-xs-offset-2" style="left: -1px; top: 18px; width: 29%">
                        <asp:Button ID="btnSearch" runat="server" Text="Search"
                            CssClass="btn btn-primary" OnClick="btnSearch_Click" />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        <asp:Button ID="btnClear" runat="server" Text="Clear"
                            CssClass="btn btn-primary" OnClick="btnClear_Click" />
                    </div>
                    <br />
                    <br />
                </div>
            </div>           
    <br />
    <br />
        <div class="panel panel-primary">
            <div class="panel-heading">
                <h3>Search Results</h3>
            </div>
            <div class="panel-body" align="center">
                <div class="col-xs-6" style="left: 0px; top: 0px; width: 93%; height: 98px">
                    <br />
                    <asp:GridView ID="gvSearchResults" runat="server" AutoGenerateColumns="False" DataKeyNames="customer_id" Height="66px">
                        <Columns>
                            <asp:CommandField ShowSelectButton="True" />
                            <asp:BoundField DataField="customer_id" HeaderText="customer_id" InsertVisible="False" ReadOnly="True" SortExpression="customer_id" />
                            <asp:BoundField DataField="Company" HeaderText="Company" SortExpression="Company" />
                            <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
                            <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
                            <asp:BoundField DataField="ShippingAddress" HeaderText="ShippingAddress" SortExpression="ShippingAddress" />
                            <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                            <asp:BoundField DataField="State" HeaderText="State" SortExpression="State" />
                            <asp:BoundField DataField="ZipCode" HeaderText="ZipCode" SortExpression="ZipCode" />
                            <asp:BoundField DataField="EmailAddress" HeaderText="EmailAddress" SortExpression="EmailAddress" />
                            <asp:BoundField DataField="PhoneNumber" HeaderText="PhoneNumber" SortExpression="PhoneNumber" />
                        </Columns>
                    </asp:GridView>
                </div>
            </div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:HMTechConnectionString %>" SelectCommand="spSearchCustomers" SelectCommandType="StoredProcedure">
                <SelectParameters> 

                    <asp:ControlParameter ControlID="txtLastName" Name="LastName" PropertyName="Text" Type="String" />
                    <asp:ControlParameter ControlID="txtPhoneNumber" Name="PhoneNumber" PropertyName="Text" Type="String" />

                </SelectParameters>
            </asp:SqlDataSource>
        </div>

这是我调用 Databind 的代码。网格正在使用 SqlDataSource。

protected void btnSearch_Click(object sender, EventArgs e)
        {
            gvSearchResults.DataSource = SqlDataSource1;
            gvSearchResults.DataBind();            
        }

我也试过删除

<asp:ControlParameter ControlID="txtLastName" Name="LastName" PropertyName="Text" Type="String" />
<asp:ControlParameter ControlID="txtPhoneNumber" Name="PhoneNumber" PropertyName="Text" Type="String" />

并像这样在后面的代码中设置参数:

SqlDataSource1.SelectParameters["txtPhoneNumber"].DefaultValue = "";
SqlDataSource1.SelectParameters["txtLastName"].DefaultValue = "";

这导致了这个错误:

object reference not set to an instance of an object

【问题讨论】:

    标签: gridview sqldatasource


    【解决方案1】:

    终于让它工作了,但不完全确定是什么变化让它发生的。我在其他一些更改中添加了以下代码,因此这可能是解决方案:

    ConvertEmptyStringToNull="false"
    
    DefaultValue="" ConvertEmptyStringToNull="false"
    

    这是我最终的功能代码,以防它可以帮助其他人:

    .aspx页面代码:

    <div class="panel panel-primary">
                    <div class="panel-heading">
                        <h3>Search Results</h3>
                    </div>
                    <div class="panel-body" align="center">
                        <div class="col-xs-6" style="left: 0px; top: 0px; width: 93%; height: 98px">
                            <br />
                            <asp:GridView ID="gvSearchResults" runat="server" AutoGenerateColumns="False" DataKeyNames="customer_id" Height="66px" Width="1045px" OnSelectedIndexChanged="gvSearchResults_SelectedIndexChanged1">
                                <Columns>
                                    <asp:CommandField ShowSelectButton="True" />
                                    <asp:BoundField DataField="customer_id" HeaderText="Cust ID" InsertVisible="False" ReadOnly="True" SortExpression="customer_id" />
                                    <asp:BoundField DataField="Company" HeaderText="Comp" SortExpression="Company" />
                                    <asp:BoundField DataField="FirstName" HeaderText="F. Name" SortExpression="FirstName" />
                                    <asp:BoundField DataField="LastName" HeaderText="L. Name" SortExpression="LastName" />
                                    <asp:BoundField DataField="ShippingAddress" HeaderText="Address" SortExpression="ShippingAddress" />
                                    <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                                    <asp:BoundField DataField="State" HeaderText="State" SortExpression="State" />
                                    <asp:BoundField DataField="ZipCode" HeaderText="ZipCode" SortExpression="ZipCode" />
                                    <asp:BoundField DataField="EmailAddress" HeaderText="Email" SortExpression="EmailAddress" />
                                    <asp:BoundField DataField="PhoneNumber" HeaderText="Phone" SortExpression="PhoneNumber" />
                                </Columns>
                            </asp:GridView>
                        </div>
                    </div>
                    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:HMTechConnectionString %>" SelectCommand="spSearchCustomers" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="false">
                        <SelectParameters> 
    
                            <asp:ControlParameter ControlID="txtLastName" Name="LastName" PropertyName="Text" Type="String" DefaultValue="" ConvertEmptyStringToNull="false" />
                            <asp:ControlParameter ControlID="txtPhoneNumber" Name="PhoneNumber" PropertyName="Text" Type="String" DefaultValue="" ConvertEmptyStringToNull="false" />
    
                        </SelectParameters>
                    </asp:SqlDataSource>
                </div>
    

    后面的代码:

    protected void btnSearch_Click(object sender, EventArgs e)
            {
                gvSearchResults.DataSource = SqlDataSource1;
                gvSearchResults.DataBind();            
            }
    

    这是我的存储过程代码:

    ALTER PROCEDURE [dbo].[spSearchCustomers]
    
    @LastName nvarchar(50),
    @PhoneNumber nchar(10)
    
    AS
    BEGIN
    SELECT * 
    FROM Customers 
    WHERE (LastName = @LastName OR @LastName = '' ) AND
          (PhoneNumber = @PhoneNumber OR @PhoneNumber = '' )
          END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多