2010-09-06 6 views
3

Я создал динамическое представление сетки с помощью Itemplate. Теперь я также создал динамический выпадающий список в сетке. как создать обработчик событий для selectedindexchange.Как создать обработчик событий для динамического выпадающего списка в C#

Я создал событие slectedindexchange, но он не работал. Control никогда не переходит к событию?

что делать создать обработчик события

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); 
    } 
} 
+0

Вы можете разместить весь код для этого метода, а также this.ddl_SelIndexChanged? – InSane

+0

Если вы используете ASP.NET, вы должны помнить о том, чтобы перестроить структуру Control на каждой загрузке страницы, как это было, когда событие было запущено, иначе событие не будет запускаться. – Patrick

+0

can u plz расскажите, как это сделать – Arunachalam

ответ

3

вы можете объявить вам SelectedIndexChanged событие, как это:

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

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

Причина ваше мероприятие не называлось это AutoPostBack = истинное поле. Если вы не установите значение true, ваше событие selectedIndexChanged никогда не будет вызвано.

+0

ddl.AutoPostBack = true; ddl.SelectedIndexChanged + = new EventHandler (this.ddl_SelIndexChanged Я также сделал то же самое, что и не работал – Arunachalam

+0

Вы проверяли, вызван ли код? Или, может быть, он потерялся с обратной передачей, вы тоже это проверили? – MUG4N

+0

У вас есть для добавления события в каждый ответный пост – MUG4N

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, когда вы хотите его показать, ваше событие должно быть запущено, так как идентификаторы ваших элементов управления должны быть одинаковыми между обратными передачами.

0

Событие динамического управления, которое требуется создать, и назначить событие в событии page_load или во время события page_load. Событие Control будет срабатывать после завершения события Page_Load. Если элемент управления не воссоздается в событии page_load, событие не будет привязываться к элементу управления и не будет срабатывать.

0

У меня была такая же проблема, и я создавал динамический ddl внутри (! Page.IsPostBack). Когда я переместил создание за пределами (! Page.IsPostBack), он работал нормально.

Вы должны создать свои элементы вне (! Page.IsPostBack), как сказал MUG4N, и он должен работать нормально.

Смежные вопросы