2013-07-22 30 views
0

我创建了一个继承asp.net gridview的自定义gridview控件。我需要在此GridView中使用项目模板。我在自定义gridview中创建了一个生成项目模板的方法。动态Gridview - 项目模板控制事件处理

public void addTemplateField(Control headerTemplateControl, Control itemTemplateControl, EventHandler bindHandler, EventHandler initHandler, string headerText, string sortExpression, bool isVisible, int? heightPx, int? widthPercent) 
{ 
    TemplateField tField = new TemplateField(); 

    if (headerTemplateControl != null) 
     tField.HeaderTemplate = new GridViewTemplate(ListItemType.Header, headerTemplateControl); 

    if (bindHandler != null && initHandler != null) 
     tField.ItemTemplate = new GridViewTemplate(ListItemType.Item, itemTemplateControl, bindHandler, initHandler); 

    else if (bindHandler != null) 
     tField.ItemTemplate = new GridViewTemplate(ListItemType.Item, itemTemplateControl, bindHandler, false); 

    else if (initHandler != null) 
     tField.ItemTemplate = new GridViewTemplate(ListItemType.Item, itemTemplateControl, initHandler, true); 

    else 
     tField.ItemTemplate = new GridViewTemplate(ListItemType.Item, itemTemplateControl); 

    if (sortExpression != null) 
     tField.SortExpression = sortExpression; 

    tField.Visible = isVisible; 

    if (headerText != null) 
     tField.HeaderText = headerText; 

    if (heightPx.HasValue) 
     tField.HeaderStyle.Height = new Unit(heightPx.Value, UnitType.Pixel); 

    if (widthPercent.HasValue) 
     tField.HeaderStyle.Height = new Unit(widthPercent.Value, UnitType.Percentage); 

    addColumnField(tField); 
} 

这该是多么我已经实现了Itemplate

public class GridViewTemplate : ITemplate 
{ 
    int _controlCount = 0; 
    ListItemType _templateType; 
    EventHandler _bindHandler; 
    EventHandler _initHandler; 
    Control _control; 
    public GridViewTemplate(ListItemType type, Control control) 
    { 
     this._templateType = type; 
     this._control = control; 
    } 
    public GridViewTemplate(ListItemType type, Control control, EventHandler Handler, bool isInitHandler) 
    { 
     this._templateType = type; 
     this._control = control; 
     if (isInitHandler) 
      this._initHandler = Handler; 
     else 
      this._bindHandler = Handler; 
    } 
    public GridViewTemplate(ListItemType type, Control control, EventHandler bindHandler, EventHandler initHandler) 
    { 
     this._templateType = type; 
     this._control = control; 
     this._bindHandler = bindHandler; 
     this._initHandler = initHandler; 
    } 
    public Control Copy(Control ctrlSource) 
    { 
     Type _type = ctrlSource.GetType(); 
     Control ctrlDest = (Control)Activator.CreateInstance(_type); 
     foreach (PropertyInfo prop in _type.GetProperties()) 
     { 
      if (prop.CanWrite) 
      { 
       if (prop.Name == "ID") 
       { 
        ctrlDest.ID = ctrlSource.ID + "_copy_" + _controlCount; 
       } 
       else 
       { 
        prop.SetValue(ctrlDest, prop.GetValue(ctrlSource, null), null); 
       } 
      } 
     } 
     _controlCount++; 

     return ctrlDest; 
    } 
    public void InstantiateIn(Control container) 
    { 
     switch (_templateType) 
     { 
      case ListItemType.Header: 
       container.Controls.Add(_control); 
       break; 
      case ListItemType.Item: 
       Control temp = Copy(_control); 
       if(_bindHandler != null) 
        temp.DataBinding += _bindHandler; 
       if (_initHandler != null) 
        temp.Init += _initHandler; 
       container.Controls.Add(temp); 
       break; 
     } 
    } 

} 

在需要说Default.aspx.cs,我创建这个gridview的onPreInit和其附加的事件处理程序的OnInit的页面。

我通过调用addTemplateField()将复选框添加到网格。

cbl = new CheckBox(); 
cbl.AutoPostBack = true; 
init = new EventHandler(cbl_Init); 
grd.addTemplateField(null, cbl, null, init, "SERVER", null, true, 20, 20); 

void cbl_Init(object sender, EventArgs e) 
{ 
    CheckBox c = (CheckBox)sender; 
    c.CheckedChanged +=new EventHandler(cbl_CheckedChanged); 
} 

void cbl_CheckedChanged(object sender, EventArgs e) 
{ 
    // Modify datasource 
    // databind(); 

//如果我删除此数据绑定,每次都会处理checkchanged。如果我保留数据绑定,事件只能处理其他时间。 }

问题是复选框checkchanged事件被触发的替代时间。每隔一段时间,页面发回,但checkchanged事件不处理。我迷失于寻找原因,更不用说解决方案了。!?!?!

回答

1

我找到了问题的根本原因。它位于gridviewtemplate类的Copy方法中。问题在于每次回发时,生成的控件都是以唯一的ID完成的。所以在回发由控件触发的事件时,它已经改变了它的ID,所以没有事件被触发。

更晶体...

  1. 页面加载最初有一个唯一的ID控制,
  2. 单击控制触发事件
  3. 页面后背上与所产生的控制使用相同的ID。
  4. 点击控件触发事件。
  5. 页回,但控制与不同它不步骤的事件源4.

溶液以除去控制计数变量匹配生成。