2013-07-22 49 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.

溶液以除去控制計數變量匹配生成。