2011-09-27 5 views
1

동적 컨트롤 (itemtemplates 포함)이있는 GridView를 만들고 있습니다. 다음은 html 코드입니다. 여기 Gridview 동적 linkButton 이벤트가 실행되지 않습니다.

<asp:GridView ID="gvItems" runat="server" 
         AutoGenerateColumns="False" CellPadding="4" 
         GridLines="None" 
         Width="95%" EmptyDataText="Records Not Found!!!!" 
         onselectedindexchanged="gvItems_SelectedIndexChanged" 
         onrowdatabound="gvItems_RowDataBound" onrowcommand="gvItems_RowCommand" 
         onselectedindexchanging="gvItems_SelectedIndexChanging"> 
         <RowStyle CssClass="GVRowStyle" /> 
         <Columns> 

         </Columns> 
         <PagerStyle CssClass="gridPager" /> 
         <SelectedRowStyle BackColor="#DCCDDA" Font-Bold="true" ForeColor="#510030" /> 
         <HeaderStyle CssClass="Gheader" /> 
         <AlternatingRowStyle CssClass="AlternatingRowStyle" /> 
         <EditRowStyle BackColor="#7C6F57" /> 
         <EmptyDataRowStyle CssClass="EmptyRowStyle" /> 
        </asp:GridView> 

는 ItemTemplate을가

을 ............................................. 추가의 클래스입니다
public class GridViewTemplate : ITemplate 
{ 
ListItemType _templateType; 
string _columnName; 

public GridViewTemplate(ListItemType type, string colname) 
{ 
    _templateType = type; 
    _columnName = colname; 
} 

void ITemplate.InstantiateIn(System.Web.UI.Control container) 
{ 
    switch (_templateType) 
    { 
     case ListItemType.Header: 
      Label lbl = new Label(); 
      lbl.Text = _columnName; 
      container.Controls.Add(lbl); 
      break; 

     case ListItemType.Item: 
      LinkButton Lb1 = new LinkButton(); 
      Lb1.CommandName = "Select"; 
      Lb1.DataBinding += new EventHandler(tb1_DataBinding); 
      container.Controls.Add(Lb1); 
      break; 

     case ListItemType.EditItem: 

      break; 

     case ListItemType.Footer: 
      CheckBox chkColumn = new CheckBox(); 
      chkColumn.ID = "Chk" + _columnName; 
      container.Controls.Add(chkColumn); 
      break; 
    } 
} 

void tb1_DataBinding(object sender, EventArgs e) 
{ 
    LinkButton LinkData = (LinkButton)sender; 
    GridViewRow container = (GridViewRow)LinkData.NamingContainer; 
    object dataValue = DataBinder.Eval(container.DataItem, _columnName); 
    if (dataValue != DBNull.Value) 
    { 
     LinkData.Text = dataValue.ToString(); 
     LinkData.ForeColor = System.Drawing.Color.Red; 
     LinkData.CommandName = "Select"; 
    } 
} 

}

여기 페이지 코드 .................................. .......

for (int i = 0; i < dtGrid.Columns.Count; i++) 
     { 
      string columnName = dtGrid.Columns[i].ColumnName; 
      BoundField bField = new BoundField(); 
      TemplateField tField = new TemplateField(); 
      if (i == 0) 
      { 
       tField.HeaderTemplate = new GridViewTemplate(ListItemType.Header, columnName); 
       tField.ItemTemplate = new GridViewTemplate(ListItemType.Item, columnName); 
       tField.HeaderStyle.HorizontalAlign = HorizontalAlign.Left; 
       tField.ItemStyle.ForeColor = System.Drawing.Color.Red; 
       gvItems.Columns.Add(tField); 

      } 
      else 
      { 

       bField.DataField = columnName; 
       bField.HeaderText = columnName; 
       bField.HeaderStyle.HorizontalAlign = HorizontalAlign.Left; 
       gvItems.Columns.Add(bField); 
      } 

이제 문제는 내가 linkbutton을 클릭하면 사라지고 rowdatab ound가 발생합니다.

답변

2

이 열을 동적으로 만들므로 모든 다시 게시마다 컨트롤을 다시 만들어야합니다. 이벤트 처리기가 실행되지 않는 경우 페이지 수명주기에서 충분히 일찍 열을 생성해야합니다. 동적 열 OnInit을 생성하고 문제가 해결되는지 확인하십시오.

+0

문제는 데이터베이스 기반으로 gridcolumns를 만들고 있습니다. –

-1

포스트 백에서 데이터를 다시 바인딩 하시겠습니까?
데이터 바인딩 논리가 if (! IsPostback)로 묶여 있는지 확인하십시오.
그리드의 재 바인딩은 버튼을 다시 만드는 것을 의미하므로 아무런 이벤트도 발생하지 않습니다.

관련 문제