|
if(( data == "True")||(data == "true")){box.Checked = true;}
break; default:break; } } } // <summary> // 定义控件的属性readOnly // </summary> 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 { // <summary> // 初始化CheckBoxColumn. // </summary> 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; } // <summary> // 初始化CheckBoxColumn,并设置控件的回传属性 // </summary> 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; } // <summary> // 设置控件CheckBoxColumn的事件 // </summary> [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所示。
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]// <summary> // 设置控件的事件OnCheckChanged // </summary> private void OnCheckChanged(object sender, EventArgs e) { if (CheckedChanged != null){CheckedChanged(sender, e);} } // <summary> //定义控件的属性Name // </summary> private string name; public string Name { get{return(name);} set{name = value;} } // <summary> // 定义控件的属性DataField // </summary> private string dataField; public string DataField { get{return dataField;} set{dataField=value;} } // <summary> // 定义控件的属性AutoPostback // </summary> private bool autoPostBack = false; public bool AutoPostBack { set{autoPostBack = value;} get{return autoPostBack;} } // <summary> // 定义控件的数据绑定函数BindData() // </summary> 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" %> <HTML><HEAD><title>Example_12_5:使用ASP.NET中的自定义控件</title></HEAD> <asp:DataGrid id="myDataGrid" runat="server" AutoGenerateColumns="False"> AutoGenerateColumns="False"> <Columns> <asp:TemplateColumn HeaderText="名称"><ItemTemplate> <asp:Label ID="Name" Runat="server" Text=''<%# DataBinder.Eval(Container.DataItem, "Name") %>''> </asp:Label> </ItemTemplate></asp:TemplateColumn> <asp:TemplateColumn HeaderText="类型"><ItemTemplate> <asp:Label ID="Type" Runat="server" Text=''<%# DataBinder.Eval(Container.DataItem, "Type") %>''> </asp:Label> </ItemTemplate></asp:TemplateColumn> <asp:TemplateColumn HeaderText="数据"><ItemTemplate> <asp:Label ID="Data" Runat="server" Text=''<%# DataBinder.Eval(Container.DataItem, "Data") %>''> </asp:Label> </ItemTemplate></asp:TemplateColumn> </Columns> </asp:DataGrid> <asp:Button id="ShowMsg" runat="server" Text="显示消息"></asp:Button> <asp:Label id="CheckMsg" runat="server" Width="100%" ForeColor="Red"> ForeColor="Red"></asp:Label> </HTML> [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 { // <summary> // CheckBoxItem的构造函数 // </summary> // <param name="editable">控件是否为可编辑</param> public CheckBoxItem(bool editable,string Name) { name = Name; readOnly = (editable==true)?false:true; } // <summary> // 实例化CheckBox控件,并添加到容器中 // </summary> // <param name="container">添加控件的容器</param> 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); } // <summary> //定义控件的事件CheckChanged // </summary> 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; } } // <summary> // 定义控件的AutoPostBack属性 // </summary> public bool AutoPostBack { set{viewItem.AutoPostBack = value;editItem.AutoPostBack = value;} get{return viewItem.AutoPostBack;} } // <summary> // 定义控件的DataField属性 // </summary> public string DataField { get{return viewItem.DataField;} set{viewItem.DataField = value;editItem.DataField = value;} } // <summary> // 定义控件的viewItem // </summary> private CheckBoxItem viewItem; // <summary> // 定义控件的editItem // </summary> private CheckBoxItem editItem; } 3.设计页面TestCheckBox.aspx 把应用程序Example_12_5的默认页面WebForm1.aspx重命名为 TestCheckBox.aspx,并在页面上添加1个DataGrid控件、1个Button控件和1个Lable控件,它们的名称分别为 myDataGrid、ShowMsg和CheckMsg。 |