求助:动态加载自定义控件,javascript脚本无法执行。
本人创建一自定义控件(mycontrol.ascx),上有一按钮(mybtn),按钮关联一段javascript脚本。如果将该自定义控件(mycontrol.ascx)拖到主页上(home.aspx),可以正确执行javascript脚本。但是如果采用动态加载自定义控件到主页面的方式时,点击按钮(mybtn)没有反应。
我检查了一下,我动态加载自定义控件的方法应该没有错。(即采用LoadControl方法,然后再页面page_load()时候再load一次,此方法有很多文章介绍过了),自定义控件其他功能都正常,就是点击按钮后页面回传,javascript脚本没执行!(如果采用静态加载的方法,点击按钮应该不会回传而执行javascript脚本。)
请问是什么原因,怎么解决?谢了。!!! --------------------编程问答-------------------- 给出简单代码说明:
1.用户控件(mycontrol.ascx):
<asp:ImageButton ID="mybtn" runat="server" OnClientClick="javascript:announceTime();return false;" />
2.主页(Home.aspx)动态加载用户控件:
'声明一个用户控件对象
dim _mycontrol as UserControls_mycontrol
Private Sub UserControlLoad()
....
'载入调单用户控件
Me.Panel1.Controls.Clear()
Me._mycontrol = Me.LoadControl("~/UserControls/mycontrol.ascx")
Me._mycontrol.ID = "_mycontrol1"
Me.Panel1.Controls.Add(Me._mycontrol)
End Sub
'页面加载事件
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
...
If Me.IsPostBack = True Then
If ViewState("usercontrol")=1 Then
.....
Me.UserControlLoad()
End if
End if
End Sub
'有一按钮触发动态加载用户控件
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
.....
If ViewState("usercontrol") Is Nothing Then
ViewState("usercontrol") = 1
Me.UserControlLoad()
End if
End Sub
顺便说明一下,以上动态加载用户控件的方法参考了网上一些资料,测试过可以正常使用,但是执行用户控件上面的客户脚本就发生上述问题,各位帮看看了。感觉是页面回传后没执行客户脚本。。。这个执行过程是怎样的,搞不清楚啊,晕了。~~ --------------------编程问答-------------------- ActiveX控件在VB中的使用
在开始一切工作之前,请确保ActiveX控件已经注册到计算机,请运行系统安装目录下面“注册控件.bat”。
在VB6.0中,新建一个标准的EXE应用程序,在左边工具栏上单击右键,出现菜单
选择“Components”,打开一个对话盒
按确定后,把Visual Graph ActiveX控件插入工具栏
左边的控件是主要的Visual Graph ActiveX控件,右边那个是属性列表窗口。
用鼠标选择左边的图标,在当前应用程序的窗口上用鼠标拉框的办法创建一个控件,这个控件的缺省名为vgctrl1。
--------------------------------------------------------------------------------
第一步:双击窗口,填写下面的代码
Private Sub Form_Load()
vgctrl1.Design ""
End Sub
这句程序执行后,将在控件中设计一个新的Visual Graph视图文件,控件支持Design(设计)和Run(运行)两个函数,无论接下来要干什么,一开始必须执行这两个函数其中一个,在绘图版本中,多用Design函数,用户将可以用鼠标在控件窗口上编辑图形;在工业监控等领域一般多用Run函数,用户不能用鼠标直接编辑图形,但用鼠标点击画面上不同的图形时会有各种控制事件发生,而且某些图形还会产生动作。如果要打开一个视图文件,参数是文件名。
--------------------------------------------------------------------------------
第二步:在窗口上放一个按钮Command1,双击这个按钮,编写下面的代码
Private Sub Command1_Click()
Dim ASheet As ISheet
Dim AText As IText
Set ASheet = vgctrl1.ActiveSheet
Set AText = ASheet.AddUnit("Text", 0, 0, 100, 100)
AText.Text = "Hello World!"
End Sub
ActiveSheet是视图文件的当前页面(页面类),Visual Graph图形系统支持多个页面,当前画图的工作都是在ActiveSheet上实现的,一般应用中只要一个页面就够了,但是如果视图文件是作为图库来用,它里面可能页面就多了。
AddUnit是页面类的函数成员,在ASheet页面上添加一个文字单元,宽度和高度都是100。这句程序执行后,用鼠标点击新生成的图形,可以在上面输入字符,或者用鼠标移动这个图形,改变它的大小等。
Text是文字单元类的属性成员,通过它修改图形的文字属性。
--------------------------------------------------------------------------------
第三步:在窗口上再放一个按钮Command2,双击这个按钮,编写下面的代码
Private Sub Command2_Click()
vgctrl1.NewUnit "Line", 0
End Sub
NewUnit是视图类的命令函数,执行这句程序后,可以在画面上用鼠标画线。
--------------------------------------------------------------------------------
第四步:下面,我们要给控件加上相应的事件,例如右键事件。
Private Sub vgctrl1_OnRButtonDown(ByVal X As Double, ByVal Y As Double)
Dim ASheet As ISheet
Dim AUnit As IUnit
Set ASheet = vgctrl1.ActiveSheet
Set AUnit = ASheet.UnitAtPoint(X, Y, Nothing)
MsgBox "您在图形:" + AUnit.Name + " 上按下了右键!"
End Sub
UnitAtPoint是页面类的函数成员,返回当前鼠标位置处的图形单元。我们一般在右键事件上挂上菜单,用这种办法我们就能知道当前要对什么图形对象进行操作,然后,根据不同的图形对象,产生不同的菜单内容。此处也可以用下面的写法:
Set AUnit = ASheet.UnitAtCursor( Nothing ),这样也得到当前鼠标位置所在的图形。
--------------------------------------------------------------------------------
第五步:上面这个程序有个漏洞,如果我们没有首先单击Command1按钮创建一个图形,那么这里的AUnit就是空,将使得最后一行程序出错,因此,要修改为:
Private Sub vgctrl1_OnRButtonDown(ByVal X As Double, ByVal Y As Double)
Dim ASheet As ISheet
Dim AUnit As IUnit
Set ASheet = vgctrl1.ActiveSheet
Set AUnit = ASheet.UnitAtCursor(Nothing)
If Not (AUnit Is Nothing) Then
MsgBox ("您在图形:" + AUnit.Name + " 上按下了右键!")
End If
End Sub
--------------------------------------------------------------------------------
第六步:下面我们添加元件。在窗口上再放一个Visual Graph ActiveX控件,把它设法放到看不到的地方(但是Visible属性不能设置成False)。修改Form_Load代码
Private Sub Form_Load()
vgctrl1.Design ""
vgctrl2.Run "电力设备.tbl"
vgctrl2.Library = True
End Sub
这里所指的电力设备.tbl在Visual Graph安装目录的Lib子目录下,此处编写时要把路径写全。
在窗口上再放一个按钮Command3,双击这个按钮,编写下面的代码
Private Sub Command3_Click()
vgctrl1.NewUnit "发电机", 0
End Sub
NewUnit是视图类的命令函数,执行这句程序后,可以在画面上用鼠标画出发电机的形状来。实际上,这句程序执行后,将首先判断第一个参数是不是保留的图形类名(text,shape,line),如果不是,将从当前指定的元件库(vgctrl2)中寻找相应名字的页面。如果把这句程序改成vgctrl1.NewUnit "发电机", 1,也就是第二个参数改为1,移动鼠标到画面,可以看到鼠标上拖着一个元件。可以放置若干个控件,打开多个图库文件,需要切换到某个图库时,就设置这个控件的Library属性为True,当前只能有一个图库,就是最后设置的这一个。如果需要用程序添加“发电机”这个元件,就执行vgctrl1.ActiveSheet.AddUnit "发电机", 0, 0, 0, 0。
--------------------------------------------------------------------------------
第七步:下面我们给上面的发电机增加一个双击事件,为它增加自定义属性MyProp
Private Sub vgctrl1_OnDblClick()
Dim ASheet As ISheet
Dim AUnit As IUnit
Set ASheet = vgctrl1.ActiveSheet
Set AUnit = ASheet.UnitAtCursor(Nothing)
If Not (AUnit Is Nothing) Then
If AUnit.Type = "发电机" Then
AUnit.SetPropertyValue "MyProp", 1234
End If
End If
End Sub
不同类型的元件,用Type属性来区分。SetPropertyValue是图形单元类的函数,如果元件已经有了MyProp这个属性,就修改这个属性的值。GetPropertyValue函数可以返回一个属性的值,这个值是类型不定的,可能是整数、小数、逻辑值或字符串等。
我这个例子你可以参考下
http://www.visual-graph.com/down/vg.zip --------------------编程问答-------------------- 楼上的,是不是发错帖子了? --------------------编程问答-------------------- 2楼是个易做图吧~!答非所问!!难道是来混的!
补充:.NET技术 , VB.NET