如果只给gridview控件设置了绑定字段的模板,那么如果数据源为空的时候,默认情况下是不显示列头的,这大大影响了页面的友好性。
为解决这个问题,其中一个方法就是是用方法给gridview的数据源添加一个空行的数据源,然后再绑定,这样在页面中就显示出标头了。
这是一种解决问题的思路,但是如果有n个gridview,且数据源又都不相同的时候怎么办呢?要给每一种数据源都添加一个空行吗?看来这种做法并不是解决问题的最优思路,这里学习一种新的方法,从控件的角度去解决问题:
/// <summary>
/// 当grid数据为空是给grid添加列头
/// 此方法在grid的PreRender事件中调用
/// </summary>
/// <param name="grid">grid控件</param>
protected void CreateHeaderRow(GridView grid)
{
Table maintable = null;
if (grid.Controls.Count == 0)
{
maintable = new Table();
maintable.ApplyStyle(grid.ControlStyle);
grid.Controls.Add(maintable);
}
else
maintable = grid.Controls[0] as Table;
bool IsCreateHeader = false;
bool IsCreateEmptyRow = false;
if (maintable.Rows.Count == 0)
{
IsCreateHeader = true;
IsCreateEmptyRow = true;
}
else
{
GridViewRow gvr = maintable.Rows[0] as GridViewRow;
if (gvr.RowType == DataControlRowType.EmptyDataRow)
{
maintable.Rows.Clear();
IsCreateHeader = true;
IsCreateEmptyRow = true;
}
else
{
IsCreateHeader = false;
IsCreateEmptyRow = false;
}
}
int ColumnCount = 0;
if (IsCreateHeader)
{
GridViewRow gvr = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
gvr.ApplyStyle(grid.HeaderStyle);
for (int i = 0; i < grid.Columns.Count; i++)
{
DataControlField column = grid.Columns[i];
if (column.ShowHeader)
{
ColumnCount++;
DataControlFieldHeaderCell tc = new DataControlFieldHeaderCell(column);
tc.ApplyStyle(column.HeaderStyle);
column.InitializeCell(tc, DataControlCellType.Header, DataControlRowState.Normal, 0);
gvr.Cells.Add(tc);
}
}
maintable.Rows.AddAt(0, gvr);
}
if (IsCreateEmptyRow)
{
if (grid.EmptyDataText != string.Empty)
{
GridViewRow gvr = new GridViewRow(0, 0, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
gvr.ApplyStyle(grid.EmptyDataRowStyle);
TableCell tc = new TableCell();
tc.Text = grid.EmptyDataText;
tc.ColumnSpan = ColumnCount;
gvr.Cells.Add(tc);
maintable.Rows.Add(gvr);
}
}
}
这样在要调用的界面中gridview的PreRender事件中调用该方法就可以了,而且调用也很简单,直接将gridview控件名传进来即可。
总结:这种解决问题的思路则是从控件的内部机制中,不依赖于本身就千变万化的数据源,使用datatable对象和gridview对象的相互交互,巧妙的解决了问题,这种解决问题的思路和方法值得借鉴和学习。