ASP.NET中DataGrid控件应用技巧简述

ASP.NET中DataGrid控件应用技巧简述,第1张

  一.概述

 运用ASP NET开发Web应用程序过程中 DataGrid是一个非常重要的控件 几乎任何和数据相关的表现都要用到该控件 所以熟练掌握DataGrid控件的应用技巧是每个Web开发人员所必备的基本能力

 DataGrid控件能以表格的方式显示数据源中的数据 并提供了诸如分页 排序以及过滤等一些强大的内置功能 所以它能大大简化Web应用程序的开发过程 同时 开发者还可以通过运用各种不同的数据绑定列来自定义DataGrid控件显示数据的方式 这样就大大增强了DataGrid控件的功能 本文我就将向大家介绍如何运用其中的TemplateColumn EditCommandColumn HyperlinkColumn ButtonColumn以及BoundColumn等来自定义DataGrid控件显示数据的方式

 二.BoundColumn数据列的应用

 一般地 我们运用DataGrid控件开发数据驱动的Web应用程序时会以一行显示数据源中的某一条记录 而其中的一列则显示某个特定的字段值 DataGrid控件本身为我们提供了强大的功能 所以我们只需要以很少的代码便可以实现数据的显示功能 不过 这样也带来了一个问题 那就是我们如何来个性化显示数据的方式呢?显然DataList控件和Repeater控件在这个方面要强于DataGrid控件 不过如果我们放弃了DataGrid控件也就相当于放弃了其具有的强大功能 那么 我们如何运用DataGrid控件也来实现数据显示的自定义功能呢?首先 我们得把DataGrid控件根据数据源自动产生数据绑定列的功能关掉 方法很简单 就是将其AutoGenerateColumns属性设置为False即可 下面是这种方法的一个示例

<asp:DataGrid runat= server id= myDataGrid AutoGenerateColumns= False ></asp:DataGrid>

 一旦其AutoGenerateColumns属性为False值 我们就得编程实现数据列的绑定了 在绑定数据列过程中 我们可以运用上面介绍的五中数据列中的任何一种 不过任何数据列都必须在<Columns></Columns>标记内被定义 这个标记能表明被定义的对象是一种数据列

 下面我们首先来介绍BoundColumn数据列的应用 通过运用BoundColumn数据列 我们能根据自己的需求来动态地将数据源中的数据绑定到特定的数据列上并修改数据列的外观 比如我们可以更改各个列显示的次序 使DataGrid控件只显示某些字段的值而非全部字段的值 更改数据列的标题等等 BoundColumn数据列能设定DataField DataFormatString FooterText HeaderText HeaderImageUrl以及SortField等属性 而正是这些使得DataGrid控件的外观变得千变万化 多姿多彩

 下面 我们来建立一个示例性的Web应用程序项目 该项目运用到了DataGrid控件 并且显示了如何在其中运用BoundColumn数据列来自定义数据的显示方式 下面是本项目的主要文件以及其代码后置文件的内容

 WebForm aspx

<%@ Page language= c# Codebehind= WebForm aspx cs AutoEventWireup= false Inherits= DataGridTemplates WebForm %><!DOCTYPE HTML PUBLIC //W C//DTD HTML Transitional//EN ><HTML><HEAD><title>WebForm </title><meta name= GENERATOR Content= Microsoft Visual Studio ><meta name= CODE_LANGUAGE Content= C# ><meta name= vs_defaultClientScript content= JavaScript ><meta name= vs_targetSchema content= //schemas microsoft /intellisense/ie ></HEAD><body><form id= Form method= post runat= server ><asp:DataGrid runat= server id= myDataGrid AutoGenerateColumns= False BorderWidth= px Font Names= Verdana Arial sans serif Font Size= px BorderColor= # GridLines= Horizontal CellPadding= ><AlternatingItemStyle BackColor= #E E E ></AlternatingItemStyle><HeaderStyle Font Bold= True ForeColor= White BackColor= Teal ></HeaderStyle><Columns><asp:BoundColumn DataField= CustomerID HeaderText= ID ></asp:BoundColumn><asp:BoundColumn DataField= CompanyName HeaderText= Company Name ></asp:BoundColumn><asp:BoundColumn DataField= ContactName HeaderText= Contact Name ></asp:BoundColumn><asp:BoundColumn DataField= Address HeaderText= Address ></asp:BoundColumn><asp:BoundColumn DataField= City HeaderText= City ></asp:BoundColumn><asp:BoundColumn DataField= Region HeaderText= Region ></asp:BoundColumn><asp:BoundColumn DataField= PostalCode HeaderText= Postal Code ><HeaderStyle Wrap= False ></HeaderStyle></asp:BoundColumn></Columns></asp:DataGrid></form></body></HTML>

WebForm aspx cs using System;using System Collections;using System ComponentModel;using System Data;using System Data SqlClient;using System Drawing;using System Web;using System Web SessionState;using System Web UI;using System Web UI WebControls;using System Web UI HtmlControls;

namespace DataGridTemplates{/// <summary>/// WebForm 的摘要说明 /// </summary>public class WebForm : System Web UI Page{protected System Web UI WebControls DataGrid myDataGrid;

private void Page_Load(object sender System EventArgs e){// 在此处放置用户代码以初始化页面if( !Page IsPostBack )BindData();}

private void BindData(){SqlConnection con = new SqlConnection( server=localhost;database=Northwind;integrated security=true; );SqlCommand cmd = new SqlCommand( SELECT FROM Customers con );

try{con Open();myDataGrid DataSource = cmd ExecuteReader();myDataGrid DataBind();con Close();}catch( Exception ) {}if( con != null && con State == ConnectionState Open )con Close();}

#region Web Form Designer generated codeoverride protected void OnInit(EventArgs e){//// CODEGEN 该调用是 ASP NET Web 窗体设计器所必需的 //InitializeComponent();base OnInit(e);}

/// <summary>/// 设计器支持所需的方法 不要使用代码编辑器修改/// 此方法的内容 /// </summary>private void InitializeComponent(){ this Load += new System EventHandler(this Page_Load);}#endregion}}

 项目创建完毕 在浏览器中运行的效果如图 所示

图 DataGrid控件中运用BoundColumn数据列显示数据的效果

  三.HyperlinkColumn数据列以及ButtonColumn数据列的应用

 上面我向大家介绍了BoundColumn数据列的应用 而其它的两种数据列 HyperlinkColumn数据列以及ButtonColumn数据列的应用方式与之相差无几

 HyperlinkColumn数据列包含了DataTextField属性以及DataNavigateUrlField属性等 前者可以用于指定要显示的文本内容 而后者则用于指定超链接 同时HyperlinkColumn数据列还包含了一个可用于指定文本显示格式的DataNavigateUrlFormatString属性

 像HyperlinkColumn数据列那样ButtonColumn数据列也提供了DataTextField属性以及DataTextFormatString属性 同时它还提供了一个CommandName属性 该属性能指定按钮被点击时服务器端的响应动作 而此时DataGrid控件的OnItemCommand属性必须指向一个相应的方法 该方法在按钮被点击时会自动被调用 DataGrid控件中的一行可以包含多个ButtonColumn数据列 每个数据列中的按钮消息响应函数都是OnItemCommand属性所对应的方法 而不同的按钮是根据其CommandName属性来区分函数所应执行的不同部分的 ButtonColumn数据列还提供了一个ButtonType属性以指定按钮的外观 该属性包括两种可取值 LinkButton(默认)和PushButton

 下面我们在原来解决方案的基础上再添加一个新的Web应用程序项目 并在其中运用DataGrid控件的BoundColumn数据列 HyperlinkColumn数据列以及ButtonColumn数据列 下面是本项目的主要文件以及其代码后置文件的内容

 WebForm aspx

<%@ Page language= c# Codebehind= WebForm aspx cs AutoEventWireup= false Inherits= DataGridTemplates WebForm %><!DOCTYPE HTML PUBLIC //W C//DTD HTML Transitional//EN ><HTML><HEAD><title>WebForm </title><meta name= GENERATOR Content= Microsoft Visual Studio ><meta name= CODE_LANGUAGE Content= C# ><meta name= vs_defaultClientScript content= JavaScript ><meta name= vs_targetSchema content= //schemas microsoft /intellisense/ie ></HEAD><body MS_POSITIONING= FlowLayout ><form id= Form method= post runat= server ><asp:DataGrid id= myDataGrid runat= server HeaderStyle Font Bold= True Cellpadding= BorderWidth= px AutoGenerateColumns= False GridLines= Horizontal Font Names= Verdana Arial sans serif Font Size= px BorderStyle= Solid ><AlternatingItemStyle BackColor= #EFEFEF ></AlternatingItemStyle><ItemStyle Font Size= X Small ></ItemStyle><HeaderStyle Font Bold= True ForeColor= White BackColor= Teal ></HeaderStyle><Columns><asp:BoundColumn DataField= CustomerID HeaderText= ID ></asp:BoundColumn><asp:HyperLinkColumn DataNavigateUrlField= Url DataTextField= CompanyName HeaderText= Comapny Name ></asp:HyperLinkColumn><asp:ButtonColumn Text= Get Details ButtonType= PushButton CommandName= GetDetails ></asp:ButtonColumn></Columns></asp:DataGrid></form></body></HTML>

WebForm aspx cs using System;using System Collections;using System ComponentModel;using System Data;using System Data SqlClient;using System Drawing;using System Web;using System Web SessionState;using System Web UI;using System Web UI WebControls;using System Web UI HtmlControls;

namespace DataGridTemplates {/// <summary>/// WebForm 的摘要说明 /// </summary>public class WebForm : System Web UI Page{protected System Web UI WebControls DataGrid myDataGrid;

private void Page_Load(object sender System EventArgs e){// 在此处放置用户代码以初始化页面if( !Page IsPostBack )BindData();}

private void BindData(){SqlConnection con = new SqlConnection( server=localhost;integrated security=true;database=Northwind );SqlCommand cmd = new SqlCommand( SELECT // + CustomerID + As Url FROM Customers con );try{con Open();myDataGrid DataSource = cmd ExecuteReader();myDataGrid DataBind();con Close();}catch( Exception ) {}if( con != null && con State == ConnectionState Open )con Close();}

#region Web Form Designer generated codeoverride protected void OnInit(EventArgs e){//// CODEGEN 该调用是 ASP NET Web 窗体设计器所必需的 //InitializeComponent();base OnInit(e);}

/// <summary>/// 设计器支持所需的方法 不要使用代码编辑器修改/// 此方法的内容 /// </summary>private void InitializeComponent(){ this myDataGrid ItemCommand += new System Web UI WebControls DataGridCommandEventHandler(this myDataGrid_ItemCommand);this Load += new System EventHandler(this Page_Load);}#endregion

private void myDataGrid_ItemCommand(object source System Web UI WebControls DataGridCommandEventArgs e){if( e CommandName == GetDetails )Response Redirect( WebForm aspxid= + e Item Cells[ ] Text );}}}

 项目创建完毕 在浏览器中运行的效果如图 所示

图 DataGrid控件中运用HyperlinkColumn以及ButtonColumn数据列显示数据的效果

  四.TemplateColumn数据列的应用

 DataGrid控件中的TemplateColumn数据列可以说是功能极其强大的 灵活地运用它就能使得DataGrid控件显示数据的方式变得多种多样 TemplateColumn数据列主要为我们提供了以下四种数据列模板

 ·HeaderTemplate ·ItemTemplate ·EditItemTemplate ·FooterTemplate

 其中HeaderTemplate是用于显示DataGrid控件的首行中的文本 或是绑定数据的 FooterTemplate的功能与HeaderTemplate的功能类似 不过它是用于显示尾行中的内容的 EditItemTemplate是应用于具有编辑功能的数据列的 任何运用了该模板的数据列的数据能被用户编辑并在适当时候更新到数据源中

 ItemTemplate允许你建立具有完全自定义数据显示方式的数据列 通过运用<%# Container DataItem( [FieldName] ) %>或<%# DataBinder Eval(Container DataItem [FieldName] { :[FormatString]} ) %>两种数据绑定语法你就可以将数据源中的某列数据绑定到相应的数据列中并赋予完全自定义的显示方式

 下面我们在第三步中建立的Web应用程序中添加一个新的Web页面-WebForm 该页面能显示公司的详细信息 也就是在图 中的按钮被点击时浏览器会导向到的页面 它能根据用户的选择显示相应公司的详细信息 方法就是判断Request QueryString内的信息 如果其中包含了一个 id 名/值对 则根据其中的值选择相对应的公司信息并显示在页面中 如果没有包含任何 id 值的信息则从数据表中选取所有公司的信息并显示在页面中 同时还要指出的是 在一个DataGrid控件中你可以将多种类型的数据列结合起来一起使用 并根据不同的需要选择合适的数据列显示相应的数据 下面是本页面的HTML文件以及其代码后置文件的内容

 WebForm aspx

<%@ Page language= c# Codebehind= WebForm aspx cs AutoEventWireup= false Inherits= DataGridTemplates WebForm %><!DOCTYPE HTML PUBLIC //W C//DTD HTML Transitional//EN ><HTML><HEAD><title>WebForm </title><meta name= GENERATOR Content= Microsoft Visual Studio ><meta name= CODE_LANGUAGE Content= C# ><meta name= vs_defaultClientScript content= JavaScript ><meta name= vs_targetSchema content= //schemas microsoft /intellisense/ie ></HEAD><body MS_POSITIONING= FlowLayout ><form id= Form method= post runat= server ><asp:datagrid id= myDataGrid runat= server ItemStyle Font Size= x all HeaderStyle Font Bold= True HeaderStyle Font Size= x all AlternatingItemStyle BackColor= #EFEFEF Cellpadding= BorderWidth= AutoGenerateColumns= False BorderStyle= Solid GridLines= Horizontal BorderColor= # Font Names= Verdana Arial sans serif Font Size= px ><AlternatingItemStyle BackColor= #E E E ></AlternatingItemStyle><ItemStyle Font Size= X Small ></ItemStyle><HeaderStyle Font Size= X Small Font Bold= True ForeColor= White BackColor= Teal ></HeaderStyle><Columns><asp:TemplateColumn><HeaderTemplate><b>Company Detail</b></HeaderTemplate><ItemTemplate><table border= Cellpadding= Cellspacing= Width= % style= FONT SIZE: px; FONT FAMILY: Verdana Arial sans serif ><tr><td colspan= ><b><%# DataBinder Eval( Container DataItem CompanyName ) %></b></td></tr><tr><td width= % valign= top ><b>Contact:</b></td><td width= % valign= top nowrap><%# DataBinder Eval( Container DataItem ContactName ) %></td><td width= % valign= top ><b>Phone:</b></td><td width= % valign= top nowrap><%# DataBinder Eval( Container DataItem Phone ) %></td></tr><tr><td width= % valign= top ><b>Title:</b></td><td width= % valign= top ><%# DataBinder Eval( Container DataItem ContactTitle ) %></td><td width= % valign= top ><b>Fax:</b></td><td width= % valign= top nowrap><%# DataBinder Eval( Container DataItem Fax ) %></td></tr><tr><td width= % valign= top ><b>Address:</b></td><td width= % valign= top colspan= ><%# DataBinder Eval( Container DataItem Address ) %><br><%# DataBinder Eval( Container DataItem City ) %> <%# DataBinder Eval( Container DataItem Region ) %><%# DataBinder Eval( Container DataItem PostalCode ) %><br><%# DataBinder Eval( Container DataItem Country ) %></td></tr></table></ItemTemplate></asp:TemplateColumn></Columns></asp:datagrid></form></body></HTML>

WebForm aspx cs using System;using System Collections;using System ComponentModel;using System Data;using System Data SqlClient;using System Drawing;using System Web;using System Web SessionState;using System Web UI;using System Web UI WebControls;using System Web UI HtmlControls;

namespace DataGridTemplates {/// <summary>/// WebForm 的摘要说明 /// </summary>public class WebForm : System Web UI Page{protected System Web UI WebControls DataGrid myDataGrid;

private void Page_Load(object sender System EventArgs e){// 在此处放置用户代码以初始化页面if( !Page IsPostBack )BindData();}

private void BindData(){DataSet ds = new DataSet();SqlDataAdapter da;String strSQL;

if( Request QueryString[ id ] == null )strSQL = SELECT FROM Customers ;elsestrSQL = SELECT FROM Customers WHERE CustomerID = + Request QueryString[ id ] ToString() + ;

da = new SqlDataAdapter( strSQL server=localhost;integrated security=true;database=Northwind );da Fill( ds Customers );myDataGrid DataSource = ds Tables[ Customers ] DefaultView;myDataGrid DataBind();}

#region Web Form Designer generated codeoverride protected void OnInit(EventArgs e){//// CODEGEN 该调用是 ASP NET Web 窗体设计器所必需的 //InitializeComponent();base OnInit(e);}

/// <summary>/// 设计器支持所需的方法 不要使用代码编辑器修改/// 此方法的内容 /// </summary>private void InitializeComponent(){ this Load += new System EventHandler(this Page_Load);}#endregion}}

 新页面创建完毕 在浏览器中运行的效果如图 所示

图 DataGrid控件中运用TemplateColumn数据列显示数据的效果

  五.总结

lishixinzhi/Article/program/net/201311/15737

  一 概述

 考虑一下这种情形 你为一个Web网站写了一个应用程序 它的功能是接受用户的输入并将输入内容永久保存 例如保存到数据库 另外还要在网站上显示出用户输入的内容 例如论坛就是一个很典型的例子

 如果用户来源很杂 必须考虑如何防止用户提交和张贴攻击性(或者色情的 庸俗的)的内容 可能的解决方案包括

 ⑴ 将用户群限制到一个封闭的用户团体 即要求用户使用程序功能之前必须先注册/登录 这样 由于每次提交的内容都可以追查到提交者 用户破坏网站规则的可能性就小了很多 如果有用户做出了不应该做的事 你就可以核实用户身份 予以相应的处理

 ⑵ 在网站上发布用户提交的内容之前 先由管理员审阅 很多时候 由于人力资源有限 这个办法不一定行得通

 ⑶ 禁止用户提交攻击性内容 这是最理想的解决办法 把问题解决在起源 但具体应该怎么实现呢?

 本文介绍的方案以一个复合控件为基础 利用一个XML文件来定义攻击性词语 我们将用VB NET编写这个复合控件 用普通的文本编辑器和命令行编译器(vbc)完成整个工程的构建

 在正式编写控件之前 首先我们来简单地回顾一下ASP NET中控件的概念 本文出现的所有控件都是服务器控件 它们在服务器上运行 将HTML代码发送到客户端 要理解控件的分类 可以从控件是否嵌入到Web表单页面(因而采用按需编译方式)或预先编译的角度来观察 微软定义了下列ASP NET服务器控件 HTML服务器控件 Web服务器控件 验证控件 用户控件

 前三种控件读者应该已经比较熟悉了 对于开发者来说 它们是最简单的控件类型 在ASP NET中已经由微软为我们编写好 用户控件则有所不同 用户控件是 包装 成 ascx页面形式的 aspx页面 其他 aspx页面可以通过注册和实例化来调用用户控件的功能 这是一种被寄予厚望的服务器端控件 对于ASP/ASP NET开发者来说 它代表着一大进步 特别地 现在编写控件的语言已经全面支持面向对象技术

 ASP NET用户控件由一个或多个服务器控件 静态HTML元素构成 可以包含额外的代码 每个用户控件封装一组特定的功能 用户控件可以通过简单地扩展现有服务器控件(控件组)得到 例如 带有旋转功能的图形控件 在文本框中保存日期的日历控件

  二 开发复合控件

 控件要检查用户提交的内容是否包含 攻击性 词语 攻击性词语由一个XML文件定义 XML文件的结构如下

<xml version= encoding= GB ><words><word>词语一</word><word>词语二</word></words>

 本文的复合控件(Composite)包含三个ASP NET服务器控件 一个Textbox控件 一个Label控件 还有一个Button控件 当用户点击Button控件 Composite检查用户提交的文本是否包含了XML文件中指定的词语(XML文件的默认名字是bad_words xml 通过一个自定义属性定义) 并抛出一个自定义事件 另外 Composite控件还将它的Label子控件的一个Text属性显露成顶级属性

 复合控件可以有选择地将子控件显露成属性 或者有选择地将子控件的属性和事件作为顶级属性和事件显露出来 当复合控件整合来自子控件的属性时 它通常只是简单地委托子控件执行操作 如下面的例子所示

// 将操作委托给标签对象 标签对象是一个// System Web UI WebControls Label的实例Public Property Text() As StringGetEnsureChildControls()Return label TextEnd GetSetEnsureChildControls()label Text = valueEnd SetEnd Property

 我们需要一个文本输入框让用户输入内容 一个按钮来提交表单 还要一个向用户反馈信息的文本标签 下面我们来看看Web表单的代码 复合控件就是在这里实例化的

posite aspx

<%@ page language= vb debug= false trace= false %><%@ Register TagPrefix= Custom Namespace= CustomControls Assembly = CustomControls %><><script language= VB runat=server>Private Sub CheckText(sender As Object e As CheckEventArgs)If e Match = false ThenComposite Text = <h >发布内容请遵守本站规则!不得发布攻击性言辞!</h > ElseComposite Text = 你提交的内容已通过检查! End IfEnd Sub </script>

<body>

<h >语言净化控件实例</h ><br><form runat=server><Custom:Composite id = Composite OnCheck = CheckText filename = bad_words xml runat = server/></form></body></> 

 上面的代码首先注册指定的复合控件 我们将把控件的代码编译成一个 dll文件 放入应用的bin目录 这是ASP NET首先搜索的位置 在Web表单构成的用户界面中 我们实例化了自定义控件 同时指定了

 ⑴ 当控件抛出OnCheck事件 执行一个本地的子过程CheckText 我们把复合控件的标签的文本通过一个公用属性显露出来 标签的内容由OnCheck事件句柄设置的另一个公用属性决定

 ⑵ 定义攻击性词语的XML文件的名字

 ⑶ 另外 我们还定义了一个由复合控件调用的CheckText子过程

 现在来看复合控件本身 复合控件有两个类 用两个独立的VB源文件实现 分别是posite vb和checkevent vb

posite vb

Imports SystemImports System WebImports System Web UIImports System Web UI WebControlsImports System XmlImports System Collections

Namespace CustomControlsPublic Class CompositeInherits ControlImplements INamingContainerPrivate _filename As String = bad_words xml Private label As LabelPrivate box As TextBox

Public Property filename() As StringGetReturn _filenameEnd GetSet_filename = valueEnd SetEnd Property

以用户提交的文本内容为输入参数 如果用户提交的内容包含攻击性言辞 则返回修改后的版本 否则 直接返回原始的文本 Public Function CheckString(InputString as String) as stringDim alWordList As new ArrayListdim xmlDocPath as string = mappathsecure( bad_words xml )dim xmlReader as XmlTextreader = new xmlTextReader(xmlDocPath)dim element as stringdim output as stringdim asterisks as string =

将定义攻击性言辞的xml文件内容读入到一个ArrayLishile (xmlReader Read())if xmlReader NodeType=xmlNodeType Text thenalWordList Add(xmlReader Value)end ifend whilexmlReader Close()

检查用户提交的文本内容 将攻击性言辞替换为适当数量的星号For Each element in alWordListInputString=InputString Replace(element asterisks substring( (element length)))Next

Return InputString

End Function

Public Property Text() As StringGet 该方法首先检查ChildControlsCreated属性的当前值 如果该值是false 则调用CreateChildControls方法EnsureChildControls()Return label TextEnd GetSetEnsureChildControls()label Text = valueEnd SetEnd Property

Public Event Check As CheckEventHandler

Protected Overridable Sub OnCheck(ce As CheckEventArgs)RaiseEvent Check(Me ce)End Sub

创建Composite控件的子控件Protected Overrides Sub CreateChildControls()

Controls Add(New LiteralControl( <h >请在下面输入文字内容: ))

文本输入框Dim box As New Textbox()box Text = Controls Add(box )

Controls Add(New LiteralControl( </h > ))

按钮Dim button As New Button()button Text = 提交 Controls Add(New LiteralControl( <br> ))Controls Add(button )

将一个事件句柄加入新创建的按钮对象AddHandler button Click AddressOf Me ButtonClicked

Controls Add(New LiteralControl( <br><br> ))label = New Label()label Height = Unit Pixel( )label Width = Unit Pixel( )label Text = Controls Add(label)End Sub

Protected Overrides Sub OnPreRender(e As EventArgs)CType(Controls( ) TextBox) Text = End Sub

Private Sub ButtonClicked(sender As [Object] e As EventArgs)OnCheck(New CheckEventArgs(CType(Controls( ) TextBox) Text CheckString(CType(Controls( ) TextBox) Text)))End SubEnd ClassEnd Namespace

 上面代码的主要任务是

 ⑴ 首先导入必要的名称空间 声明当前类所属的名称空间

 ⑵ 接下来定义Composite的主体 Composite从最基本的Control类继承 另外还要实现INamingContainer接口 INamingContainer接口允许Composite控件将事件转发到它的Button子控件

 ⑶ 用CreateChildControls方法(而不是OnInit或构造函数)创建子控件

 ⑷ Composite控件没有显露出Button子控件的Click事件 相反 它处理了Click事件 并抛出自定义事件Check

 ⑸ Composite控件显露了下列公用属性 Text 即Label子控件的Text属性值 FileName 允许获取和设置定义攻击性词语的XML文件的名字

 ⑹ 主要的检查功能由CheckString方法实现 它的输入参数是一个文本字符串 CheckString方法从XML文件读取禁用的词语 放入一个数组列表(ArrayList) 然后检查指定的字符串是否包含禁用的词语 所有 攻击性 的词语将被适当数量的 替代

 ⑺ OnPreRender清除文本框子控件的文本

 ⑻ 当用户点击按钮 ButtonClicked开始执行 ButtonClicked调用onCheck子过程 传入适当的参数(一个新建的CheckEventArgs对象 创建CheckEventArgs对象的参数是检查前和检查后的文本) OnCheck随后触发一个事件 该事件将由 aspx页面中的代码处理

CheckEvent vb

包含定制事件数据类CheckEventArgs的代码 另外还定义了Check事件的事件句柄Imports SystemNamespace CustomControlsPublic Class CheckEventArgsInherits EventArgsPrivate _match As Boolean = False

Public Sub New(string As String string as String)If string =string Then_match = TrueEnd IfEnd Sub

Public ReadOnly Property Match() As BooleanGetReturn _matchEnd GetEnd PropertyEnd Class

Public Delegate Sub CheckEventHandler(sender As Object ce As CheckEventArgs)End Namespace

 CheckEventArgs的构造函数是两个字符串 根据字符串的值设置相应的匹配标记_match 另外 上面的代码还定义了CheckEventHandler事件句柄

 编写好上面的代码后 如果你没有安装IDE 用下面的命令执行编译即可

lishixinzhi/Article/program/net/201311/15751

1打开VS2008-新建一个工程-选译ASP。NET服务器控件

2自动生成一个文件,打代码拷进去,调试好程序

3点击“生成菜单-生成XX”

4到 工程目录\bin\Debug 找到dll文件把它拷到一个固定目录里如:DotNet_DLL里

============附带一个我重写Repeater的代码===================

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemLinq;

using SystemText;

using SystemWeb;

using SystemWebUI;

using SystemWebUIWebControls;

using SystemData;

using SystemDataSqlClient;

using SystemDataOleDb;

namespace lwf_MVClwf_Controls

{

[DefaultProperty("pageIndex")]

[ToolboxData("<!--Repeater Begin --><{0}:Repeater ID=\"Rep_list\" runat=\"server\" EnableViewState=\"false\" DisplayPageing=\"Always\"> <ItemTemplate> </ItemTemplate> </{0}:Repeater><!--Repeater End -->")]

public class Repeater : SystemWebUIWebControlsRepeater

{

private int _recordcount = 0;

private int _pageSize = 0;

private int _pageIndex = 1;

private string _PID = "";

private string _CssClass = "CssPage"; //输出数据流时设一个样式给它样式名为CssPage

private object _DataSourceList;

private PagedDataSource _pds = new PagedDataSource();

//public bool _DisplayPageing;

public MyEnum _DisplayPageing;

private MyEnumLanguage _Language;

//构造函数

public Repeater()

{

}

#region ____________控件属性:RecordCount、pageSize、pageIndex、PID、CssClass、DataSource1____________

[Bindable(true)]

[Category("data")]

[DefaultValue("1")]

[Localizable(true)]

[Description("记录总数")]

public int RecordCount

{

get

{

return _recordcount;

}

set

{

_recordcount = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("15")]

[Localizable(true)]

[Description("单页记录数")]

public int pageSize

{

get

{

return _pageSize;

}

set

{

_pageSize = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("1")]

[Localizable(true)]

[Description("当前页码")]

public int pageIndex

{

get

{

return _pageIndex;

}

set

{

_pageIndex = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("")]

[Localizable(true)]

[Description("其它参数传递")]

public string PID

{

get

{

return _PID;

}

set

{

_PID = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("CssPage")]

[Localizable(true)]

[Description("连接样式")]

public string CssClass

{

get

{

return _CssClass;

}

set

{

_CssClass = value;

}

}

[Bindable(true)]

[Category("data")]

[DefaultValue("")]

[Localizable(true)]

[Description("数据源,DataTable")]

public object DataSource1

{

get

{

return _pds;

}

set

{

switch (valueGetType()ToString())

{

case "SystemDataDataTable":

_recordcount = ((DataTable)value)RowsCount;

_pdsDataSource = ((DataTable)value)DefaultView;

break;

case "SystemCollectionsGenericList`1[SystemObject]":

_recordcount = ((List<object>)value)Count;

_pdsDataSource = (List<object>)value;

break;

case "SystemDataSqlClientSqlDataReader":

DataTable i_dt = NormalConvertDataReaderToDataTable((SqlDataReader)value);

_recordcount = i_dtRowsCount;

_pdsDataSource = i_dtDefaultView;

break;

case "SystemDataSqlClientOleDbDataReader":

DataTable i_dtOle = NormalConvertDataReaderToDataTable((OleDbDataReader)value);

_recordcount = i_dtOleRowsCount;

_pdsDataSource = i_dtOleDefaultView;

break;

default:

_recordcount = ((DataTable)value)RowsCount;

_pdsDataSource = ((DataTable)value)DefaultView;

break;

}

_pdsAllowPaging = true;

_pdsPageSize = _pageSize;

_pdsCurrentPageIndex = this_pageIndex - 1;

baseDataSource = _pds;

}

}

public MyEnum DisplayPageing

{

get { return _DisplayPageing; }

set { _DisplayPageing = value; }

}

public enum MyEnum

{

Always = 1,

Auto = 2,

Never = 3

}

public MyEnumLanguage Language

{

get { return _Language; }

set { _Language = value; }

}

public enum MyEnumLanguage

{

Chinese = 1,

English = 2

}

#endregion

//外部使用

public string ThePage()

{

string retStr = "";

retStr = thisThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass);

return retStr;

}

//分页函数,为输出显示流提供HTML代码

/// <summary>

/// 分页函数

/// </summary>

/// <param name="i_RecordCount">总记录数</param>

/// <param name="i_pageSize">每页记录数</param>

/// <param name="i_pageIndex">当前页数</param>

/// <param name="i_PID">其它参数</param>

/// <param name="i_CssClass">连接样式</param>

/// <returns>HTML代码</returns>

public string ThePage(int i_RecordCount, int i_pagesize, int i_pageIndex, string i_PID, string i_CssClass)

{

int i_Pcount = 0;

int i_StartPageNum;

int i_EndPageNum;

string i_pagerString = "";

string i_pagerString_ENG = "";

i_pagerString = i_pagerString + "<style type=\"text/css\">\nCssPage {font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #333;text-decoration: none;}\naCssPage:hover{font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #ff0000;text-decoration: underline;}\n</style>\n";

i_pagerString_ENG = i_pagerString_ENG + "<style type=\"text/css\">\nCssPage {font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #333;text-decoration: none;}\naCssPage:hover{font-family: Arial, Helvetica, sans-serif;font-size: 12px;line-height: 25px;color: #ff0000;text-decoration: underline;}\n</style>\n";

if (i_pagesize != 0)

{

i_Pcount = (i_RecordCount / i_pagesize);

i_Pcount = ((i_RecordCount % i_pagesize) != 0 i_Pcount + 1 : i_Pcount);

i_Pcount = (i_Pcount == 0 1 : i_Pcount);

}

if (i_pageIndex <= 0) i_pageIndex = 1;

if (i_pageIndex > i_Pcount) i_pageIndex = i_Pcount;

i_StartPageNum = 1;

while (i_StartPageNum + 10 <= i_pageIndex)

{

i_StartPageNum = i_StartPageNum + 10;

}

i_EndPageNum = i_StartPageNum + 9;

if (i_EndPageNum > i_Pcount) i_EndPageNum = i_Pcount;

i_pagerString = i_pagerString + "<div class='" + i_CssClass + "' style='padding-left:20px;padding-right:20px'>共<b>" + i_Pcount + "</b>页 共有<b>" + i_RecordCount + "</b>记录 第<b>" + i_pageIndex + "</b>页 跳到第 [ ";

if (i_RecordCount <= ConvertToInt32((i_pageIndex) i_pagesize))

{

i_pagerString_ENG = i_pagerString_ENG + "<div class='" + i_CssClass + "' style='padding-left:20px;padding-right:20px;float:right'><div style='float:left;padding-right:60px'>Total " + i_RecordCount + " , " + ((i_pageIndex - 1) i_pagesize + 1) + "-" + i_RecordCount + " of " + i_RecordCount + " Records </div><div style='float:left;padding-left:60px'>";

}

else

{

i_pagerString_ENG = i_pagerString_ENG + "<div class='" + i_CssClass + "' style='padding-left:20px;padding-right:20px;float:right'><div style='float:left;padding-right:60px'>Total " + i_RecordCount + " , " + ((i_pageIndex - 1) i_pagesize + 1) + "-" + ((i_pageIndex) i_pagesize) + " of " + i_RecordCount + " Records </div><div style='float:left;padding-left:60px'>";

}

if (i_pageIndex != 1)

{

//i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> 首页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>上一页</a>";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> First</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>Prev</a> ";

}

i_pagerString_ENG = i_pagerString_ENG + " [ ";

if (i_StartPageNum > 1)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_StartPageNum - 1)ToString() + "' title='前十页'><font face='webdings'>7</font></a>";

i_pagerString_ENG = i_pagerString_ENG + " <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_StartPageNum - 1)ToString() + "' title='Prev Ten'><font face='webdings'>7</font></a>";

}

for (int i_i = i_StartPageNum; i_i <= i_EndPageNum; i_i++)

{

if (i_i != i_pageIndex)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_iToString() + "'>" + i_iToString() + "</a> ";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_iToString() + "'>" + i_iToString() + "</a> ";

}

else

{

i_pagerString = i_pagerString + "<b><font color=red>" + i_iToString() + "</font></b> ";

i_pagerString_ENG = i_pagerString_ENG + "<b><font color=red>" + i_iToString() + "</font></b> ";

}

}

if (i_EndPageNum < i_Pcount)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_EndPageNum + 1)ToString() + "' title='下十页'><font face='webdings'>8</font></a>";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_EndPageNum + 1)ToString() + "' title='Next Ten'><font face='webdings'>8</font></a>";

}

i_pagerString = i_pagerString + "] 页";

i_pagerString_ENG = i_pagerString_ENG + "] ";

if (i_pageIndex != 1)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> 首页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>上一页</a>";

//i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=1'> 首页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex - 1)ToString() + "'>上一页</a>";

}

if (i_Pcount != i_pageIndex)

{

i_pagerString = i_pagerString + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex + 1)ToString() + "'> 下一页</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_Pcount + "'>尾页</a>";

i_pagerString_ENG = i_pagerString_ENG + "<a class='" + i_CssClass + "' href='" + i_PID + "page=" + (i_pageIndex + 1)ToString() + "'> Next</a> <a class='" + i_CssClass + "' href='" + i_PID + "page=" + i_Pcount + "'>End</a>";

}

i_pagerString = i_pagerString + "</div>";

i_pagerString_ENG = i_pagerString_ENG + "</div></div>";

if (_Language == MyEnumLanguageEnglish)

{

return i_pagerString_ENG;

}

else

{

return i_pagerString;

}

}

//将HTML代码加入输出流

protected override void Render(HtmlTextWriter output)

{

baseRender(output);

switch (_DisplayPageing)

{

case MyEnumAlways:

outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

break;

case MyEnumAuto:

if (_pageSize < _recordcount)

{

outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

}

else

{

outputWriteLine("");

}

break;

case MyEnumNever:

outputWriteLine("");

break;

}

//if (_DisplayPageing == true) outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

// outputWriteLine(ThePage(_recordcount, _pageSize, _pageIndex, _PID, _CssClass));

}

}

}

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » ASP.NET中DataGrid控件应用技巧简述

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情