2011-05-29 47 views
2

執行期間DataBound GridView字段綁定到SQL參數嗎?我有幾個DataBound字段和與它們相關的UpdateParameters。有時我的UpdateCommand會成功執行,其他時候我會得到空引用錯誤。GridView DataBound字段 - SQL參數

這裏是我的代碼:

數據來源

<asp:SqlDataSource ID="reconcileDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
    SelectCommand="GetReconcileItems" SelectCommandType="StoredProcedure" 
    UpdateCommand=" UPDATE dbo.item SET [email protected] 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(); 

    } 
+3

的數據將所述'的DataBind()'方法被調用後的約束。你爲什麼不提供一些你的代碼和關於你的問題的更多細節? – 2011-05-29 18:07:34

+0

我在原始文章中添加了一些代碼示例。我得到一個與ID參數有關的NullReference錯誤,這是一個DataBound參數。 – Will 2011-05-29 23:20:30

+0

如果我在GridView的DataKeyNames字段中指定需要的每個列,則問題已解決。我以爲這隻用於主鍵? – Will 2011-05-30 12:56:37

回答

0

我覺得你不必包括Cell[0] 。另外GridViewUpdateEventArgs有一個RowIndex屬性,您可以使用。

這應該工作

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

這確實有效。儘管我的問題是帶有DataBound參數的NullReferenceException。 – Will 2011-05-29 23:41:44