分类:
2008-09-09 16:35:57
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" %>
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。