2011-07-19 14 views
5

मेरे पास 2 DropDownList मेरे रूप में नियंत्रण है, जिसमें से दूसरा अपने बाध्यकारी पैरामीटर के रूप में पहले के SelectedValue का उपयोग करता है।एक टेम्पलेट नियंत्रण में बाध्यकारी ड्रॉपडाउनलिस्ट को लागू करना

दोनों DropDownList नियंत्रण FormView के डेटा स्रोत एक बाध्यकारी अभिव्यक्ति का उपयोग कर के लिए बाध्य एक FormView.InsertItemTemplateSelectedValue साथ गुण में हैं।

पहली बार FormView सम्मिलित मोड में प्रस्तुत करता है, सब कुछ ठीक काम करता है। समस्या AutoPostBack के बाद DropDownList से FormView नहीं है (0)। दूसरे DropDownList पर बदल गई है, इसलिए यह बाध्य (उद्देश्य के रूप में) है, लेकिन बाध्यकारी अभिव्यक्ति पर एक अपवाद होता है

System.InvalidOperationException:: दूसरे DDL, मैं FormView के बाद लगता है कि पास पर बाध्यकारी नहीं है इस तरह के eval(), XPath(), और बाइंड() के रूप में Databinding तरीकों केवल संदर्भ में इस्तेमाल किया जा सकता एक डेटाबेस नियंत्रण।

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

मेरा प्रश्न है: सबसे अच्छा तरीका है इस कार्यक्षमता काम करने के लिए क्या है

यहाँ मार्कअप है? क्या डीडीएल दोनों को टेम्पलेट के अंदर रखना संभव है? मैं AJAX टूलकिट या अन्य क्लाइंट-साइड समाधानों का उपयोग करने से बचना पसंद करूंगा।

उत्तर

8

यह एक मुद्दा है जब हम DetailsView/FormView जैसे डाटाबेसिंग नियंत्रण में कैस्केडिंग ड्रॉपडाउनलिस्ट का उपयोग करते हैं और मैंने इसे कई बार सामना किया है। आपको अपनी दूसरी ड्रॉपडाउन सूची SelectedValue='<%# Bind("AttorneyID") %>' से बाध्यकारी अभिव्यक्ति को हटाना होगा, फिर यह काम करेगा।

दूसरा यदि आप बाइंडिंग अभिव्यक्ति को हटाते हैं, तो आपको फॉर्मव्यू ItemInserting ईवेंट में मैन्युअल रूप से मान पास करना होगा। जैसे

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

ठीक तो .... तो मैं '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

असल में मैं किसी और मामले किसी को भी इस उत्तर पोस्ट कर रहा हूँ की तरह मैंने किया था अटक गई। मुहम्मद अख्तर ने क्या कहा पूरी तरह से काम करता है, हालांकि मुझे एक आसान समाधान मिला।

में
<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

@ स्यूडोकोडर मैंने सोचा कि वे वही काम करते हैं। हालांकि, हाल ही में मुझे पता चला कि वे ड्रॉप डाउन सूचियों के मामले में थोड़ा अलग हैं। मैंने अपना कोड संलग्न किया है और यह अप्रत्यक्ष रूप से काम कर रहा है। – 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> 
संबंधित मुद्दे