如何在c#中为动态下拉列表创建事件处理程序

时间:2010-09-06 06:07:00

标签: c# .net asp.net

我使用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);
    }
}

4 个答案:

答案 0 :(得分:3)

您可以像这样声明selectedindexchanged事件:

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

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

未调用事件的原因是AutoPostBack = true字段。如果未将其设置为true,则永远不会调用selectedIndexChanged事件。

答案 1 :(得分:0)

每当我在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在回发之间应该是相同的。

答案 2 :(得分:0)

要发生动态控件的事件,需要在page_load事件中或在page_load事件发生期间创建事件并分配事件。在Page_Load事件完成后,将触发Control的事件。如果未在page_load事件中重新创建控件,则事件将不会绑定到控件,也不会触发。

答案 3 :(得分:0)

我遇到了同样的问题,我在里面创建了动态ddl(!Page.IsPostBack)。当我将创作移到(!Page.IsPostBack)之外时,它工作正常。

你必须在(!Page.IsPostBack)之外创建你的元素,就像MUG4N所说的那样,它应该可以正常工作。