如何在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 = "" + _ColName + ""; 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 = "Total No of Articles:" + _Count + ""; 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>")] 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应该相同回发之间。

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

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

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