簡體   English   中英

如何在c#中為動態下拉列表創建事件處理程序

[英]how to create event handler for dynamic drop down list in c#

我使用Itemplate創建了一個動態網格視圖。現在我還在網格中創建了一個動態下拉列表。 如何在selectedindexchange上創建事件處理程序。

我創建了一個slectedindexchange事件,但它沒有工作。控件永遠不會傳遞給事件?

怎么做創建一個事件處理程序

public class DynamicGridViewTextTemplate : ITemplate
{
    string _ColName;
    DataControlRowType _rowType;
    int _Count;
    details Details1 = new details();

    public DynamicGridViewTextTemplate(string ColName, DataControlRowType RowType)
    {
        _ColName = ColName;
        _rowType = RowType;
    }

    public DynamicGridViewTextTemplate(DataControlRowType RowType, int ArticleCount)
    {
        _rowType = RowType;
        _Count = ArticleCount;
    }

    public void InstantiateIn(System.Web.UI.Control container)
    {
        switch (_rowType)
        {
            case DataControlRowType.Header:
                Literal lc = new Literal();
                lc.Text = "<b>" + _ColName + "</b>";

                DropDownList ddl = new DropDownList();

                ddl.AutoPostBack = true;
                ddl.SelectedIndexChanged += new EventHandler(this.ddl_SelIndexChanged);

                container.Controls.Add(lc);
                container.Controls.Add(ddl);

                break;

            case DataControlRowType.DataRow:               

                 //Label lbl = new Label();

                 //lbl.DataBinding += new EventHandler(this.lbl_DataBind);
                 LinkButton lb = new LinkButton();
                 lb.DataBinding += new EventHandler(this.lbl_DataBind);
                 lb.OnClientClick +=new EventHandler(this.lb_Click);

                 //lbl.Controls.Add(lb);
                 container.Controls.Add(lb);               

                break;

            case DataControlRowType.Footer:
                Literal flc = new Literal();
                flc.Text = "<b>Total No of Articles:" + _Count + "</b>";
                container.Controls.Add(flc);
                break;

            default:

                break;
        }
    }

    private void lb_Click(Object sender, EventArgs e)
    {
        details1.lbl_Click(sender, e);
    }

    private void lbl_DataBind(Object sender, EventArgs e)
    {
        //Label lbl  = (Label)sender;
        LinkButton lbl = (LinkButton)sender;

        GridViewRow row = (GridViewRow)lbl.NamingContainer;

        lbl.Text =DataBinder.Eval(row.DataItem, _ColName).ToString();
    }

    public void ddl_SelIndexChanged(Object sender, EventArgs e)
    {
        Details1.ddlFilter_SelectedIndexChanged(sender,e);
    }
}

你可以像這樣聲明你selectedindexchanged事件:

ddlFilter.SelectedIndexChanged += new EventHandler(ddl2_SelectedIndexChanged);
ddlFilter.AutoPostBack = true;

void ddlFilter_SelectedIndexChanged(object sender, EventArgs e)
{
    //your code 
}

未調用事件的原因是AutoPostBack = true字段。 如果未將其設置為true,則永遠不會調用selectedIndexChanged事件。

每當我在ASP網頁中創建一個新控件時,我都會按照這個鍋爐板(注意我添加了一些示例控件,所以它不是一個“干凈”的鍋爐板):

namespace Components {
    [ToolboxData("<{0}:MyControl runat=server></{0}:MyControl>")]
    public class MyControl : WebControl, INamingContainer {

        // todo: add controls that are created dynamically
        private GridView gridView;

        public MyControl () {
            Initialize();
        }

        [Browsable(false)]
        public override ControlCollection Controls {
            get { EnsureChildControls(); return base.Controls; }
        }

        protected override void OnLoad(EventArgs e) {
            // todo: attach event listeners for instance
            base.OnLoad(e);
        }

        protected override void CreateChildControls() {
            Initialize();
        }

        protected override void Render(HtmlTextWriter writer) {
             if (DesignMode) {
                 // If special design mode rendering
                 return;
             }
             base.Render(writer);
        }

        /// This is where the controls are created
        private void Initialize() {
            base.Controls.Clear();
            // todo: Create all controls to add, even those "added later"
            // if something is generated but should not be shown,
            // set its Visible to false until its state is changed
            Label exampleLabel = new Label();
            exampleLabel.Visible = false; // like so
            if (gridView == null) { gridView = new GridView(); }
            base.Controls.Add(exampleLabel);
            base.Controls.Add(gridView);
        }
    }
}

現在,如果您在Initialize中創建動態下拉列表並將其每次添加到您的Controls集合中,但只在您希望它顯示時將其Visibility設置為true ,則應觸發您的事件,因為您的控件的id應該相同回發之間。

我遇到了同樣的問題,我在里面創建了動態ddl(!Page.IsPostBack)。 當我將創作移到(!Page.IsPostBack)之外時,它工作正常。

您必須在(!Page.IsPostBack)之外創建您的元素,如MUG4N所說,它應該可以正常工作。

要發生動態控件的事件,需要在page_load事件中或在page_load事件發生期間創建它並分配事件。 在Page_Load事件完成后,將觸發Control的事件。 如果未在page_load事件中重新創建控件,則事件將不會綁定到控件,也不會觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM