Gridview не будет отображаться, если значение NULL передается в качестве параметра в sqldatasource, используемый Gridview - PullRequest
0 голосов
/ 29 октября 2019

Я использую два текстовых поля для поиска по номеру телефона или фамилии. Я хочу иметь возможность поиска, используя либо текстовое поле, либо оба. Я проверил мою хранимую процедуру, и она отлично работает. Когда я запускаю приложение, при нажатии кнопки «Поиск» ничего не происходит. Я не получаю ошибку ни в Visual Studio, ни в веб-приложении. Просто нет ответа вообще. Существует сетка, которая должна быть заполнена результатами хранимой процедуры. Вот мой код. У меня это работало раньше, и я в полном недоумении, почему оно внезапно перестало работать ..

 <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

1 Ответ

0 голосов
/ 05 ноября 2019

Наконец-то все заработало, но я не совсем уверен, какие изменения сделали это возможным. Я добавил следующий код среди некоторых других изменений, чтобы это могло быть разрешением:

ConvertEmptyStringToNull="false"

DefaultValue="" ConvertEmptyStringToNull="false"

Вот мой последний, функциональный код на случай, если он может помочь кому-то еще:

.aspx pageКод:

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