为Project提供一个统一风格的DataGrid
基本上,一个Project中我们使用的控件风格都是一致的,比如DataGrid控件,他的页眉,页脚,行的字体颜色,交替行的背景色等等,我们不太可能每次使用这个控件都去设置一次这些属性,这绝对是一件很烦人的事。通常情况下我们会使用css来定义这些风格,然后再去分别定义DataGrid的ItemStyle,HeaderStyle等等的css属性,不过即便如此,几次这样的经历后,我还是觉得这实在是一件很烦人的事情,为什么不可以我不去设置这些风格属性,而他们每次都保持我所需要的风格呢?
通过继承标准DataGrid控件,可以来比较轻易的实现这个需求,我要做的就是读取某个xml文件或者config文件里面的样式设定(这种情况下一般不使用web.config文件,因为修改风格绝对是一件常见的事情,但是如果放入web.config中,每次修改web.config都引起应用程序重启,这可不太好.)
由于只涉及风格的显示,因此只需要重载OnPreRender
通过继承标准DataGrid控件,可以来比较轻易的实现这个需求,我要做的就是读取某个xml文件或者config文件里面的样式设定(这种情况下一般不使用web.config文件,因为修改风格绝对是一件常见的事情,但是如果放入web.config中,每次修改web.config都引起应用程序重启,这可不太好.)
由于只涉及风格的显示,因此只需要重载OnPreRender
如下面类似的代码:
if(cache["TSDataGridConfig"] == null)
{
try
{
string configFilePath = HttpContext.Current.Server.MapPath
(HttpContext.Current.Request.ApplicationPath) ;
configFilePath += "\\" + ConfigFilePath;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(configFilePath);
XmlNodeList nodeList = xmlDoc.SelectNodes("SiteConfig/TSDataGrid")[0].ChildNodes;
Hashtable configTable = Hashtable.Synchronized(new Hashtable());
for(int i = 0,j = nodeList.Count; i < j;i++)
{
//只过滤Element节点,去掉其他节点,例如Comment
if(nodeList[i].NodeType == XmlNodeType.Element)
configTable.Add(nodeList[i].Name,nodeList[i].InnerText);
}
cache.Insert("TSDataGridConfig",configTable,new CacheDependency(configFilePath));
}
catch
{
return;
}
}
if(cache["TSDataGridConfig"] != null)
{}
if(cache["TSDataGridConfig"] != null){}
{
try
{
string configFilePath = HttpContext.Current.Server.MapPath
(HttpContext.Current.Request.ApplicationPath) ;
configFilePath += "\\" + ConfigFilePath;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(configFilePath);
XmlNodeList nodeList = xmlDoc.SelectNodes("SiteConfig/TSDataGrid")[0].ChildNodes;
Hashtable configTable = Hashtable.Synchronized(new Hashtable());
for(int i = 0,j = nodeList.Count; i < j;i++)
{
//只过滤Element节点,去掉其他节点,例如Comment
if(nodeList[i].NodeType == XmlNodeType.Element)
configTable.Add(nodeList[i].Name,nodeList[i].InnerText);
}
cache.Insert("TSDataGridConfig",configTable,new CacheDependency(configFilePath));
}
catch
{
return;
}
}
if(cache["TSDataGridConfig"] != null)
{}
if(cache["TSDataGridConfig"] != null){}
//AlternatingItem-BackColor
if(CheckItem(configList["AlternatingItem-BackColor"]))
base.AlternatingItemStyle.BackColor = Color.FromName((string)configList["AlternatingItem-BackColor"]);
//CheckItem主要是判断AlternatingItem-BackColor是不是null或者值是不是String.Empty,如果是,就不设置
if(CheckItem(configList["AlternatingItem-BackColor"]))
base.AlternatingItemStyle.BackColor = Color.FromName((string)configList["AlternatingItem-BackColor"]);
//CheckItem主要是判断AlternatingItem-BackColor是不是null或者值是不是String.Empty,如果是,就不设置
基本上我们已经可以使用这个控件来代替原来的标准DataGrid了,末了,还有一件比较浪费体力的事情,那就是DataGrid项的删除确认,因此可以继续在这里重载OnItemDataBound,类似代码如下:
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
if((e.Item.FindControl("lbtnDelete") != null &&
e.Item.FindControl("lbtnDelete").GetType().ToString() == "System.Web.UI.WebControls.LinkButton"))
((LinkButton)e.Item.FindControl("lbtnDelete")).Attributes["onclick"] = "return confirm('即将删除指定项,确认?')";
}
base.OnItemDataBound(e);
{
if((e.Item.FindControl("lbtnDelete") != null &&
e.Item.FindControl("lbtnDelete").GetType().ToString() == "System.Web.UI.WebControls.LinkButton"))
((LinkButton)e.Item.FindControl("lbtnDelete")).Attributes["onclick"] = "return confirm('即将删除指定项,确认?')";
}
base.OnItemDataBound(e);
这里,我将删除的LinkButton ID假定为lbtnDelete,当然可以公开成一个属性了,不过我比较懒,因为我们还可以继续在调用页重载这个事件,如果我们确实需要的话....这样只要调用页用来执行删除Command的LinkButton Id为lbtnDelete,将会自动触发删除确认,不需要我们每次都去重复编写这段代码了.
DataGrid风格配置节片断:
<TSDataGrid>
<!-- 交替项 -->
<!-- 交替项 -->
<AlternatingItem-BackColor>#F9FFED</AlternatingItem-BackColor>
<AlternatingItem-ForeColor></AlternatingItem-ForeColor>
.
</TSDataGrid>
<!-- 交替项 -->
<!-- 交替项 -->
<AlternatingItem-BackColor>#F9FFED</AlternatingItem-BackColor>
<AlternatingItem-ForeColor></AlternatingItem-ForeColor>
.
</TSDataGrid>
posted on 2004-12-23 08:47 HelloSnoopy 阅读(443) 评论(0) 编辑 收藏 举报