I’m creating a GridView with dynamic controls(including itemtemplates).
Here is the html code.
<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>
Here is the class for Adding 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";
}
}
}
Here is the page code…………………………………..
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);
}
Now Problem is when i click on linkbutton it disappear and no event other than rowdatabound is raised.
Since you’re creating these columns dynamically, you’ll need to recreate the controls at every postback. As for the event handler not firing, make sure you create the columns early enough in the page lifecycle. I would suggest creating the dynamic columns
OnInit, and see if that fixes the problem.