0

Formview の InsertItemTemplate 内で更新パネルを使用しようとしています。ドロップダウンリストから「その他」を選択すると、別のドロップダウンリストが非表示になります。更新パネルを削除すると、これは正常に機能し、レコードは問題なく作成されます。ただし、DropDownList が UpdatePanel 内にある場合、挿入時に次のエラーが発生します。

Oracle.DataAccess.Client.OracleException: ORA-01008: すべての変数がバインドされていません。

ASP.NET とコード ビハインドのすべてを含めたわけではありません。他に何か見たい場合はお問い合わせください。さらにバインドされたフィールドと多くのデータ検証があります。ASP.NET の一部を次に示します。

<asp:Formview 

        ID="fvJobs"
        DataSourceID="fvSqlDataSource"
        DataKeyNames="JOB_ID"
        DefaultMode="Edit"
        OnItemInserting="fvJobs_FileUpl"
        OnItemInserted="fvJobs_ItemInserted"
        OnItemupdating="fvJobs_FileUp2"
        OnItemUpdated="fvJobs_ItemUpdated"
         runat="server">


 <asp:DropDownList ID="InsertLocList" 
                                         SelectedValue='<%# Bind("JOB_LOCATION") %>' 
                                         Autopostback="true"
                                         CssClass="ddl"
                                         OnSelectedIndexChanged="InsertLocList_IndexChanged"
                                         RunAt="Server" >
                                         <asp:ListItem Text="--Select One--" Value="-1" />
                                         <asp:ListItem Text="California" Value="CA" />
                                         <asp:ListItem Text="New York" Value="NY" />
                                         <asp:ListItem Text="Pennsylvania" Value="PA" />
                                         <asp:ListItem Text="Texas" Value="TX" />
                                         <asp:ListItem Text="Other" Value="O" />
                                         </asp:DropDownList></label>


                    <asp:UpdatePanel ID="UpdatePanel1" 
                 UpdateMode="Conditional"
                 runat="server">
                 <Triggers>
                   <asp:AsyncPostBackTrigger ControlID="InsertLocList" />
                 </Triggers>
                     <contentTemplate>

                     <span><asp:label id="InsertCatLbl" runat="server"><b>Subsidiary:</b></asp:label></span>

                        <asp:DropDownList ID="InsertCatList" 

                                         SelectedValue='<%# Bind("JOB_CATEGORY") %>' 
                                         CssClass="ddl"
                                         RunAt="Server" >
                           <asp:ListItem Text="--Select One--" Value="-1" />

                                         <asp:ListItem Text="SRC" Value="SRC" />
                                         <asp:ListItem Text="FRN" Value="FRN" />
                                         <asp:ListItem Text="SUPDIST" Value="SUPDIST" />
                                         <asp:ListItem Text="Stream" Value="STREAM" />

                                         </asp:DropDownList>
                                         </contentTemplate>
                                         </asp:UpdatePanel>

コードビハインドの一部を次に示します。

Protected Sub InsertLocList_IndexChanged(sender As Object, e As EventArgs)



Dim ddlLoc As DropDownList = _
      CType(fvJobs.FindControl("InsertLocList"), DropDownList)

Dim ddlCat As DropDownList = _
      CType(fvJobs.FindControl("InsertCatList"), DropDownList)

      Dim catLbl As Label = _
      CType(fvJobs.FindControl("InsertCatlbl"), Label)


      If ddlLoc.SelectedValue = "O"

      ddlCat.selectedvalue="SRC"
        ddlCat.visible=false
        catLbl.visible=false



    else

    ddlCat.visible = true
    catLbl.visible = true

    end if



end sub

奇妙なことに、UpdatePanel を削除すると、これは完全に機能します。更新パネル内のバインドが機能していないように見える理由がわかりません。私は考えられる限りの方法でグーグル検索を表現しましたが、同様の問題を抱えている人を見つけることができないようです。

UPDATE フォームビューのSqlDataSourceは次のとおりです。

<asp:SqlDataSource ID="fvSqlDataSource" 
          ConnectionString="<%$ ConnectionStrings:Oracle %>" 
          ProviderName="<%$ ConnectionStrings:Oracle.ProviderName %>" 
          SelectCommand="SELECT JOB_DESC, JOB_ID, JOB_CATEGORY, JOB_LOCATION, JOB_DATE_BEGIN, JOB_DATE_CLOSED, JOB_FILENAME, JOB_SHOW_INDIC from JOB_POSTING WHERE JOB_ID = :JOB_ID"
          RunAt="server"
          UpdateCommand="UPDATE JOB_POSTING SET JOB_DESC=:JOB_DESC, JOB_LOCATION=:JOB_LOCATION, JOB_CATEGORY=:JOB_CATEGORY, JOB_DATE_BEGIN=TO_DATE(:JOB_DATE_BEGIN, 'MM/DD/YYYY'), JOB_DATE_CLOSED=TO_DATE(:JOB_DATE_CLOSED, 'MM/DD/YYYY'), JOB_FILENAME=:JOB_FILENAME,JOB_SHOW_INDIC=:JOB_SHOW_INDIC WHERE JOB_ID=:JOB_ID"

          InsertCommand="INSERT INTO JOB_POSTING(JOB_DESC, JOB_ID, JOB_LOCATION, JOB_CATEGORY, JOB_DATE_BEGIN, JOB_DATE_CLOSED, JOB_FILENAME, JOB_SHOW_INDIC) 
          VALUES 
         (:JOB_DESC, :JOB_ID, :JOB_LOCATION, :JOB_CATEGORY, TO_DATE(:JOB_DATE_BEGIN, 'MM/DD/YYYY'), TO_DATE(:JOB_DATE_CLOSED, 'MM/DD/YYYY'), :JOB_FILENAME, :JOB_SHOW_INDIC)"
            >

            <SelectParameters>
            <asp:Parameter Name="JOB_ID" Type="String" DefaultValue="0" />
            </SelectParameters>

         <UpdateParameters>
         <asp:parameter Name="JOB_ID" Type="String" DefaultValue="0"/>
         </UpdateParameters>


</asp:SqlDataSource>
4

1 に答える 1

0

私はついにこれを機能させました。さらに掘り下げた後、これは Formview の EditItemTemplate または InsertItemTemplate 内に UpdatePanel をネストするときの既知のバグであることがわかりました。これを回避するには 2 つの方法があります。私は ControlParameter を使用して、SqlDataSource で DropDownList をバインドしました。

  <InsertParameters>
     <asp:Parameter Name="JOB_DESC" />
     <asp:Parameter Name="JOB_ID" />     
     <asp:Parameter Name="JOB_FILENAME"  />
     <asp:Parameter Name="JOB_SHOW_INDIC" />
     <asp:Parameter Name="JOB_LOCATION" />
     <asp:ControlParameter ControlID="fvJobs$InsertCatList" Name="JOB_CATEGORY" />
      <asp:Parameter Name="JOB_DATE_BEGIN" />
     <asp:Parameter Name="JOB_DATE_CLOSED" />
     </InsertParameters>

UpdatePanel 内のすべてのコントロールに ControlParameters を使用します。

別の回避策は、コード ビハインドでの挿入/更新時にデータをバインドすることです。

Protected Sub RoleSQLDataSource_Updating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles
RoleSQLDataSource.Updating

    e.Command.Parameters("@street_name").Value = street_nameTextBox.Text
    e.Command.Parameters("@street_type").Value = street_typeTextBox.Text
    e.Command.Parameters("@street_dir").Value = street_dirTextBox.Text
    e.Command.Parameters("@street_number").Value = street_numberTextBox.Text
    e.Command.Parameters("@street_apt").Value = street_aptTextBox.Text
    e.Command.Parameters("@city").Value = cityTextBox.Text
    e.Command.Parameters("@state").Value = stateTextBox.Text
    e.Command.Parameters("@zip").Value = zipTextBox.Text
    e.Command.Parameters("@district_id").Value = DistrictDropDownList.SelectedValue
End Sub.

私が使用したリソースへのリンクは次のとおりです。

http://forums.asp.net/t/1055525.aspx

http://connect.microsoft.com/VisualStudio/feedback/details/292398/formview-and-updatepanel-binding-behavior

于 2013-09-30T21:07:43.310 に答える