基本上,一个Project中我们使用的控件风格都是一致的,比如DataGrid控件,他的页眉,页脚,行的字体颜色,交替行的背景色等等,我们不太可能每次使用这个控件都去设置一次这些属性,这绝对是一件很烦人的事。通常情况下我们会使用css来定义这些风格,然后再去分别定义DataGrid的ItemStyle,HeaderStyle等等的css属性,不过即便如此,几次这样的经历后,我还是觉得这实在是一件很烦人的事情,为什么不可以我不去设置这些风格属性,而他们每次都保持我所需要的风格呢?
通过继承标准DataGrid控件,可以来比较轻易的实现这个需求,我要做的就是读取某个xml文件或者config文件里面的样式设定(这种情况下一般不使用web.config文件,因为修改风格绝对是一件常见的事情,但是如果放入web.config中,每次修改web.config都引起应用程序重启,这可不太好.)
由于只涉及风格的显示,因此只需要重载OnPreRender
如下面类似的代码:
if(cache["TSDataGridConfig"] == null)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//只过滤Element节点,去掉其他节点,例如Comment
if(nodeList[i].NodeType == XmlNodeType.Element)
configTable.Add(nodeList[i].Name,nodeList[i].InnerText);
}
cache.Insert("TSDataGridConfig",configTable,new CacheDependency(configFilePath));
}
catch
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return;
}
}
![](/Images/OutliningIndicators/None.gif)
if(cache["TSDataGridConfig"] != null)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
if(cache["TSDataGridConfig"] != null)
{
}
![](/Images/OutliningIndicators/None.gif)
这段代码中作的就是从一个.config文件中读取了相关的配置节,并且存入Cache中,一旦修改了.config文件,则立即重新读取,接下来在if(cache["TSDataGridConfig"] != null){}块中要做的就是将对应的配置节点的值设置到DataGrid的相关属性,例如:
//AlternatingItem-BackColor
if(CheckItem(configList["AlternatingItem-BackColor"]))
base.AlternatingItemStyle.BackColor = Color.FromName((string)configList["AlternatingItem-BackColor"]);
//CheckItem主要是判断AlternatingItem-BackColor是不是null或者值是不是String.Empty,如果是,就不设置
![](/Images/OutliningIndicators/None.gif)
基本上我们已经可以使用这个控件来代替原来的标准DataGrid了,末了,还有一件比较浪费体力的事情,那就是DataGrid项的删除确认,因此可以继续在这里重载OnItemDataBound,类似代码如下:
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
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);
![](/Images/OutliningIndicators/None.gif)
这里,我将删除的LinkButton ID假定为lbtnDelete,当然可以公开成一个属性了,不过我比较懒,因为我们还可以继续在调用页重载这个事件,如果我们确实需要的话....这样只要调用页用来执行删除Command的LinkButton Id为lbtnDelete,将会自动触发删除确认,不需要我们每次都去重复编写这段代码了.
DataGrid风格配置节片断:
<TSDataGrid>
<!-- 交替项 -->
<!-- 交替项 -->
<AlternatingItem-BackColor>#F9FFED</AlternatingItem-BackColor>
<AlternatingItem-ForeColor></AlternatingItem-ForeColor>
![](/Images/OutliningIndicators/None.gif)
.
</TSDataGrid> 来自MMKK's blog :http://blog.joycode.com/mmkk/