Поля привязки к базе данных GridView — параметры SQL

#c# #asp.net #sql #gridview #databound

#c# #asp.net #sql #gridview #привязка к данным

Вопрос:

Когда во время выполнения поля привязки к базе данных привязываются к параметрам SQL? У меня есть несколько полей привязки к базе данных и связанные с ними параметры UpdateParameters. Иногда моя команда UpdateCommand выполняется успешно, а в других случаях я получаю ошибки с нулевыми ссылками.

Вот мой код:

ИСТОЧНИК ДАННЫХ

 <asp:SqlDataSource ID="reconcileDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
    SelectCommand="GetReconcileItems" SelectCommandType="StoredProcedure"
    UpdateCommand=" UPDATE dbo.item SET Stat=@Status WHERE ItemID = @ID;
    INSERT INTO dbo.transactions(ItemID, TransactionTypeID, LocationID, DestinationID, UserNote)VALUES(@ID, '14', @LocationID, @TransferLocation, 'TEST');" >

    <UpdateParameters>
        <asp:Parameter Name="ID" />
        <asp:Parameter Name="Status" />
        <asp:Parameter Name="LocationID" />
        <asp:Parameter Name="TransferLocation" />
    </UpdateParameters>

</asp:SqlDataSource>
  

ASP.NET

     <asp:UpdatePanel ID="reconcileUpdatePanel" runat="server">
        <ContentTemplate>
            <asp:GridView ID="reconcileGrid" runat="server" AutoGenerateColumns="False" 
                DataKeyNames="ID" DataSourceID="reconcileDataSource" OnRowUpdating="reconcileGrid_Updating" >
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" ReadOnly="true" />
                    <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" ReadOnly="true"/>
                    <asp:BoundField DataField="last_known_location" HeaderText="Last Known Location" SortExpression="last_known_location" ReadOnly="true" />
                    <asp:TemplateField HeaderText="Status">
                        <ItemTemplate>
                            <asp:Label ID="lblStatus" runat="server" Text='<%# evalStatus(Eval("Stat")) %>'></asp:Label></ItemTemplate><EditItemTemplate>
                            <asp:DropDownList ID="ddlReconcileStatus" runat="server" OnSelectedIndexChanged="ddlReconcileStatus_SelectedIndexChanged" AutoPostBack="true" >
                                <asp:ListItem Value="3" Text="Allocated"></asp:ListItem><asp:ListItem Value="4" Text="Transferred"></asp:ListItem></asp:DropDownList></EditItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="Transfer Location">
                        <EditItemTemplate>
                            <asp:DropDownList ID="ddlTransferLocation" runat="server" 
                                DataSourceID="ddlTransferLocationDataSource" DataTextField="Name" 
                                DataValueField="ID" Enabled="false" ></asp:DropDownList>
                        <asp:SqlDataSource 
                                ID="ddlTransferLocationDataSource" runat="server" 
                                ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
                                SelectCommand="SELECT [ID], [Name] FROM [TransferLocation]">
                        </asp:SqlDataSource>
                        </EditItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>
  

C#

     protected void reconcileGrid_Updating(object sender, GridViewUpdateEventArgs e)
    {
      DropDownList ddlReconcileStatus = (DropDownList)reconcileGrid.Rows[reconcileGrid.EditIndex].Cells[0].FindControl("ddlReconcileStatus");
      DropDownList ddlTransferLocation = (DropDownList)reconcileGrid.Rows[reconcileGrid.EditIndex].Cells[0].FindControl("ddlTransferLocation");

      reconcileDataSource.UpdateParameters["Status"].DefaultValue= ddlReconcileStatus.SelectedValue;
      reconcileDataSource.UpdateParameters["TransferLocation"].DefaultValue = ddlTransferLocation.SelectedValue.ToString();

    }
  

Комментарии:

1. Данные будут привязаны после вызова DataBind() метода. почему бы вам не предоставить часть вашего кода и более подробную информацию о вашей проблеме?

2. Я добавил несколько примеров кода к своему первоначальному сообщению. Я получаю ошибку NullReference, связанную с параметром ID, который является параметром привязки к базе данных.

3. Проблема устранена, если я укажу каждый нужный мне столбец в поле DataKeyNames в GridView. Я думал, это используется только для первичных ключей?

Ответ №1:

Я думаю, вам не обязательно включать Cell[0] . Также GridViewUpdateEventArgs имеет RowIndex свойство, которое вы можете использовать.

Это должно сработать

 DropDownList ddlReconcileStatus = (DropDownList)reconcileGrid.Rows[e.RowIndex].FindControl("ddlReconcileStatus");
DropDownList ddlTransferLocation = (DropDownList)reconcileGrid.Rows[e.RowIndex].FindControl("ddlTransferLocation");
  

Комментарии:

1. Это действительно работает. Хотя моя проблема заключается в NullReferenceException с параметрами привязки к базе данных.