[*] Hello Snoopy

.NET and Flash Blog
为Project提供一个统一风格的DataGrid
基本上,一个Project中我们使用的控件风格都是一致的,比如DataGrid控件,他的页眉,页脚,行的字体颜色,交替行的背景色等等,我们不太可能每次使用这个控件都去设置一次这些属性,这绝对是一件很烦人的事。通常情况下我们会使用css来定义这些风格,然后再去分别定义DataGrid的ItemStyle,HeaderStyle等等的css属性,不过即便如此,几次这样的经历后,我还是觉得这实在是一件很烦人的事情,为什么不可以我不去设置这些风格属性,而他们每次都保持我所需要的风格呢?
通过继承标准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){}
这段代码中作的就是从一个.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,如果是,就不设置 
 

基本上我们已经可以使用这个控件来代替原来的标准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);

这里,我将删除的LinkButton ID假定为lbtnDelete,当然可以公开成一个属性了,不过我比较懒,因为我们还可以继续在调用页重载这个事件,如果我们确实需要的话....这样只要调用页用来执行删除Command的LinkButton Id为lbtnDelete,将会自动触发删除确认,不需要我们每次都去重复编写这段代码了.

DataGrid风格配置节片断:

 
<TSDataGrid>
<!-- 交替项 -->
  
<!-- 交替项 -->
  
<AlternatingItem-BackColor>#F9FFED</AlternatingItem-BackColor>
  
<AlternatingItem-ForeColor></AlternatingItem-ForeColor>
.
</TSDataGrid>
来自MMKK's blog :http://blog.joycode.com/mmkk/

posted on 2004-12-23 08:47  HelloSnoopy  阅读(440)  评论(0编辑  收藏  举报