문제

I am using User Control Pages (.ascx). I have a repeater and inside it I have n DropDownList and some textboxes. I need to trigger SelectedIndexChanged event to get values from textbox.

This is the error that I get: 'ddlEye_SelectedIndexChanged' is not a member of '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>

Codebehind:

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

I have also tried to dynamically create event for DropDownList but that still does not work.

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

Repeater Binding Code:

 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
도움이 되었습니까?

해결책

This is the error that I get: 'ddlEye_SelectedIndexChanged' is not a member of 'ASP.controls_claims_laborder_ascx'.

The reason is that your event handler is Private. You either need to make it Protected or Public or you can't add the event-handler declaratively on the ascx but you need to add it programmatically in codebehind (by using Handles or AddHandler).

So for example:

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

or (note the Handles)

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

Here you need to remove following from ascx

OnSelectedIndexChanged="ddlEye_SelectedIndexChanged"

Side-note: you use

AddHandler dlEye.SelectedIndexChanged, AddressOf ddlEye_SelectedIndexChanged

in VB.NET.

Update

Thank you so much it worked. Perhaps you can help me with another issue, I want to get the textbox value in the same row as the DropDownList when setectedIndex changes?

You can get the RepeaterItem via NamingContainer, you just need to cast it accordingly. Then you can use FindControl("ID") to get the 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

다른 팁

I don't know what went wrong but DropDownListSelectedIndexChanged event fires up even though ddlGarmentList control was fired up :

CODE BEHIND:

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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top