ASP.net User control and Event in Delphi |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
一个用户控件,要有事件,是得使用这个用户控件的页面里能触发那个事件,知道用户控件干了什么。 基本上,和普通的DLEPHI的控件要做一个事件的方法差不多。 首先,做一个用户控件,并定义一个事件类型:
TTestEvent=procedure (S:string) of object; //自己定义的事件类型 TWebUserControl2 = class(System.Web.UI.UserControl) {$REGION 'Designer Managed Code'} strict private procedure InitializeComponent; procedure Button1_Click(sender: System.Object; e: System.EventArgs); {$ENDREGION} strict private FTestEvent:TTestEvent; procedure Page_Load(sender: System.Object; e: System.EventArgs); strict protected Button1: System.Web.UI.WebControls.Button; procedure OnInit(e: System.EventArgs); override; private { Private Declarations } public { Public Declarations} published property OnTestEvent:TTestEvent read FTestEvent write FTestEvent; //自己定义的事件 end;在用户控件里实现这个事件,当用户控件内的BUTTON CLICK时: procedure TWebUserControl2.Button1_Click(sender: System.Object; e: System.EventArgs); begin if assigned(FTestEvent) then FTestEvent('2'); end;以上是用户控件里的代码。然后,在页面里: 首先声明一个PlaceHolder和一个用户控件。因为用户控件要动态生成,要放到合适的地方,就是PlaceHolder里。声明在这里: strict protected //用户控件也声明在这里 LinkButton1: System.Web.UI.WebControls.LinkButton; LinkButton2: System.Web.UI.WebControls.LinkButton; Label1: System.Web.UI.WebControls.Label; ATestControl:TestEvent.TWebUserControl2; PlaceHolder1: System.Web.UI.WebControls.PlaceHolder;在页面里声明一个方法,参数和那个事件完全一样: procedure DoTestEvent(S:string); 另外一个方法,就是动态生成这个用户控件: procedure ShowUserControl; 实现代码: procedure TWebForm1.ShowUserControl; begin ATestControl:=TestEvent.TWebUserControl2(Page.LoadControl('TestEvent.ascx')); ATestControl.OnTestEvent:=DoTestEvent; //---把这个方法指到控件的事件。和普通DELPHI一样。 PlaceHolder1.Controls.Add(ATestControl); end; 触发事件的方法的实现: procedure TWebForm1.DoTestEvent(S: string); begin Label1.Text:=S; end; 这里需要注意的是,ShowUserControl 要放到: procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs); begin // TODO: Put user code to initialize the page here if not IsPostBack then begin end; ShowUserControl; //一定是放到这里,不是放到 not IsPostBack 里。也就是每次都要生成它! end;这样就可以触发事件了。 發表人 - pcplayer99 於 2005/05/11 18:29:36 |
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
另外,如果想在设计期把User Control拖到页面上,要注意: 设计期拖到页面上的UserControl, Delphi并没有在pas里声明它。因此,还是要在页面里声明它:
strict protected //用户控件也声明在这里 LinkButton1: System.Web.UI.WebControls.LinkButton; LinkButton2: System.Web.UI.WebControls.LinkButton; Label1: System.Web.UI.WebControls.Label; ATestControl:TestEvent.TWebUserControl2; PlaceHolder1: System.Web.UI.WebControls.PlaceHolder;设计期已经把控件拖过来了,不用再做 Page.LoadControl 来生成这个控件了。只需要在Page_Load里把这个控件的事件和页面里的指定方法绑定就行了。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |