2014-04-02 123 views
1

我正在使用用戶控制頁面(.ascx)。我有一箇中繼器,裏面有n個DropDownList和一些文本框。我需要觸發SelectedIndexChanged事件來從文本框中獲取值。DropDownList SelectedindexChanged inside repeater does not fire

這是我得到的錯誤: 'ddlEye_SelectedIndexChanged'不是'ASP.controls_claims_laborder_ascx'的成員。

HTML:

<asp:Repeater ID="rptProducts" runat="server"> 
    <HeaderTemplate> 
     <tr class="Header"> 
      <td>Eye</td> 
      <td>Tarrif</td> 
      <td>Description</td> 
      <td>Lab Price</td> 
     </tr> 
    </HeaderTemplate> 
     <ItemTemplate> 
      <tr> 
       <td> 
        <asp:DropDownList ID="ddlEye" runat="server" OnSelectedIndexChanged="ddlEye_SelectedIndexChanged" AutoPostBack="true"> 
         <asp:ListItem Text="N/A" /> 
         <asp:ListItem Text="Left" /> 
         <asp:ListItem Text="Right" /> 
        </asp:DropDownList> 
       </td> 
       <td> 
        <asp:TextBox ID="txtTariff" runat="server" ReadOnly="true" Text='<%# DataBinder.Eval(Container.DataItem, "Code") %>' /> 
       </td> 
       <td> 
        <asp:TextBox ID="txtDescription" runat="server" ReadOnly="true" Text='<%# DataBinder.Eval(Container.DataItem, "Description") %>' /> 
       </td> 
       <td> 
        <asp:TextBox ID="txtLabPrice" runat="server" ReadOnly="true" Text='<%# DataBinder.Eval(Container.DataItem, "Invoice") %>' /> 
       </td> 
      </tr> 
     </ItemTemplate> 
</asp:Repeater> 

代碼隱藏:

Private Sub ddlEye_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlEye.SelectedIndexChanged 
     Dim dEye As DropDownList = DirectCast(sender, DropDownList) 

     If ddlEye.SelectedItem.Value = "Right" Then 
      lblLeftLensDesc.Text = "Description of the left lens" 
      lblRightLensDesc.Text = dEye.SelectedItem.Text 
     ElseIf ddlEye.SelectedItem.Value = "Left" Then 
      lblLeftLensDesc.Text = dEye.SelectedItem.Text 
      lblRightLensDesc.Text = "Description of the right lens" 
     Else 
      lblLeftLensDesc.Text = "Description of the left lens" 
      lblRightLensDesc.Text = "Description of the right lens" 
     End If 
End Sub 

我也試圖爲DropDownList的動態創建事件,但仍然無法正常工作。

Private Sub rptProducts_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptProducts.ItemDataBound 
     Dim dlEye As DropDownList = e.Item.FindControl("ddlEye") 
     Dim txtDesc As TextBox = e.Item.FindControl("txtDescription") 

     If Not dlEye Is Nothing AndAlso Not txtDesc Is Nothing Then 
      dlEye.SelectedIndexChanged += New EventHandler(ddlEye_SelectedIndexChanged) 
      dlEye.SelectedValue = txtDesc.Text 
     End If 

End Sub 

直放站綁定代碼:

Private Sub loadLineItems(ByVal strTransactionID As String) 
    Dim objLineItems As ArrayList = Managers.LineItem.GetLineItems(CInt(strTransactionID)) 

    If objLineItems.Count > 0 Then 
     rptProducts.DataSource = objLineItems 
     rptProducts.DataBind() 
    Else 
     rptProducts.DataSource = Nothing 
     rptProducts.DataBind() 
    End If 
End Sub 

If Not IsPostBack Then 
    loadLineItems(Session("pstrTransactionID").ToString()) 
End If 
+0

我假設你在每次回發時都要綁定'Repeater'(或者你的'UserControl'),而不是'If Not Page.IsPostaBack'。 –

+0

不,我不會在每一個回帖中都有約束力 – Gericke

+0

我相信你。但是,將數據綁定到數據綁定的位置並不是所有數據綁定的東西,而是調用'rptProducts.DataBind()'的部分。 –

回答

1

這是我的錯誤: 'ddlEye_SelectedIndexChanged' 不是 'ASP.controls_claims_laborder_ascx' 的 成員。

原因是您的事件處理程序是Private。您可能需要使其成爲ProtectedPublic,或者您無法在ascx上聲明式添加事件處理程序,但需要以代碼隱藏方式以編程方式添加它(使用HandlesAddHandler)。

因此,例如:

Protected Sub ddlEye_SelectedIndexChanged(sender As Object, e As System.EventArgs) 
    ' ... 
End Sub 

或(注意Handles

Private Sub ddlEye_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlEye.SelectedIndexChanged 
    ' ... 
End Sub 

在這裏,你需要刪除從ASCX以下

OnSelectedIndexChanged="ddlEye_SelectedIndexChanged" 

側面說明:您使用

AddHandler dlEye.SelectedIndexChanged, AddressOf ddlEye_SelectedIndexChanged 

在VB.NET中。

更新

太謝謝你了它的工作。也許你可以幫助我與另一個 問題,我想在setectedIndex更改時獲取與 DropDownList相同的行中的文本框值?

您可以通過NamingContainer得到RepeaterItem,您只需要對其進行相應的轉換即可。然後你可以使用FindControl("ID")得到TextBox

Protected Sub ddlEye_SelectedIndexChanged(sender As Object, e As System.EventArgs) 
     Dim dEye As DropDownList = DirectCast(sender, DropDownList) 
     Dim item = DirectCast(dEye.NamingContainer, RepeaterItem) 
     Dim txtTariff = DirectCast(item.FindControl("txtTariff"), TextBox) 
     ' ... 
End Sub 
+0

我現在沒有得到任何錯誤,但事件仍然沒有解僱 – Gericke

+0

@ G-Man:(注意我編輯了我的答案,在VB.NET中提供了添加事件處理程序的正確方法)。問題似乎不在此UserControl中,而是在DataBind UserControl本身的位置。你在頁面上做了什麼?如果你在'DropDownList'中選擇了一個不同的項目,或者如果postbacl根本沒有發生,你是否檢查過是否觸發了「Page_Load」? –

+0

當我選擇不同的值時發生回傳。我應該在哪裏添加您提供的事件處理程序代碼? – Gericke

-1

我不知道哪裏出了問題,但DropDownListSelectedIndexChanged事件引發了即使 ddlGarmentList控制被解僱了:

後面的代碼:

public partial class NewStyleItem : System.Web.UI.Page 
{ 
    protected StyleTemplateManager styleTempMngr = new StyleTemplateManager(); 

    protected StyleFabricationManager styleFabMngr = new StyleFabricationManager(); 

    protected List<ComponentReferenceView> ReferenceLookUpList 
    { 
     get 
     { 
      return (List<ComponentReferenceView>)ViewState["ReferenceLookUpView"]; 
     } 
     set 
     { 
      ViewState["ReferenceLookUpView"] = value; 
     } 
    } 

    protected List<ComponentReferenceView> ReferenceViewList 
    { 
     get 
     { 
      return (List<ComponentReferenceView>)ViewState["CompReferenceView"]; 
     } 
     set 
     { 
      ViewState["CompReferenceView"] = value; 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (this.IsPostBack == false) 
     { 
      LoadBrandList(); 
      ddlGarmentList.Enabled = false; 

      //ReferenceLookUpList = new List<ComponentReferenceView>(); 
     } 
     else 
     { 
     } 

     //rptStyleComponents.DataSource = ReferenceLookUpList; 
     //rptStyleComponents.DataBind(); 
    } 

    protected void LoadBrandList() 
    { 
     BrandManager brandMngr = new BrandManager(); 
     ddlBrandList.Items.Clear(); 

     ddlBrandList.Items.Add(new ListItem { Text = "Select brand", Value = "" }); 
     foreach (Brand item in brandMngr.Brands()) 
     { 
      ddlBrandList.Items.Add(new ListItem 
      { 
       Text = item.BrandDescription, 
       Value = item.BrandCode 
      }); 
     } 
    } 

    protected void LoadComponentInfo(string BrandCode) 
    { 
     if (styleTempMngr.FindTemplateByBrandCode(BrandCode) == true) 
     { 
      ReferenceLookUpList = (from StyleComponent i in styleFabMngr.ComponentList 
            join StyleFabReference x in styleTempMngr.ReferenceList on 
            i.SectionCode equals x.SectionCode 
            select new ComponentReferenceView 
            { 
             InOrder = x.SortOrder, 
             IsNeeded = x.IsRequired, 
             SCode = x.SeriesCode, 
             SecCode = x.SectionCode, 
             SecName = i.SectionName, 
             EntryValue = x.DataCharacter 
            }).OrderBy(p => p.InOrder).ToList(); 

      ReferenceLookUpList.Where(row => row.SecCode == "BCODE").ToList() 
       .ForEach(refItem => refItem.EntryValue = ddlBrandList.SelectedValue); 

      var DistinctList = (from StyleFabReference x in styleTempMngr.ReferenceList.OrderBy(p => p.SortOrder).ToList() 
           where x.SectionCode != "SPCHAR" && x.SectionCode != "BCODE" 
           select x.SectionCode).Distinct().ToList(); 

      ReferenceViewList = (from StyleComponent i in styleFabMngr.ComponentList 
           join x in DistinctList on 
           i.SectionCode equals x 
           select new ComponentReferenceView 
           { 
            SecCode = x, 
            SecName = i.SectionName 
           }).OrderBy(p => p.InOrder).ToList(); 
     } 
     else 
      ReferenceViewList = new List<ComponentReferenceView>(); 

     rptStyleComponents.DataSource = ReferenceViewList; 
     rptStyleComponents.DataBind(); 

    } 

    protected void LoadGarments(string ApparelCode) 
    { 
     if (string.IsNullOrEmpty(ddlBrandList.SelectedValue) == true) 
     { 
      ddlGarmentList.SelectedIndex = 0; 
      ddlGarmentList.Enabled = false; 
     } 
     else 
     { 
      ddlGarmentList.Enabled = true; 
      GarmentManager gmMngr = new GarmentManager(); 
      List<Garment> garmentList = new List<Garment>(); 
      garmentList = gmMngr.GetGarmentsByBrand(ddlBrandList.SelectedValue, ApparelCode); 
      ddlGarmentList.Items.Clear(); 
      ddlGarmentList.Items.Add(new ListItem { Text = "Select garment", Value = "" }); 

      foreach (Garment item in garmentList) 
      { 
       ddlGarmentList.Items.Add(new ListItem { Text = item.GarmentDescription, Value = item.GarmentCode }); 
      } 
     } 
    } 

    protected void ddlBrandList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     txtNewStyleNo.Text = string.Empty; 
     if (string.IsNullOrEmpty(ddlBrandList.SelectedValue) == false) 
      LoadComponentInfo(ddlBrandList.SelectedValue); 
    } 

    [Serializable] 
    public class ComponentReferenceView 
    { 
     public string SCode 
     { 
      get; 
      set; 
     } 
     public string SecCode 
     { 
      get; 
      set; 
     } 
     public string SecName 
     { 
      get; 
      set; 
     } 
     public int InOrder 
     { 
      get; 
      set; 
     } 
     public bool IsNeeded 
     { 
      get; 
      set; 
     } 
     public string EntryValue 
     { 
      get; 
      set; 
     } 
    } 

    protected void rptStyleComponents_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 

    } 

    protected void rptStyleComponents_ItemCreated(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      DropDownList ddlControl = (DropDownList)e.Item.FindControl("ddlDataSelection"); 

      if (ddlControl != null) 
      { 
       ddlControl.AppendDataBoundItems = true; 
       ddlControl.Items.Add(new ListItem { Text = "Select " + ReferenceViewList[e.Item.ItemIndex].SecName.ToLowerInvariant(), Value = "" }); 
       var itemlist = (from x in styleFabMngr.ComponentRowItems(ReferenceViewList[e.Item.ItemIndex].SecCode).AsEnumerable() 
           select new ListItem 
           { 
            Text = x.Field<string>("col_name"), 
            Value = x.Field<string>("col_value") 
           }); 
       ddlControl.Items.AddRange(itemlist.ToArray<ListItem>()); 

       ddlControl.EnableViewState = false; 
       ddlControl.AutoPostBack = true; 
       ddlControl.SelectedIndexChanged += new EventHandler(DropDownListSelectedIndexChanged); 
      } 
     } 
    } 

    protected virtual void DropDownListSelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddl = (DropDownList)sender; 
     RepeaterItem item = (RepeaterItem)ddl.NamingContainer; 

     ReferenceViewList[item.ItemIndex].EntryValue = ddl.SelectedValue; 
     ConstructStyleNo(); 

     var Apparelfound = ReferenceViewList.Where(x => x.SecCode == "APCODE" && 
      string.IsNullOrEmpty(x.EntryValue) == false).FirstOrDefault(); 

     if (Apparelfound != null) 
     { 
      ddlGarmentList.Enabled = true; 
      LoadGarments(Apparelfound.EntryValue); 
     } 
     else 
     { 
      ddlGarmentList.Enabled = false; 
     } 
    } 

    private void ConstructStyleNo() 
    { 
     foreach (ComponentReferenceView item in ReferenceViewList) 
     { 
      ReferenceLookUpList.Where(row => row.SecCode == item.SecCode).ToList() 
       .ForEach(refItem => refItem.EntryValue = item.EntryValue); 
     } 

     string sResult = string.Empty; 
     var result = (from x in ReferenceLookUpList.OrderBy(y => y.InOrder) 
         select x.EntryValue); 

     txtNewStyleNo.Text = string.Empty; 
     if (result != null) 
      txtNewStyleNo.Text = String.Join("", result) + "0001"; 

    } 

    private void ConstructStyleDescription() 
    { 
     txtStyleDescription.Text = ddlBrandList.SelectedItem.Text + "-" + ddlGarmentList.SelectedItem.Text; 
    } 

    protected void ddlGarmentList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     txtStyleDescription.Text = string.Empty; 
     if (string.IsNullOrEmpty(ddlGarmentList.SelectedValue) == false) 
      ConstructStyleDescription(); 
    } 
} 

ASPX:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <asp:UpdatePanel ID="upnlNewFabrication" runat="server"> 
     <ContentTemplate> 
      <h1> 
      New Style Item 
      </h1> 
      <br /> 
      <%--<usrCtrl:style_generation ID="stylegen_frm" runat="server"> 
      </usrCtrl:style_generation>--%> 

     <table> 
      <tr> 
       <td> 
        Brand : 
       </td> 
       <td> 
        <asp:DropDownList ID="ddlBrandList" runat="server" 
         onselectedindexchanged="ddlBrandList_SelectedIndexChanged" 
         AutoPostBack="True"> 
        </asp:DropDownList> 
       </td> 
      </tr>   
      <tr> 
       <td colspan="2"> 
       &nbsp; 
       </td> 
      </tr> 
      <tr> 
       <td> 
        Generated Style# : 
       </td> 
       <td> 
        <asp:TextBox ID="txtNewStyleNo" runat="server" ReadOnly="true"></asp:TextBox>     
       </td> 
      </tr> 
      <tr> 
       <td> 
        Style Description : 
       </td> 
       <td> 
        <asp:TextBox ID="txtStyleDescription" runat="server" ReadOnly="true"></asp:TextBox>     
       </td> 
      </tr> 
        <asp:Repeater ID="rptStyleComponents" runat="server" 
         onitemdatabound="rptStyleComponents_ItemDataBound" 
         onitemcreated="rptStyleComponents_ItemCreated" 
       EnableViewState="True"> 
         <ItemTemplate> 
          <asp:UpdatePanel ID="upnlComponent" runat="server"> 
           <ContentTemplate> 
            <tr> 
             <td> 
              <asp:Label ID="lblSectionName" runat="server" Text='<%# Eval("SecName")%>' ></asp:Label> 
             </td> 
             <td> 
              <asp:DropDownList ID="ddlDataSelection" runat="server"> 
              </asp:DropDownList>      
             </td> 
            </tr>        
           </ContentTemplate> 
           <Triggers> 
            <asp:PostBackTrigger ControlID="ddlDataSelection" /> 
           </Triggers> 
          </asp:UpdatePanel>       
         </ItemTemplate> 
        </asp:Repeater> 
     </table> 
     <br /> 
     <table> 
      <tr> 
      <td colspan="2">Description Items</td> 
      </tr> 
      <tr> 
       <td colspan="4"></td> 
      </tr> 
      <tr> 
       <td>Garment Type:</td> 
       <td> 
        <asp:UpdatePanel ID="upGarment" runat="server" > 
        <ContentTemplate> 
         <asp:DropDownList ID="ddlGarmentList" runat="server" 
          AppendDataBoundItems="True" AutoPostBack="True" 
          onselectedindexchanged="ddlGarmentList_SelectedIndexChanged"> 
          <asp:ListItem Text = "Select garment" Value = ""></asp:ListItem>  
         </asp:DropDownList> 
         <asp:SqlDataSource ID="sdsGarment" runat="server" 
          ConnectionString="<%$ ConnectionStrings:IRMSConnectionString %>" 
          SelectCommand="Select * from Garments"></asp:SqlDataSource> 
        </ContentTemplate> 
        <Triggers> 
         <asp:PostBackTrigger ControlID="ddlGarmentList" /> 
        </Triggers> 
        </asp:UpdatePanel> 

       </td> 
      </tr> 
      <tr> 
       <td>Cost Price:</td> 
       <td> 
        <asp:TextBox ID="txtCostPrice" runat="server"></asp:TextBox></td> 
       <td>SRP :</td> 
       <td><asp:TextBox ID="txtSRP" runat="server"></asp:TextBox></td> 
      </tr> 
      <tr> 
       <td>Quantity :</td> 
       <td><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td> 
       <td>Week :</td> 
       <td><asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></td> 
      </tr> 
     </table> 

     </ContentTemplate> 
    </asp:UpdatePanel> 
</asp:Content> 
+0

這是應該回答這個問題嗎? – jpo38