亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

動態增加和刪除用戶控件

系統 1863 0
我們在ASP.NET項目的開發中,需要頁面中動態添加和刪除多個用戶控件。開發環境為Microsoft Visual Studio .NET 2003, 開發語言為C#,并提供源代碼下載。

通過一個例子來演示:

我們通過網頁來動態創建表和字段時,一次性需要添加多個字段,而字段還有其屬性。那么可以通過創建一個用戶控件,里面包含多個文本控件或者其他控件來存放一個字段的名稱和其多個屬性值。然后,在網頁中,根據需要創建字段個數的需要,來多次動態加載相等數量的用戶控件。

既然能動態加載用戶控件,那么加載結束后如果發現某個或幾個字段多余,那就需要刪除多余的用戶控件.在刪除時,應該給出提示是否刪除。

那么具體操作是:點擊"增加"按鈕,頁面增加一個用戶控件,再次點擊"增加"按鈕又增加一個控件用戶。每個用戶控件上有一個刪除按鈕,點擊任何用戶控件上的“刪除”按鈕就刪除掉該用戶控件而不影響其他已存在的用戶控件。

我們先提到四個基本概念,他們在動態加載用戶控件中需要用到的知識。

什么是用戶控件?用戶控件就是已經被轉換為包含一個或者多個控件的ASP.NET頁面. 使用用戶控件可以很方便的在多個ASP.NET頁面中使用相同的內容和編程邏輯。[1]

什么是PlaceHolder控件?通常不將控件直接添加到頁面的Controls集合中。因為我們希望將控件添加到頁面的指定的位置。ASP.NET框架中就包含PlaceHolder控件,它用來作為其他控件的容器,我們將控件添加其中,這樣我們只需要對PlaceHolder控件定位就可以實現對其他控件的定位。

什么是ViewState?ViewState是.Net中提出的狀態保存的一種新途徑,它是服務器控件狀態保存的基礎。通俗的說,就是點擊頁面的按鈕(WebControls.Button類型)提交頁面后,頁面會被重新加載,那么我們需要保存提交前頁面中變量的值,在頁面被重新加載后可以使用這些被保存變量的值。在本例中,當我們刪除一個控件時,頁面會被重新加載,而我們需要刪除前用戶在其他控件輸入的值仍然存在,那么我們就需要ViewState來保存這些值。如果不保存這些值,頁面會被重新加載后其他控件輸入的值就會被清除,不符合我們的需要。

isPostBack是什么意思?判斷頁面是否首次被加載,是返回 false, 不是true。通過 isPostBack和ViewState一起就可以在Page_Load中完成頁面狀態的保存。

完成這個例子的步驟:
(1) 新建一個ASP.NET的項目,(有點廢話,但是沒有項目是無法完成這個例子的)。創建一個后綴名為aspx的頁面,我們需要在它里面來動態添加和刪除用戶控件(假設該頁面的名稱為TableDataField.aspx)。創建一個后綴名為ascx的用戶控件,(假設該用戶控件的名稱為WebUserControlCls.ascx),我們需要在它里面添加我們需要的多個服務端控件。呵呵,準備工作完成。

(2) 創建一個字段時,在頁面TableDataField.aspx和用戶控件WebUserControlCls.ascx包含的內容

<1> 頁面TableDataField.aspx包含的內容為:

屬性名稱 控件類型 用途
WPlaceHolder控件 WebControls.PlaceHolder 作為其他控件的容器
添加按鈕 WebControls.Button 點擊"增加"按鈕,頁面增加一個用戶控件
獲得屬性按鈕 WebControls.Button 點擊"增獲得屬性"按鈕可以獲得在用戶控件中輸入的值
表格 HTML 控件 所有的控件放在這個表格里面,5行3列

<2>用戶控件WebUserControlCls.ascx包含的內容為:

屬性名稱 控件類型 用途
字段的物理名稱 WebControls.TextBox 數據庫表中的字段名稱,一般用英文
字段的邏輯名稱 WebControls.TextBox 對用戶顯示的字段,作為數據庫表中的字段名稱的別名
字段的屬性 WebControls.DropDownList 假設字段屬性只允許有兩個選擇:字符類型和數字類型
字段的長度 WebControls.TextBox 對于字符就是限制長度,是數字就現在其小數位長度
刪除按鈕 WebControls.Button 點擊“刪除”按鈕就刪除掉該用戶控件
表格 HTML 控件 所有用戶控件放在這個表格里面,1行9列

(3)在頁面TableDataField.aspx中,說四個要點。
<1>動態增加用戶控件

1、獲得用戶控件

WebUserControlCls webUserCtrl = (WebUserControlCls)Page.LoadControl("WebUserControlCls.ascx");

2、將用戶控件增加到PlaceHolder中

this.plhDataFields.Controls.Add(webUserCtrl);

3、對用戶控件的按鈕注冊動態事件,這里使用事件和代理。關于事件和代理,請參見<<在C#的事件、多播中使用委托>>一文:http://blog.csdn.net/scucj/archive/2006/07/13/915482.aspx

webUserCtrl.btnDelRow.Attributes.Add("onclick", "return confirm('確定要刪除該字段嗎?');");
webUserCtrl.btnDelRow.Click +=new EventHandler(btnDelRow_Click);

4、對PlaceHolder中的所有用戶控件來設置ID屬性,將用戶控件的ID和被它包含的按鈕的ID相同,目的是為了點擊用戶控件中的"刪除"按鈕可以通過"刪除"按鈕ID來獲得用戶控件ID,然后可以刪除該用戶控件

setControlsID();

<2>動態刪除用戶控件

1、創建一個用戶控件的實例

WebUserControlCls webUserCtrl = new WebUserControlCls();

2、通過“刪除”按鈕的ID來獲得用戶控件的ID

webUserCtrl.ID = btnDel.ID;

3、通過用戶控件的ID來刪除用戶控件

this.plhDataFields.Controls.Remove(this.plhDataFields.FindControl(webUserCtrl.ID));

4、對PlaceHolder中的剩下所有用戶控件來重新設置ID屬性

setControlsID();

<3>保持用戶控件的狀態

IsPostBack表示頁面是否首次加載,如果是,則用戶控件狀態個數為0;如果不是,則要加載用戶控件。

if ( ! IsPostBack)
... {
// 跟蹤用戶控件狀態個數
ViewState[ " DataFieldCount " ] = 0 ;
}

else
... {
for ( int counter = 0 ;counter < ( int )ViewState[ " DataFieldCount " ];counter ++ )
... {
// 加載用戶控件
AddDataField(counter.ToString());
}

}

<4> 用戶控件添加成功后,我們提交這個頁面。本例通過點擊“獲得屬性”按鈕來獲得用戶控件中輸入的值的。
在這其中,我們通過一個foreach來找到所有的webUserCtrl,然后通過webUserCtrl中提供的屬性來獲得各個控件輸入的值。

if (ViewState[ " DataFieldCount " ] != null )
... {
foreach (WebUserControlClswebUserCtrl in this .plhDataFields.Controls)
... {
Response.Write(webUserCtrl.DataFieldName);
Response.Write(webUserCtrl.LogicName);
Response.Write(webUserCtrl.DataFieldType);
Response.Write(webUserCtrl.TypeLength);
Response.Write(
" <br> " );
}

}


(4)在用戶控件WebUserControlCls.ascx中,說三個要點。
<1> 應該在其WebUserControlCls.ascx.cs把“刪除”按鈕的范圍從protected改為public,因為我們需要在 頁面TableDataField.aspx中對“刪除”按鈕添加屬性和事件。
這樣:
protected System.Web.UI.WebControls.Button btnDelRow
應該變為:public System.Web.UI.WebControls.Button btnDelRow
注意,在用戶控件WebUserControlCls.ascx移動某個控件時,“刪除”按鈕的范圍會從已經修改的public變回為protected。那么就需要再次將protected改為public。

<2> 在用戶控件WebUserControlCls.ascx中為各個控件定義屬性,以便頁面TableDataField.aspx中可以方便獲取控件中輸入的值。

比如:

物理名稱,只讀屬性

public string DataFieldName
... {
get
... {
return txtDataFieldName.Text.Trim();
}

}

邏輯名稱,只讀屬性

public string LogicName
... {
get
... {
return txtLogicName.Text.Trim();
}

}

呵呵,整個思路就是這樣。由于CSDN的blog不能上傳文件,我下面給出 TableDataField.aspx 和 WebUserControlCls.ascx 兩個文件的四個部分的源代碼。或者給我發郵件: scucj@126.com

<1> TableDataField.aspx

<% ... @Pagelanguage = " c# " Codebehind = " TableDataField.aspx.cs " AutoEventWireup = " false " Inherits = " ScuHR.TableSet.TableDataField " %>
<! DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN" >
< HTML >
< HEAD >
< title > TableDataFiled </ title >
< meta name ="GENERATOR" Content ="MicrosoftVisualStudio.NET7.1" >
< meta name ="CODE_LANGUAGE" Content ="C#" >
< meta name ="vs_defaultClientScript" content ="JavaScript" >
< meta name ="vs_targetSchema" content ="http://schemas.microsoft.com/intellisense/ie5" >
</ HEAD >
< body MS_POSITIONING ="GridLayout" >
< form id ="Form1" method ="post" runat ="server" >
< TABLE id ="Table1" style ="Z-INDEX:101;LEFT:56px;WIDTH:680px;POSITION:absolute;TOP:32px;HEIGHT:75px"
cellSpacing
="1" cellPadding ="1" width ="680" border ="1" >
< TR >
< TD style ="WIDTH:21px" >< FONT face ="宋體" ></ FONT ></ TD >
< TD style ="WIDTH:621px" ></ TD >
< TD ></ TD >
</ TR >
< TR >
< TD style ="WIDTH:21px" ></ TD >
< TD style ="WIDTH:621px" >
< asp:PlaceHolder id ="plhDataFields" runat ="server" ></ asp:PlaceHolder ></ TD >
< TD ></ TD >
</ TR >
< TR >
< TD style ="WIDTH:21px" ></ TD >
< TD style ="WIDTH:621px" ></ TD >
< TD ></ TD >
</ TR >
< TR >
< TD style ="WIDTH:21px" ></ TD >
< TD style ="WIDTH:621px" >
< asp:Button id ="btnAadd" runat ="server" Text ="增加" ></ asp:Button ></ TD >
< TD ></ TD >
</ TR >
< TR >
< TD style ="WIDTH:21px" ></ TD >
< TD style ="WIDTH:621px" >< FONT face ="宋體" >
< asp:Button id ="btnGetValue" runat ="server" Text ="獲得屬性值" ></ asp:Button ></ FONT ></ TD >
< TD ></ TD >
</ TR >
</ TABLE >
</ form >
</ body >
</ HTML >

<2>TableDataField.aspx .cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
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 ScuHR.TableSet
... {
/**/ /// <summary>
/// TableDataFiled的摘要說明。
/// </summary>
///


public class TableDataField:System.Web.UI.Page
... {
protected System.Web.UI.WebControls.ButtonbtnAadd;
protected System.Web.UI.WebControls.PlaceHolderplhDataFields;
protected System.Web.UI.WebControls.ButtonbtnGetValue;

private void Page_Load( object sender,System.EventArgse)
... {
if ( ! IsPostBack)
... {
// 跟蹤用戶控件狀態值
ViewState[ " DataFieldCount " ] = 0 ;
}

else
... {
for ( int counter = 0 ;counter < ( int )ViewState[ " DataFieldCount " ];counter ++ )
... {
AddDataField(counter.ToString());
}

}

}


Web窗體設計器生成的代碼 #region Web窗體設計器生成的代碼
override protected void OnInit(EventArgse)
... {
//
// CODEGEN:該調用是ASP.NETWeb窗體設計器所必需的。
//
InitializeComponent();
base .OnInit(e);
}


/**/ /// <summary>
/// 設計器支持所需的方法-不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>

private void InitializeComponent()
... {
this .btnAadd.Click += new System.EventHandler( this .btnAadd_Click);
this .btnGetValue.Click += new System.EventHandler( this .btnGetValue_Click);
this .Load += new System.EventHandler( this .Page_Load);

}

#endregion


private void btnAadd_Click( object sender,System.EventArgse)
... {
ViewState[
" DataFieldCount " ] = ( int )ViewState[ " DataFieldCount " ] + 1 ;
AddDataField(ViewState[
" DataFieldCount " ].ToString());

}


/**/ /// <summary>
/// 通過用戶控件來增加動態控件
/// </summary>
/// <paramname="strFieldNum"></param>

http://images.csdn.net/syntaxhighlighting/Outlinin
分享到:
評論

動態增加和刪除用戶控件


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 麻豆伦理| 成人欧美一级毛片免费观看 | 欧美与黑人午夜性猛交久久久 | 国产成人乱码一区二区三区在线 | 99在线精品免费视频 | 综合网伊人 | 国产成+人+综合+亚洲不卡 | 中文字幕美日韩在线高清 | 尤物国产在线精品福利一区 | 女人十六毛片 | 国产福利短视频 | 老司机午夜视频在线观看 | 99热7| 久久国产精品免费视频 | 五月天婷婷在线视频国产在线 | 国产九九精品 | 久久精品福利视频 | 欧美色婷婷 | 日本一级aaaa特黄毛片 | 五月综合激情视频在线观看 | 中文字幕一视频97色伦 | 免费一级毛片在线视频观看 | 国产精品成人久久久 | 久久综合久久综合九色 | 欧美激情免费看 | 亚洲精品无码不卡在线播放he | 成人性生交大片免费看午夜a | 成年女人毛片免费播放视频m | 久久婷婷国产一区二区三区 | 久9视频这里只有精品8 | 成人国产视频在线观看 | 日本一级毛片aaaaa | 成人在线视频免费观看 | 激情国产白嫩美女在线观看 | 伊人婷| 国产一级一片免费播放 | 老头老太做爰xxxx视频 | 国产成人精品日本亚洲专一区 | 成人毛片18岁女人毛片免费看 | 亚洲系列第一页 | 欧美三级成人观看 |