2011-07-19 64 views
5

我在窗體上有2 DropDownList控件,其中第二個使用第一個SelectedValue作爲其綁定參數之一。在模板控件中實現級聯DropDownList綁定

兩個DropDownList控制是在綁定到使用一個綁定表達式的FormView的數據源一個FormView.InsertItemTemplateSelectedValue性質。

第一次FormView呈現在插入模式下,一切工作正常。問題是在從DropDownList開始的AutoPostBack之後,FormView沒有(重新)綁定,但是由於第二個DropDownList上的ControlParameter發生了變化,它會進行綁定(如預期的那樣),但綁定表達式

System.InvalidOperationException:第二DDL,我由於FormView假定沒有對通結合數據綁定方法如eval()函數, 的XPath()和綁定()只能在上下文中使用的數據綁定 控制。

下面是標記:

<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,我已經多次遇到它。你必須從你的第二個下拉列表SelectedValue='<%# Bind("AttorneyID") %>'刪除綁定表達式,那麼它會工作。

其次,如果您刪除了綁定表達式,則必須在FormView ItemInserting事件中手動傳遞該值。例如

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

OK等等....然後我需要處理的FormView' .ItemInserting'並手動添加參數?在編輯模式下,同樣的問題呢?手動處理初始值和更新值?示例代碼爲後代將不勝感激。 – pseudocoder

+0

呀,確切地說。你也必須做同樣的編輯。 –

+0

我驗證了此解決方案的正常工作。謝謝!我有一些類似的想法,但不知道大多數人如何解決這個問題。 – pseudocoder

2

這可能會有點遲,但總好過從未:

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工作,只是開關你需要的部分,它會工作。

編輯:您可以檢查此引用: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview.itemupdating.aspx

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")
它完美!
編輯:我的示例代碼:

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