需求是这样的,估计大家都会遇到这样的情况:
从数据库中所取得的值绑定在gridview中,有些值取出的是数值,而要把他变成文字。
比如说:
0 跟单员
1 为采购员
2 为审单员
3.为管理员
在gridview中,如果没有对值在业务层进行判断而直接绑定数据的话,就会出现值显示为数字,如图
大家可以看到在厂别及角色中所显示的都是数值,如何可以把他对应成我要的文字呢?
我首先在网上搜索了一下,大家都是采用了两种方法:
一种是:在数据库中做手脚,利用 Case..........When
CASE语句的两种格式:
语法格式为:
case <单值表达式>
when <表达式值> then <SQL语句或者返回值>
when <表达式值> then <SQL语句或者返回值>
...
when <表达式值> then <SQL语句或者返回值>
end
Example
SELECT
(CASE RoleValueID
WHEN 01 THEN '跟单员'
WHEN 02 THEN '采购员'
WHEN 03 THEN '审核员'
WHEN 04 THEN '管理员'
ELSE '非人类动物'
END) AS RoleName
FROM UserRole
这种方法很常用,对程序也不会造成很大影响,可是如果在程序上的实体层所对应构造函数的数据类型不是字符类型的话(一般往往可能是int),那这里就会出现数据类型不对应的问题。
另一种方法:
使用gridview中的模板配合gridview中的相关事件
<asp:Button ID= "Button2 " runat= "server " CommandArgument= ' <%# Eval( "id ") %> ' CommandName= "IsPass " Text= ' <%# Eval( "ispass ").ToString() == "1 " ? "已审 " : "未审 " %> '
/> //指定CommandArgument值为id
e.CommandArgument 就是获取当前点击按钮对应数据的ID,这里写在RowCommand()
(此代码来自于
tp://topic.csdn.net/u/20070527/19/ae100b46-13d2-47af-8908-93d8ec91f263.html)
第三种方法还可以用javascript来获取,这个方法我不会
而我现在用的方法是在RowDataBound事件中作动作,大家都知这个事件很好使,可以在这里作一下gridview的样式改变等,现在我是这样使用它的:
if (e.Row.RowType == DataControlRowType.DataRow)
{
switch (e.Row.Cells[3].Text.Trim())
{
case "0":
e.Row.Cells[3].Text = "跟单员";
break;
case "1":
e.Row.Cells[3].Text = "采购员";
break;
}
switch (e.Row.Cells[2].Text.Trim())
{
case "1":
e.Row.Cells[2].Text = "制造一厂";
break;
case "2":
e.Row.Cells[2].Text = "制造二厂";
break;
}
}
大家看一下对比一下结果:
运行后:
运行前:
这样就达到我想要的效果了,当然至于这个能不能运用于数据操作,我没试过(我这里只要表现层达到我想要的效果就可以了)
利用RowDataBound还可以改变gridview很多东西
1.实现字体颜色改变
前台用超链接列
<asp:HyperLinkField DataNavigateUrlFormatString="Detail.aspx" Text="点击查看">
</asp:HyperLinkField>
后台:
protected void gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
HyperLink hlf = (HyperLink)e.Row.Cells[1].Controls[0];
if (Convert.ToDateTime(gridview1.DataKeys[e.Row.RowIndex].Value.ToString()) > = DateTime.Now)
{
hlf.ForeColor= System.Drawing.Color.Red;// change color
}
}
}
2.判断特定条件,更改单元格背景颜色
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
...{ //数据加载时发生
if (e.Row.RowType == DataControlRowType.DataRow)
...{ //判断是否是数据行
if (e.Row.Cells[8].Text == "USA")
...{ //判断第9列值是否为"USA"
//e.Row.BackColor = System.Drawing.Color.Red;
e.Row.Cells[8].BackColor = System.Drawing.Color.Red;
}
}
}
3.父窗体中调用子窗体的gridview
在父窗体中调用子窗体的gridview值(简单的页面交互):
父窗体代码:
注:单机事件用window.open打开新窗体并获得焦点<head>
<script language=javascript>...
function openpage(htmlurl)
...{
var newwin=window.open(htmlurl,"newWin","toolbar=no,location=no,directories=no,status=no,scrollbars=yes,menubar=no,resizable=yes,top=100,left=200,width=650,height=300");
newwin.focus();
return false;
}
</script>
</head>
<body>
<input type=text id="name" />
在按钮中调用:
<input type=button value="调用" onclick="return openpage('GridViewClientClick.aspx');" />
</body>
子窗体代码:
注:girdview中e.Row.Attributes增加单击属性,ReKey并将此行第三列的值传过去 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
...{
if(e.Row.RowType==DataControlRowType.DataRow)
...{
e.Row.Attributes.Add("ondblclick", "ReKey('" + e.Row.Cells[2].Text+"')");
//e.Row.Attributes["style"] = "Cursor:hand";
// //键盘事件
//e.Row.Attributes.Add("OnKeyDown", "GridViewItemKeyDownEvent('" + e.Row.Cells[1].Text + "')");
}
}
(此代码来源于:http://blog.csdn.net/mingzhecode/archive/2007/10/08/1814546.aspx)
MSDN:
http://msdn2.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowdatabound(VS.80).aspx