R
Reg_H
I've come across a strange problem where I have a GridView TemplateField
column that doesn't render out a row where the value is NULL for the cell in
question but a BoundColumn will. This problem is masked if you have other
columns in the gridview which have values in, you'll get all the rows if you
always have at least one column that has something other than null, but when
you just have column(s) that all are empty with a TemplateField my GridView
doesn't render those rows.
This problem is best explained with some sample code which reproduces the
problem. I appreciate it maybe something simple I've overlooked, but I just
can't figure out why the null item rows won't render with a TemplateField.
Any ideas why GridView1 doesn't have the same row count as GridView2?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test4.aspx.cs"
Inherits="test4" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
Caption="TemplateField GridView">
</asp:GridView>
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false"
Caption="BoundField GridView">
<Columns>
<asp:BoundField DataField="Total" HeaderText="Total" />
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
public partial class test4 : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
DataTable dt = new DataTable();
dt.Columns.Add("Site");
dt.Columns.Add("Total");
DataRow row;
Random RandomClass = new Random();
for (int n = 0; n < 10; n++)
{
row = dt.NewRow();
row["Site"] = "Site " + n.ToString();
row["Total"] = RandomClass.Next();
dt.Rows.Add(row);
}
//now, add some intentional null rows
for (int n = 0; n < 10; n++)
{
row = dt.NewRow();
row["Site"] = "XSite " + n.ToString();
row["Total"] = DBNull.Value;
dt.Rows.Add(row);
}
GridView1.DataSource = dt;
TemplateField tf = new TemplateField();
ColTemplate ct = new ColTemplate(ListItemType.Item, "Total");
tf.ItemTemplate = ct;
tf.HeaderText = "Site";
GridView1.Columns.Add(tf);
GridView1.DataBind();
GridView2.DataSource = dt;
GridView2.DataBind();
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
#region Template
public class ColTemplate : ITemplate
{
ListItemType templateType;
string columnName;
public ColTemplate(ListItemType templateType, string columnName)
{
this.templateType = templateType;
this.columnName = columnName;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case ListItemType.Item:
LinkButton lb = new LinkButton();
lb.DataBinding += new EventHandler(lb_DataBinding);
container.Controls.Add(lb);
break;
}
}
void lb_DataBinding(object sender, EventArgs e)
{
LinkButton lb = (LinkButton)sender;
GridViewRow container = (GridViewRow)lb.NamingContainer;
if (container.DataItem is DataRowView)
{
DataRowView dvr = container.DataItem as DataRowView;
if (dvr.Row.Table.Columns.Contains(columnName))
{
lb.Text = DataBinder.Eval(container.DataItem, columnName,
"{0:N0}").ToString();
}
}
}
};
#endregion
column that doesn't render out a row where the value is NULL for the cell in
question but a BoundColumn will. This problem is masked if you have other
columns in the gridview which have values in, you'll get all the rows if you
always have at least one column that has something other than null, but when
you just have column(s) that all are empty with a TemplateField my GridView
doesn't render those rows.
This problem is best explained with some sample code which reproduces the
problem. I appreciate it maybe something simple I've overlooked, but I just
can't figure out why the null item rows won't render with a TemplateField.
Any ideas why GridView1 doesn't have the same row count as GridView2?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test4.aspx.cs"
Inherits="test4" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
Caption="TemplateField GridView">
</asp:GridView>
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false"
Caption="BoundField GridView">
<Columns>
<asp:BoundField DataField="Total" HeaderText="Total" />
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
public partial class test4 : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
DataTable dt = new DataTable();
dt.Columns.Add("Site");
dt.Columns.Add("Total");
DataRow row;
Random RandomClass = new Random();
for (int n = 0; n < 10; n++)
{
row = dt.NewRow();
row["Site"] = "Site " + n.ToString();
row["Total"] = RandomClass.Next();
dt.Rows.Add(row);
}
//now, add some intentional null rows
for (int n = 0; n < 10; n++)
{
row = dt.NewRow();
row["Site"] = "XSite " + n.ToString();
row["Total"] = DBNull.Value;
dt.Rows.Add(row);
}
GridView1.DataSource = dt;
TemplateField tf = new TemplateField();
ColTemplate ct = new ColTemplate(ListItemType.Item, "Total");
tf.ItemTemplate = ct;
tf.HeaderText = "Site";
GridView1.Columns.Add(tf);
GridView1.DataBind();
GridView2.DataSource = dt;
GridView2.DataBind();
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
#region Template
public class ColTemplate : ITemplate
{
ListItemType templateType;
string columnName;
public ColTemplate(ListItemType templateType, string columnName)
{
this.templateType = templateType;
this.columnName = columnName;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case ListItemType.Item:
LinkButton lb = new LinkButton();
lb.DataBinding += new EventHandler(lb_DataBinding);
container.Controls.Add(lb);
break;
}
}
void lb_DataBinding(object sender, EventArgs e)
{
LinkButton lb = (LinkButton)sender;
GridViewRow container = (GridViewRow)lb.NamingContainer;
if (container.DataItem is DataRowView)
{
DataRowView dvr = container.DataItem as DataRowView;
if (dvr.Row.Table.Columns.Contains(columnName))
{
lb.Text = DataBinder.Eval(container.DataItem, columnName,
"{0:N0}").ToString();
}
}
}
};
#endregion