使用ASP.Net中的自定义控件

109阅读 0评论2008-09-09 akQFQW2geCOxgJG
分类:

  if(( data == "True")||(data == "true")){box.Checked = true;}

  break;

  default:break;

  }

  }

  }

  //

  // 定义控件的属性readOnly

  //

  private bool readOnly = true;

  }

  类CheckBoxColumn继承于模板列TemplateColumn,它实现DataGrid控件中仅包含CheckBox控件的模板列CheckBoxColumn。模板列CheckBoxColumn实现两种模板列,即只读的模板列和可编辑的模板列,它们分别由构造函数CheckBoxColumn(String Name)和CheckBoxColumn(bool Immediate Postback,String Name)实现。类CheckBoxColumn中的构造函数都创建一个子项CheckBoxItem,并根据模板列的属性设置子项的名称和是否为只读属性;类CheckBoxColumn还定义了子项的事件CheckedChanged,该事件在子项中的控件CheckBox的选择项改变时触发;类 CheckBoxColumn定义了回传属性AutoPostBack、数据域属性DataField。类CheckBoxColumn的程序代码如下:

  public class CheckBoxColumn :System.Web.UI.WebControls.TemplateColumn

  {

  //

  // 初始化CheckBoxColumn.

  //

  public CheckBoxColumn(String Name)

  {

  //设置控件为只读

  viewItem = new CheckBoxItem(false,Name); // SAW was false

  this.ItemTemplate = viewItem as ITemplate;

  //设置控件为可编辑的

  editItem = new CheckBoxItem(true,Name);

  this.EditItemTemplate = editItem as ITemplate;

  }

  //

  // 初始化CheckBoxColumn,并设置控件的回传属性

  //

  public CheckBoxColumn(bool ImmediatePostback,String Name)

  {

  //设置控件为只读

  viewItem = new CheckBoxItem(ImmediatePostback,Name);

  this.ItemTemplate = viewItem as ITemplate;

  //设置控件为可编辑的

  editItem = new CheckBoxItem(true,Name);

  this.EditItemTemplate = editItem as ITemplate;

  AutoPostBack = ImmediatePostback;

  }

  //

  // 设置控件CheckBoxColumn的事件

  //

[NextPage]

  函数GetString(DataGridItem container,Label CheckMsg,String Name)用来获取控件myDataGrid中被选择的子项显示的文本,并把获取的文本添加到控件CheckMsg的属性Text中。函数GetString (DataGridItem container,Label CheckMsg,String Name)的程序代码如下:

  private void GetString(DataGridItem container,Label CheckMsg,String Name)

  { //获取单个列的值

  Label tempLabel = (Label)container.FindControl(Name);

  if(tempLabel != null)

  { //设置控件CheckMsg的Text属性的值

  CheckMsg.Text += tempLabel.Text;

  }

  }

  运行效果

  (1)设置页面TestCheckBox.aspx为应用程序的起始页面。按F5键运行,出现如图12-14所示的初始界面。

图12-14 页面TestCheckBox.aspx的初始界面

  (2)单击页面TestCheckBox.aspx中的【显示消息】按钮获取并显示myDataGrid控件中被选择的子项中的所有文本,此时页面TestCheckBox.aspx如图12-15所示。

图12-15 显示myDataGrid控件中被选择的子项中的所有文本

  (3)单击页面TestCheckBox.aspx中的myDataGrid控件中的第4个CheckBox控件,则控件CheckMsg显示myDataGrid控件中该子项的所有显示的文本,如图12-16所示。

[NextPage]

  row[column] = (i % 2 == 0) ? true:false;

  }

  else

  { //添加其他列的数据

  row[column] = column.ColumnName + i.ToString();

  }

  }

  dataTable.Rows.Add(row);

  }

  //返回创建的数据表

  return(dataTable);

  }

  单击myDataGrid控件中的CheckBox控件触发事件checkCol_CheckedChanged(object sender, EventArgs e),该事件首先获取myDataGrid控件当前子项显示的文本,最后使用Label控件CheckMsg显示获取的文本。事件checkCol_CheckedChanged(object sender, EventArgs e)的程序代码如下:

  private void checkCol_CheckedChanged(object sender,EventArgs e)

  {

  //设置CheckBox控件的事件

  CheckMsg.Text = "";

  CheckBox box = (CheckBox) sender;

  if(box.Checked == true)

  {

  //获取选择的CheckBox控件所在的DataGridItem

  DataGridItem container = (DataGridItem) box.NamingContainer;

  //获取每列的值

  GetString(container,CheckMsg,"Name");

  GetString(container,CheckMsg,"Type");

  GetString(container,CheckMsg,"Data");

  }

  }

  单击页面TestCheckBox.aspx中的【显示消息】按钮触发事件ShowMsg_Click(object sender, System.EventArgs e),该事件用来获取myDataGrid控件中被选择的子项中的所有文本,并使用Label控件CheckMsg显示获取的文本。事件 ShowMsg_Click(object sender, System.EventArgs e)的程序代码如下:

  private void ShowMsg_Click(object sender, System.EventArgs e)

  {

  CheckMsg.Text = " ";

  foreach(DataGridItem container in myDataGrid.Items)

  { //获取每列的值

  CheckBox cBox = (CheckBox)container.FindControl("MyBox");

  if(cBox != null)

  {

  if(cBox.Checked == true)

  { //获取选中列的值

  GetString(container,CheckMsg,"Name");

  GetString(container,CheckMsg,"Type");

  GetString(container,CheckMsg,"Data");

  }

  }

  }

  }

[NextPage]

  //

  // 设置控件的事件OnCheckChanged

  //

  private void OnCheckChanged(object sender, EventArgs e)

  {

  if (CheckedChanged != null){CheckedChanged(sender, e);}

  }

  //

  //定义控件的属性Name

  //

  private string name;

  public string Name

  {

  get{return(name);}

  set{name = value;}

  }

  //

  // 定义控件的属性DataField

  //

  private string dataField;

  public string DataField

  {

  get{return dataField;}

  set{dataField=value;}

  }

  //

  // 定义控件的属性AutoPostback

  //

  private bool autoPostBack = false;

  public bool AutoPostBack

  {

  set{autoPostBack = value;}

  get{return autoPostBack;}

  }

  //

  // 定义控件的数据绑定函数BindData()

  //

  private void BindData(object sender, EventArgs e)

  {

  //找到CheckBox控件

  CheckBox box = (CheckBox) sender;

  DataGridItem container = (DataGridItem) box.NamingContainer;

  box.Checked = false;

  box.Enabled = (readOnly == true) ? false:true;

  //获取数据

  string data =

  ((DataRowView) container.DataItem)[dataField].ToString();

  //获取数据类型

  Type t = ((DataRowView)container.DataItem).DataView.Table.Columns[

  dataField].DataType;

  if (data.Length>0)

  {

  switch (t.ToString())

  { //设置控件的值

  case "System.Boolean":

[NextPage]

  ——此文章摘自《ASP.NET网络数据库开发实例精解》定价:¥62.00 特价:¥46.50 详细>>

  控件myDataGrid用来显示数据;控件ShowMsg用来获取DataGrid控件中被选择的子项中的所有文本;控件CheckMsg用来显示控件ShowMsg获取的文本。页面TestCheckBox.aspx的设计界面如 图12-13所示。

图12-13 页面TestCheckBox.aspx的设计界面

  页面TestCheckBox.aspx的HTML设计代码如下:

  <%@ Page language="c#" Codebehind="TestCheckBox.aspx.cs"

AutoEventWireup="false" Inherits="Example_12_5.TestCheckBox" %>  AutoEventWireup="false" Inherits="Example_12_5.TestCheckBox" %>

  Example_12_5:使用ASP.NET中的自定义控件

  

AutoGenerateColumns="False">  AutoGenerateColumns="False">

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

ForeColor="Red">  ForeColor="Red">

  

[NextPage]

  自定义控件是ASP.NET中很重要的一部分,使用它可以提高程序代码的重用性,即一个自定义控件在网页、自定义控件或控件的内部都可以再次使用。本实例创建的复选框控件列CheckBoxColumn自定义控件也可以在网站的任何地方再次使用。

  本实例介绍如何在ASP.NET中创建自定义控件、如何使用自定义控件,以及如何在自定义控件中定义公开属性和方法的实现方法。

  1.创建新ASP.NET应用程序

  在Visual Studio .NET 2003集成开发环境中创建新的ASP.NET Web应用程序,命名为Example_12_5。

  2.创建自定义控件CheckBoxColumn

  在应用程序Example_12_5中添加文件CheckItem.cs和文件 CheckColumn.cs。其中第一个文件定义类CheckBoxItem实现CheckBox控件;第二个文件定义类CheckBoxColumn 实现DataGrid控件中的CheckBoxColumn列。类CheckBoxItem继承于接口ITemplate,并在其中定义了标识控件名称的属性Name、标识控件数据域的属性DataField、标识控件是否为只读的属性ReadOnly、标识控件是否提交回传的属性 AutoPostBack和绑定控件数据的事件BindData()、当控件的选择项改变时触发的事件OnCheckChanged等。类 CheckBoxItem的程序代码如下:

  internal class CheckBoxItem : ITemplate

  {

  //

  // CheckBoxItem的构造函数

  //

  // 控件是否为可编辑

  public CheckBoxItem(bool editable,string Name)

  {

  name = Name;

  readOnly = (editable==true)?false:true;

  }

  //

  // 实例化CheckBox控件,并添加到容器中

  //

  // 添加控件的容器

  void ITemplate.InstantiateIn(Control container)

  {

  //创建CheckBox控件

  CheckBox box = new CheckBox();

  //设置控件的属性和事件

  box.ID = name;

  box.DataBinding += new EventHandler(this.BindData);

  box.AutoPostBack = autoPostBack;

  box.CheckedChanged += new EventHandler(this.OnCheckChanged);

  container.Controls.Add(box);

  }

  //

  //定义控件的事件CheckChanged

  //

  public event EventHandler CheckedChanged;

[NextPage]

  4.设计页面TestCheckBox.aspx的事件和函数

  页面TestCheckBox.aspx调用函数Page_Load(object sender, System.EventArgs e)初始化,该函数调用函数AddColumnToDataGrid()和函数BindData()分别实现在myDataGrid控件添加一个 CheckBoxColumn模板列和绑定myDataGrid控件的数据。函数AddColumnToDataGrid()在创建一个 CheckBoxColumn模板列时,同时还设置该模板列的属性DataField、属性HeaderText,以及CheckBox控件的事件 CheckedChanged。函数Page_Load(object sender, System.EventArgs e)、AddColumnToData Grid()和BindData()的程序代码如下:

  private void Page_Load(object sender, System.EventArgs e)

  {

  AddColumnToDataGrid();

  BindData();

  }

  private void AddColumnToDataGrid()

  { //添加一列复选框

  CheckBoxColumn checkCol = new CheckBoxColumn(true,"MyBox");

  checkCol.DataField = "Boolean";

  checkCol.HeaderText = "复选框";

  //添加复选框的事件

  checkCol.CheckedChanged += new EventHandler(checkCol_CheckedChanged);

  //添加到myDataGrid控件中

  myDataGrid.Columns.Add(checkCol);

  }

  private void BindData()

  {

  //绑定myDataGrid控件的数据

  myDataGrid.DataSource = CreateDataSource();

  myDataGrid.DataBind();

  }

  函数BindData()调用函数CreateDataSource()创建myDataGrid控件的数据源dataTable。函数CreateDataSource()首先定义数据表对象dataTable,并在dataTable对象中添加4个数据列 DataColumn,它们分别为“Name”、“Type”、“Data”和“Boolean”,分别表示名称、类型、数据和布尔型数据。然后函数 CreateDataSource()通过for语句设置表对象dataTable中的数据。函数CreateDataSource()的程序代码如下:

  private DataTable CreateDataSource()

  {

  //创建数据表及其列

  DataTable dataTable = new DataTable("MyData");

  dataTable.Columns.Add(new DataColumn("Name",typeof(string)));

  dataTable.Columns.Add(new DataColumn("Type",typeof(string)));

  dataTable.Columns.Add(new DataColumn("Data",typeof(string)));

  dataTable.Columns.Add(new DataColumn("Boolean",typeof(bool)));

  //添加五行数据

  for(int i = 0; i <5; i++)

  { //添加一行数据

  DataRow row = dataTable.NewRow();

  foreach(DataColumn column in dataTable.Columns)

  { //添加CheckBox控件的数据

  if(column.DataType == typeof(bool))

  {

[NextPage]

  ——此文章摘自《ASP.NET网络数据库开发实例精解》定价:¥62.00 特价:¥46.50 详细>>

  public event EventHandler CheckedChanged

  {

  add

  { //添加事件

  viewItem.CheckedChanged += value;

  editItem.CheckedChanged += value;

  }

  remove

  { //移除事件

  viewItem.CheckedChanged -= value;

  editItem.CheckedChanged -= value;

  }

  }

  //

  // 定义控件的AutoPostBack属性

  //

  public bool AutoPostBack

  {

  set{viewItem.AutoPostBack = value;editItem.AutoPostBack = value;}

  get{return viewItem.AutoPostBack;}

  }

  //

  // 定义控件的DataField属性

  //

  public string DataField

  {

  get{return viewItem.DataField;}

  set{viewItem.DataField = value;editItem.DataField = value;}

  }

  //

  // 定义控件的viewItem

  //

  private CheckBoxItem viewItem;

  //

  // 定义控件的editItem

  //

  private CheckBoxItem editItem;

  }

  3.设计页面TestCheckBox.aspx

  把应用程序Example_12_5的默认页面WebForm1.aspx重命名为 TestCheckBox.aspx,并在页面上添加1个DataGrid控件、1个Button控件和1个Lable控件,它们的名称分别为 myDataGrid、ShowMsg和CheckMsg。

【责编:Luzi】

--------------------next---------------------

上一篇:Web应用开发原理与技术
下一篇:.Net基础Lambda表达式的一般应用教程