8.2 格式化GridView

通常情况下,可以通过三种方式来对GridView控件进行格式化,使其呈现的数据更加标准,样式更加美观。

1)在BoundField列字段中使用DataFormatString属性来为显示的值指定自定义显示格式。如果未设置DataFormatString属性,则字段的值在显示时不使用任何特殊的格式设置。

2)可以通过事件的形式以编程的方法来格式化某些特定的数据。

3)使用样式特性来定义GridView控件的外观显示。

8.2.1 格式化字段

上面已经阐述过,每个BoundField列字段中都有一个DataFormatString属性,可以通过该属性来使用格式化字符串控制数值和日期的外观显示格式。通常,格式化字符串由一个占位符和格式指示器组成,它们被包含在一组花括号中。如下面的示例所示:


{0:C}


在上面的这个格式化字符串中,“0”代表要格式的值,字母“C”指示一个预定义的格式样式,这里“C”指的是货币格式。应用示例如下面的代码所示:


<asp:BoundField DataField="salary"

HeaderText="工资"

DataFormatString="{0:C}"/>


运行结果如图8-4所示。

figure_0308_0217

图 8-4 字段格式化示例运行结果

表8-3列出了常用的数值格式化字符串。

figure_0308_0218

表8-4列出了时间和日期格式化字符串。

figure_0308_0219

除此之外,对于日期的格式化字符串,还可以采取自定义的形式来设置。其中:

❑年:yyyy代表四位数的年,而yy代表两位数的年(取后两位)。

❑月:MM代表两位数的月,而M代表一位数的月。

❑日:dd代表两位数的日,而d代表一位数的日。

❑小时:HH代表两位数的小时,而H代表一位数的小时。

❑分钟:mm代表两位数的分钟,而m代表一位数的分钟。

❑秒:ss代表两位数的秒,而s代表一位数的秒。

例如,对于日期“2010-1-3 1:01:01”与“2010-10-30 23:10:11”,如果采用“{0:yy-M-d H:m:s}”字符串格式化,其结果分别为10-1-3 1:1:1与10-10-30 23:10:11;如果采用“{0:yyyy-MM-dd HH:mm:ss}”字符串格式化,其结果分别为2010-01-03 01:01:01与2010-10-30 23:10:11。

有了上面的自定义日期的格式化字符串形式之后,现在假设希望“工作日期”列按照如“2010年10月30日”这样的格式来显示,就可以设置列的DataFormatString属性。如下面的代码所示:


<asp:BoundField DataField="workdate"HeaderText="工作日期"

DataFormatString="{0:yyyy年MM月dd日}"/>


示例运行结果如图8-5所示。

figure_0309_0220

图 8-5 字段格式化示例运行结果

其实,格式化字符串并不只限于GridView控件使用。同时,它们还可以和其他控件一起使用,如可以把它们用于模板中的数据绑定表达式,也可以作为很多方法的参数。例如,Decimal与DateTime类型就暴露了它们自己的ToString()方法,该方法接受一个格式化字符串,从而允许手动格式化值。

8.2.2 格式化特定值

通过BoundField列字段中的DataFormatString属性可以格式化整个GridView控件列的值。但在实际开发环境中,有时需要根据相关条件来格式化相关列的值或者格式化某个特定行的值,又或者格式化某个特定行的某个单元的值。很显然,面对这些特殊要求,使用DataFormatString属性是不可能办到的。

这时,可以利用GridView的RowDataBound事件处理程序来实现上述要求。RowDataBound事件在GridView控件中将数据行绑定到数据时发生。可以利用GridViewRow类的相关属性来对GridView控件的当前行进行设置。

GridViewRow表示GridView控件中的单独行,其常用属性如表8-5所示。

figure_0309_0221

figure_0310_0222

下面的示例展示了如何使用GridView控件的RowDataBound事件对特定的列、行或者行单元进行格式化。如下面的代码所示:


<asp:GridView ID="GridView1"runat="server"

AutoGenerateColumns="False"

onrowdatabound="GridView1_RowDataBound"

Width="550px">

<Columns>

<asp:BoundField DataField="employeeid"HeaderText="编号"/>

<asp:BoundField DataField="employeename"HeaderText="姓名"/>

<asp:BoundField DataField="department"HeaderText="部门"/>

<asp:BoundField DataField="salary"HeaderText="工资"

DataFormatString="{0:C}"/>

</Columns>

</asp:GridView>


声明好GridView控件之后,就可以在protected void GridV iew1_RowDataBound(object sender, GridViewRowEventArgs e)事件里根据相关需求条件对特定的列、行或者行单元进行处理。

其中,如果“工资<3000”,就将该行的ForeColor属性设置为Red,“工资”单元格的字体的Size属性设置为13;如果“工资>6000”,就将该行的ForeColor属性设置为Green,“工资”单元格的字体的Size属性设置为16;其余情况将“工资”单元格的ForeColor属性设置为Blue。如下面的代码所示:


protected void Page_Load(object sender, EventArgs e)

{

if(!IsPostBack)

{

Bind();

}

}

private void Bind()

{

GridView1.DataSource=

DbHelper.Instance.CreateDataTable(CommandType.Text,

"select a.employeeid, a.employeename, a.department, b.salary

from employee a, salarybwhere a.employeeid=b.employeeid");

GridView1.DataBind();

}

protected void GridView1_RowDataBound(object sender,

GridViewRowEventArgs e)

{

if(e.Row.RowType==DataControlRowType.DataRow)

{

double salary=Convert.ToDouble

((DtaBinder.Eval(e.Row.DataItem,"salary"));

if(salary<3000)

{

e.Row.ForeColor=System.Drawing.Color.Red;

e.Row.Cells[3].Font.Size=13;

e.Row.ToolTip="工资低于3000";

}

else if(salary>6000)

{

e.Row.ForeColor=System.Drawing.Color.Green;

e.Row.Cells[3].Font.Size=16;

e.Row.ToolTip="工资高于6000";

}

else

{

e.Row.Cells[3].ForeColor=System.Drawing.Color.Blue;

e.Row.ToolTip="工资在3000与6000之间";

}

}

}


示例运行结果如图8-6所示。

figure_0311_0223

图 8-6 特定值格式化示例运行结果