我们的团队现在已经使用了TreeView三年或四年,这使我们的Internet Explorer用户能够在一个TreeView列表中简单地查看来自MS Access数据库和MSSQL 2005 Server的数据。
自从这一发展以来,我们就陷入了两难境地。用户开始被允许使用原始用例中未包含的Google Chrome和Firefox,并且与此对象在Internet Explorer外部编码的TreeView ActiveX控件不兼容。我认为最初的想法来自this type of Windows Common Control。使用JQuery或其他技术实现这一目标的简单替代方法是什么,前提是当前没有服务器端脚本可用?
同样,这里的目标是使其与大多数主流浏览器兼容。
注意:我试图获得服务器端脚本,这不是此项目的选项。因此,使用JSP
,PHP
,ASP
等等,不目标的答案应该...而不是这里的尝试是找出一种方法来做到这一点< strong>在共享网络上使用本地文件。
是的,我知道此类设置涉及的安全漏洞......无论如何,这都是方向。
例如,这是使用中的对象:
<body onload="SetupPage()">
<object classid="CLSID:C74190B6-8589-11D1-B16A-00C0F0283628" id="MainTree" width="100%" height="290" style="font-family: times new roman; font-size: 16px; Visibility: visible">
<param name="Style" value="7">
<param name="_ExtentX" value="5292">
<param name="_ExtentY" value="10583">
<param name="_Version" value="393217">
<param name="HideSelection" value="0">
<param name="Indentation" value="767">
<param name="LabelEdit" value="0">
<param name="LineStyle" value="1">
<param name="PathSeparator" value="\">
<param name="Sorted" value="0">
<param name="Checkboxes" value="0">
<param name="FullRowSelect" value="0">
<param name="HotTracking" value="1">
<param name="Scroll" value="1">
<param name="SingleSel" value="0">
<param name="ImageList" value="ImgList">
<param name="BorderStyle" value="1">
<param name="Appearance" value="1">
<param name="MousePointer" value="0">
<param name="Enabled" value="1">
<param name="OLEDragMode" value="0">
<param name="OLEDropMode" value="0">
</object>
<object classid="CLSID:2C247F23-8591-11D1-B16A-00C0F0283628" id="ImgList" width="0" height="0" style="visibility: hidden"></object>
<IFrame id="PrtFrame" style="width: 0px; height: 0px">
</IFRAME>
</body>
将此对象放置在网页主体后,对某些VBScript的调用允许使用以下内容填充此对象:
<script language="vbscript">
Sub SetupPage()
Call MainTree.Nodes.Clear
Call PopulateImageList
Call PopulateTree
End Sub
Sub PopulateTree()
Dim rs ' RecordSet
Dim i ' Index
Dim ndParent ' Parent Node
' Assign the main html form to a variable xfrm
Set xfrm = document.MainForm
' Setup a connection with the Database
Set AccessConn = CreateObject("ADODB.Connection")
AccessConn.open AccessConnectionString
strSQL = "SELECT..."
Set rs = AccessConn.Execute(strSQL)
' Manually set the parent nodes
i = 1
Set ndActive = MainTree.Nodes.Add(, 2, "IDC" & i, "Active", ImageIndex("active"))
' Move one forward, since the parent node was set manually
i = i + 1
Do While rs.EOF = False
' Add the detail to each parent node for each record returned...
rs.MoveNext
Loop
' etc...
End Sub
Sub PopulateImageList()
Dim lst
set lst = ImgList.ListImages.Add(1,"header",LoadPicture(DirectoryPath & "TreeImages\header.gif"))
set lst = ImgList.ListImages.Add(2,"hold",LoadPicture(DirectoryPath & "TreeImages\hold.gif"))
set lst = ImgList.ListImages.Add(3,"reviewed",LoadPicture(DirectoryPath & "TreeImages\reviewed.gif"))
set lst = ImgList.ListImages.Add(4,"completed",LoadPicture(DirectoryPath & "TreeImages\completed.gif"))
set lst = ImgList.ListImages.Add(5,"rejected",LoadPicture(DirectoryPath & "TreeImages\rejected.gif"))
set lst = ImgList.ListImages.Add(6,"printed",LoadPicture(DirectoryPath & "TreeImages\printer.gif"))
set lst = ImgList.ListImages.Add(7,"active",LoadPicture(DirectoryPath & "TreeImages\active.gif"))
set lst = ImgList.ListImages.Add(8,"archived",LoadPicture(DirectoryPath & "TreeImages\archived.gif"))
set lst = ImgList.ListImages.Add(9,"emailed",LoadPicture(DirectoryPath & "TreeImages\emailed.gif"))
set lst = ImgList.ListImages.Add(10,"assigned",LoadPicture(DirectoryPath & "TreeImages\assigned.gif"))
End Sub
</script>
一旦数据在源数据库中可用,用户需要做的就是打开共享网络上的本地文件,他们会看到如下内容:
任何实现这一目标的想法或方法都将非常感激。
答案 0 :(得分:1)
好吧,让我们从不同角度看待问题...忘记从客户端[JavaScript]访问数据库。那又如何?只需使用SQL Server作为Web服务器来提取数据。它被称为HTTP End Point。这样,您就可以在SQL Server端实现数据访问逻辑(包括通过任何可用接口进行MS Access)。所以,现在SQL Server的Web服务返回可以使用jQuery(read this for some info)在客户端(AJAX)上操作的数据。
以下是我为终点部分找到的一些链接:
http://www.simple-talk.com/sql/database-administration/sql-server-endpoints-soup-to-nuts/
我从未实现过SQL Server端点,因此无法判断这是否容易。但是,我在InterSystems Cache database中做了类似的工作并且效果非常好。
无论如何,这就是我看到的......
P.S。 我对你的本地文件方法有点困惑
答案 1 :(得分:1)
您可以使用Access处理数据绑定,然后使用动态填充所需内容的Web浏览器控件(即Internet Explorer)。使用document.write,您可以填充所有内容,而无需在主机上实际创建任何HTML / JS / CSS。对于图像,您可以嵌入DataURI。
您可以根据用户交互的需要绑定事件,它不是很漂亮但保证受控环境(强制它们使用IE而不给它们任何源代码)并且不需要特殊的数据库交互(因为MS Access可以完成所有操作)对你而言)。
MSDN上有几篇关于控件的文章:http://msdn.microsoft.com/en-us/library/aa752041(v=vs.85).aspx。
我是现役空军为欧洲一个单位的“网络应用程序”工作,限制非常相似。我最终做的是使用MS Access启动IE并拦截Navigate2事件进行处理。在网络方面,我有一种基于jQuery的模板语言,我正在构建它来处理所有的SQL乐趣。这允许我完全用HTML / JS / CSS编写应用程序,而Access处理实际的JET绑定。它仍处于开发阶段,但是当我完成后,我将打一个我编写的C ++启动器,这样用户就可以从运行Access的不可见实例的网络运行我的EXE,用户只能看到IE实例和应用程序