惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
G
Google Developers Blog
B
Blog
Engineering at Meta
Engineering at Meta
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
The Cloudflare Blog
The Hacker News
The Hacker News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
雷峰网
雷峰网
F
Fortinet All Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
量子位
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
H
Help Net Security
Help Net Security
Help Net Security
P
Palo Alto Networks Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
W
WeLiveSecurity
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
Know Your Adversary
Know Your Adversary
Apple Machine Learning Research
Apple Machine Learning Research
Scott Helme
Scott Helme
N
News | PayPal Newsroom
AWS News Blog
AWS News Blog
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
腾讯CDC
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
TaoSecurity Blog
TaoSecurity Blog
GbyAI
GbyAI
Y
Y Combinator Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
Docker

博客园 - jierry

ASP.NET2.0控件一览---标准控件(2) ASP.NET2.0控件一览---标准控件(1) 控件开发时两种JS嵌入资源方式的使用 - jierry - 博客园 T-SQL tips(1)临时表和表变量 Flash Control for ASP.NET 2.0-Include Flash movies in your aspx pages 为DataGrid创建自定义列控件(四) 为DataGrid创建自定义列控件(三) - jierry - 博客园 为DataGrid创建自定义列控件(一) (转)SQLServer和Oracle的常用函数对比 《Effective C#》读书笔记(4) 《Effective C#》读书笔记(3) 《Effective C#》读书笔记(2) 《Effective C#》读书笔记(1) 选择合适的数据控件 自带图层的链接控件(DKLinks 1.0.0.323 ) 关于CodeBuild V3.0的一些想法 小工具:SQL存储过程解密修改工具 交叉表应用-成绩统计 现在提供第一版的存储过程生成器下载,欢迎大家试用
为DataGrid创建自定义列控件(二)
jierry · 2005-10-28 · via 博客园 - jierry

        通过上篇文章的学习,相信大家都对简单的自定义列控件比较熟悉了,在本节中将创建较为复杂的列控件,现在让我们开始吧。
相信大家肯定看到过这种情况,在评论的时候一些恶意的词语都会被**屏蔽掉,本节我们就来创建一个这样的审查的列控件CensorColumn。
在上篇文章的LimitColumn中,通过继承BoundColumn类,然后重写FormatDataValue方法,以达到格式字段内容的功能,本节的这个审查控件也可以通过这样的方法来做,如果大家感兴趣可以自己试试。在这里我们将采用另一种方法来作,通过继承DataGridColumn类来创建。
大家都知道BoundColumn类是继承自DataGridColumn类的,而BoundColumn类提供了DataField属性来显示数据源的字段,这次的CensorColumn类既然继承自DataGridColumn类,那我们也要创建DataField的这样一个属性来显示字段内容。

        代码如下:

private string m_DataFiled;
        
public string DataField
        
{
            
get
            
{
                
return this.m_DataFiled;
            }

            
set
            
{
                
this.m_DataFiled = value;
            }

        }

        

        光有属性还不够,无法把读取的数据源的字段显示出来,所以我们还需要把数据源的字段显示到Cell的Text上。这里我们就要用到TableCell的DataBinding事件。这个事件是当数据源绑定到控件上发生,就是说当数据源绑定到DataGrid上时激发TableCell的此事件。通过激发此事件,我们静态绑定数据源中指定的字段(通过刚才的DataField属性完成),就可以显示字段的内容了。
另外我们再来提下静态绑定,大家肯定都熟悉以下的语句:
DataBinder.Eval(Container.DataItem, "FieldName")
它是通过访问DataGridItem's DataItem属性来获取字段的内容,那我们怎样在自定义的事件方法中获得呢?首先我们从数据源中的单元格里获得DataGridItem:DataGridItem gridItem = cell.NamingContainer,
然后通过获得的DataGridItem获得DataItem:Object dataItem = gridItem.DataItem;这样我们就可以静态绑定数据了,代码如下:

public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType)
        
{
            
base.InitializeCell (cell, columnIndex, itemType);
            
if((itemType == ListItemType.AlternatingItem)||(itemType == ListItemType.SelectedItem)||(itemType == ListItemType.Item))
            
{
                cell.DataBinding 
+= new EventHandler(PerformDataBinding);
            }

        }


        
private void PerformDataBinding(object sender, System.EventArgs e)
        
{
            TableCell cell 
= (TableCell)sender;
            DataGridItem gridItem 
= (DataGridItem)cell.NamingContainer;
            Object dataItem 
= gridItem.DataItem;

            
if(!this.m_DataFiled.Equals(string.Empty))
            
{
                cell.Text 
= (string)DataBinder.Eval(dataItem, DataField);
            }

        }

        接下来我们要做的就是根据要限制的字符来过滤内容了,代码如下:

//检查文本
        private string m_CensorText;
        
public string CensorText
        
{
            
get
            
{
                
return this.m_CensorText;
            }

            
set
            
{
                
this.m_CensorText = value;
            }

        }


        
//替换文本
        private string m_CensoredText = "***";
        
public string CensoredText
        
{
            
get
            
{
                
return this.m_CensoredText;
            }

            
set
            
{
                
this.m_CensoredText = value;
            }

        }

                
private string PerformShip(string text)
        
{            if(m_CensorText.Equals(string.Empty))
            
{
                
return text;
            }

            
else 
            
{
                
return text.Replace(this.m_CensorText,this.m_CensoredText);        
            }
    
        }

        最后的完成代码为:

    public class CensorColumn :DataGridColumn
    
{
        
private string m_DataFiled;
        
public string DataField
        
{
            
get
            
{
                
return this.m_DataFiled;
            }

            
set
            
{
                
this.m_DataFiled = value;
            }

        }


        
//检查文本
        private string m_CensorText;
        
public string CensorText
        
{
            
get
            
{
                
return this.m_CensorText;
            }

            
set
            
{
                
this.m_CensorText = value;
            }

        }


        
//替换文本
        private string m_CensoredText = "***";
        
public string CensoredText
        
{
            
get
            
{
                
return this.m_CensoredText;
            }

            
set
            
{
                
this.m_CensoredText = value;
            }

        }



        
public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType)
        
{
            
base.InitializeCell (cell, columnIndex, itemType);
            
if((itemType == ListItemType.AlternatingItem)||(itemType == ListItemType.SelectedItem)||(itemType == ListItemType.Item))
            
{
                cell.DataBinding 
+= new EventHandler(PerformDataBinding);
            }

        }


        
private void PerformDataBinding(object sender, System.EventArgs e)
        
{
            TableCell cell 
= (TableCell)sender;
            DataGridItem gridItem 
= (DataGridItem)cell.NamingContainer;
            Object dataItem 
= gridItem.DataItem;

            
if(!this.m_DataFiled.Equals(string.Empty))
            
{
                cell.Text 
= PerformShip((string)DataBinder.Eval(dataItem, DataField));
            }

        }


        
private string PerformShip(string text)
        
{
            
if(m_CensorText.Equals(string.Empty))
            
{
                
return text;
            }

            
else 
            
{
                
return text.Replace(this.m_CensorText,this.m_CensoredText);        
            }
    
        }


    }

                在DataGrid中加入列控件:

<Columns>
                              
<custcols:CensorColumn CensorText="wit" DataField="ShipCountry"></custcols:CensorColumn>
                        
</Columns>

          效果图:

        通过本节大家对于自定义控件肯定有了更进一步的了解,在下一篇中我们将扩展本节的审查列控件,以达到多个单词的验证功能。