2011-07-19 22 views
5

私のフォームに2つのDropDownListコントロールがあります。そのうちの2番目のものは、その最初のSelectedValueをバインディングパラメーターの1つとして使用しています。テンプレートコントロールのカスケードDropDownListバインディングの実装

DropDownListのコントロールは両方とも、バインディング式を使用してFormViewのデータソースに結合されたSelectedValueプロパティを持つFormView.InsertItemTemplateのプロパティにあります。

初めてFormViewが挿入モードでレンダリングされると、すべて正常に動作します。問題は、最初のDropDownListからAutoPostBackの後にあり、FormViewは(再)バインドされませんが、2番目のDropDownListControlParameterが変更されているため、バインドされていますが、

のSystem.InvalidOperationException:そのような評価などのデータバインディングメソッド()、 のXPath()、およびバインド()は、文脈で使用することができるFormViewは、そのパスに結合されていないので、第二のDDLは、私が想定しますデータバス の制御の。ここで

マークアップです:

<InsertItemTemplate> 
. 
. 
. 
<tr class="GridViewRowB"> 
        <td class="GridViewCell"> 
         Offense Type 
        </td> 
        <td class="GridViewCell"> 
         <asp:DropDownList ID="ddlOffenseType" runat="server" DataSourceID="dsOffenseType" 
          AutoPostBack="true" DataValueField="OffenseTypeID" DataTextField="Description" 
          SelectedValue='<%# Bind("OffenseTypeID") %>'> 
         </asp:DropDownList> 
         <asp:ObjectDataSource ID="dsOffenseType" runat="server" TypeName="OffenseType" 
          SelectMethod="GetAll"> 
          <SelectParameters> 
           <asp:Parameter Name="ActiveOnly" DefaultValue="True" Type="Boolean" /> 
          </SelectParameters> 
         </asp:ObjectDataSource> 
        </td> 
       </tr> 
       <tr class="GridViewRowA"> 
        <td class="GridViewCell"> 
         Attorney 
        </td> 
        <td class="GridViewCell"> 
         <asp:DropDownList ID="ddlAttorney" runat="server" DataSourceID="dsAttorney" DataValueField="AttorneyID" 
          DataTextField="AttorneyNameWithCount" SelectedValue='<%# Bind("AttorneyID") %>'> 
         </asp:DropDownList> 
         <asp:ObjectDataSource ID="dsAttorney" runat="server" TypeName="Attorney" 
          SelectMethod="GetAttorneyWithCaseCount"> 
          <SelectParameters> 
           <asp:Parameter Name="ActiveOnly" DefaultValue="True" Type="Boolean" /> 
           <asp:ControlParameter Name="OffenseTypeID" Type="Int32" ControlID="ddlOffenseType" 
            PropertyName="SelectedValue" /> 
          </SelectParameters> 
         </asp:ObjectDataSource> 
        </td> 
       </tr> 
. 
. 
. 
</InsertItemTemplate> 

私の質問は:この機能を動作させるための最善の方法は何ですか?両方のDDLをテンプレートの中に入れることは可能ですか?私は、AJAXツールキットや他のクライアントサイドのソリューションを使用することを避けたいと考えています。

答えて

8

これは、データバインディングコントロールのカスケードドロップダウンリストをDetailsView/FormViewのように使用し、何度も直面している場合に問題となります。 2番目のドロップダウンリストSelectedValue='<%# Bind("AttorneyID") %>'からバインディング式を削除する必要があります。あなたはバインディング式を削除する場合

は第二に、あなたは、FormViewコントロールItemInsertingイベントに手動で値を渡す必要があります。例えば詳細は、ビューの

Protected Sub DetailsView1_ItemUpdating(sender As Object, e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating 
    e.NewValues("AtendeeSubType") = DirectCast(DirectCast(sender, DetailsView).FindControl("dropdownlist3"), DropDownList).SelectedValue 
End Sub 

は、私がイベントItemUpdatingのためにこれをテストしたが、私はそれがFormViewコントロールのために働くだろうと思い、ちょうどスイッチ:

protected void frmAsset_ItemInserting(object sender, FormViewInsertEventArgs e) 
{ 
    eValues["AttorneyID"] = ((DropDownList)((FormView)sender).FindControl("ddlAttorny")).SelectedValue; 
} 
+0

OKそう....その後、私は 'FormViewコントロールを処理する必要があります.ItemInserting'を実行し、手動でパラメータを追加しますか? 'Edit'モードでの同じ問題はどうですか?初期値と更新値の両方を手動で処理しますか?後世のためのコードの例は高く評価されます。 – pseudocoder

+0

yah、正確に。あなたは編集のために同じことをしなくてはなりません。 –

+0

このソリューションが動作することを確認しました。ありがとう!私はこれに似たアイデアをいくつか持っていましたが、ほとんどの人がどのように問題に近づいているかは分かりません – pseudocoder

4

は実際に私が私が行ったように誰が捕まってしまった場合には、この答えを投稿しています。 Muhammad Akhtarが言ったことは完全に機能しましたが、私はより簡単な解決策を見つけました。

<asp:DropDownList ID="ddlAttorney" runat="server" DataSourceID="dsAttorney" DataValueField="AttorneyID" DataTextField="AttorneyNameWithCount" SelectedValue='<%# Bind("AttorneyID") %>'> 

変更Bind("AttorneyID")
DataBinder.Eval (Container.DataItem, "AttorneyID")にそれは完璧に動作します!
EDIT:私のサンプルコード:

<asp:Content ID="Content3" ContentPlaceHolderID="BodyContent" runat="Server"> 
<asp:DetailsView ID="dv" runat="server" Height="50px" DataSourceID="ODS" DefaultMode="Insert" 
    AutoGenerateRows="False" OnItemCommand="dv_ItemCommand" OnItemInserted="dv_ItemInserted" 
    DataKeyNames="Id" OnItemUpdated="dv_ItemUpdated" CssClass="DetailsView" 
    > 
    <Fields> 
     <asp:TemplateField HeaderText="Page Name:"> 
      <ItemTemplate> 
       <asp:Label ID="txtPageName" runat="server" Text="<%#Bind('PageName') %>" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txtPageName" runat="server" Text="<%#Bind('PageName') %>" /> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Parent:"> 
      <ItemTemplate> 
       <asp:Label ID="txtParentPageName" runat="server" Text='<%#Bind("ParentPageName") %>' /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList runat="server" ID="lstParentPage" DataSourceID="ParentPageODS" 
        AppendDataBoundItems="true" DataTextField="PageName" DataValueField="Id" SelectedValue="<%#Bind('ParentPage') %>" 
        AutoPostBack="True"> 
        <asp:ListItem Text="-Root-" Value="" /> 
       </asp:DropDownList> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="After..."> 
      <ItemTemplate> 
       <asp:Label ID="txtPreviousPage" runat="server" Text='<%#Bind("PageOrder") %>' /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList runat="server" ID="lstPageOrder" AppendDataBoundItems="true" DataTextField="PageName" DataSourceID="PageOrderODS" DataValueField="PageOrder" EnableViewState="False" SelectedValue='<%# DataBinder.Eval (Container.DataItem, "PageOrder") %>'> 
        <asp:ListItem Text="-First-" Value="" /> 
       </asp:DropDownList> 
       <asp:ObjectDataSource ID="PageOrderODS" runat="server" SelectMethod="SelectByParent" 
        TypeName="SirM2X.Pages"> 
        <SelectParameters> 
         <asp:ControlParameter ControlID="lstParentPage" Name="ParentPage" PropertyName="SelectedValue" /> 
        </SelectParameters> 
       </asp:ObjectDataSource> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Dummy Page?"> 
      <ItemTemplate> 
       <asp:Label runat="server" ID="txtDummyPage" Text="<%#Bind('IsDummyText') %>" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:CheckBox ID="chkIsDummy" runat="server" Checked="<%#Bind('IsDummy') %>" /> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField ShowHeader="False"> 
      <EditItemTemplate> 
       <asp:Button ID="btnUpdate" runat="server" CausesValidation="True" CommandName="Update" 
        Text="<%$Resources:Resources, Update %>" /> 
       &nbsp;<asp:Button ID="btnCancel" runat="server" CausesValidation="False" CommandName="Cancel" 
        Text="<%$Resources:Resources, Cancel %>" /> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:Button ID="btnInsert" runat="server" CausesValidation="True" CommandName="Insert" 
        Text="<%$Resources:Resources, Insert %>" /> 
       &nbsp;<asp:Button ID="btnCancel" runat="server" CausesValidation="False" CommandName="Cancel" 
        Text="<%$Resources:Resources, Cancel %>" /> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Button ID="btnEdit" runat="server" CausesValidation="False" CommandName="Edit" 
        Text="<%$Resources:Resources, Edit %>" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Fields> 
</asp:DetailsView> 
<asp:ObjectDataSource ID="ODS" runat="server" DeleteMethod="DeleteRow" InsertMethod="InsertRow" 
    SelectMethod="SelectRow" TypeName="SirM2X.Pages" UpdateMethod="UpdateRow" OnInserting="ODS_Inserting" 
    OnUpdating="ODS_Updating"> 
    <DeleteParameters> 
     <asp:Parameter Name="Id" Type="Int32" /> 
    </DeleteParameters> 
    <InsertParameters> 
     <asp:Parameter Name="PageName" Type="String" /> 
     <asp:Parameter Name="CreatedBy" Type="String" /> 
     <asp:Parameter Name="ParentPage" Type="Int32" /> 
     <asp:Parameter Name="PageOrder" Type="Int32" /> 
     <asp:Parameter Name="IsDummy" Type="Boolean" /> 
    </InsertParameters> 
    <SelectParameters> 
     <asp:QueryStringParameter Name="Id" QueryStringField="ID" Type="Int32" /> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="Id" Type="Int32" /> 
     <asp:Parameter Name="PageName" Type="String" /> 
     <asp:Parameter Name="ParentPage" Type="Int32" /> 
     <asp:Parameter Name="PageOrder" Type="Int32" /> 
     <asp:Parameter Name="IsDummy" Type="Boolean" /> 
     <asp:Parameter Name="DeleteState" Type="Boolean" /> 
    </UpdateParameters> 
</asp:ObjectDataSource> 
<asp:ObjectDataSource ID="ParentPageODS" runat="server" SelectMethod="SelectAll" 
    TypeName="SirM2X.Pages"></asp:ObjectDataSource> 

+0

あなたは完全なページのソースを与えることができますか?この問題は、テンプレート内でカスケードコントロールがある場合にのみ発生し、DataBinder.Evalは基本的にEvalと同じことがわかります。 – pseudocoder

+0

@ pseudocoder私は彼らが同じことをすると思いました。しかし、最近、私はドロップダウンリストをカスケードする場合には少し違っていることを知りました。私は自分のコードを添付しており、それは完全に動作しています。 – M2X

1

ここでは、私はそれをやった方法です...

<asp:SqlDataSource ID="sqldsDDPlant" runat="server" ConnectionString="<%$ ConnectionStrings:SeedTrackerConnectionString %>" 
    SelectCommand="SELECT * FROM [Plant] ORDER BY [Plant]"></asp:SqlDataSource> 

<asp:SqlDataSource ID="sqldsDDType" runat="server" ConnectionString="<%$ ConnectionStrings:SeedTrackerConnectionString %>" 
    SelectCommand="SELECT * FROM [Type] ORDER BY [Type]" FilterExpression="PLID = '{0}'"> 
     <FilterParameters> 
      <asp:ControlParameter Name="plantParam" ControlID="DVSeedTracker$ddPlant" PropertyName="SelectedValue" /> 
     </FilterParameters> 
</asp:SqlDataSource> 

     <asp:TemplateField HeaderText="Plant"> 
      <InsertItemTemplate> 
       <asp:DropDownList ID="ddPlant" runat="server" AutoPostBack="true" SelectedValue='<%# Bind("PLID") %>' 
       DataSourceID="sqldsDDPlant" DataTextField="Plant" DataValueField="PLID" AppendDataBoundItems="True"> 
        <asp:ListItem></asp:ListItem> 
       </asp:DropDownList> 
       <asp:RequiredFieldValidator 
        id="RequiredFieldValidator2" 
        runat="server" 
        ControlToValidate="ddPlant" 
        Display="Static" 
        ErrorMessage="*Required" CssClass="RequiredField" />     
      </InsertItemTemplate> 
     </asp:TemplateField> 

     <asp:TemplateField HeaderText="Type"> 
      <InsertItemTemplate> 
       <asp:DropDownList ID="ddType" runat="server" 
       DataSourceID="sqldsDDType" DataTextField="Type" DataValueField="TYPID" AppendDataBoundItems="False"> 
        <asp:ListItem></asp:ListItem> 
       </asp:DropDownList> 
        <asp:RequiredFieldValidator 
        id="RequiredFieldValidator3" 
        runat="server" 
        ControlToValidate="ddType" 
        Display="Static" 
        ErrorMessage="*Required" CssClass="RequiredField" />         
      </InsertItemTemplate> 
     </asp:TemplateField> 
関連する問題