用按钮代替函数
我们知道,Foxtable的按钮有个PerformClick方法,用于模拟单击此按钮。
所以我们进行混合编程的时候,不一定要用自定义函数,完全可以将代码写在按钮的Click事件中,然后在前端js脚本调用此按钮的PerformClick方法即可。
Click事件没有参数,所以前端脚本无法向其传递数据,我们可以Var变量作为数据传递的媒介。
示例
本示例可参考示例文件"CaseStudy\WebViewer\调用Foxtable对象.Table"的窗口"用按钮生成PDF"。
本示例还有一个用异步函数的版本,可以打开窗口"用函数生成PDF"参考。
本示例还有一个同时用按钮和异步函数的版本,可以打开窗口"用按钮和函数生成PDF"参考。
本示例基于HTML设计了一个数据打印界面:

窗口有个不可见的名为btnPrint的普通按钮(Button),用于生成PDF文件的代码写在这个按钮的Click事件中,前端脚会调用这个按钮的PerformClick方法。
所以代码分成两个部分。
1、前端页面的打印按钮的JS脚本代码如下,这段代码根据用户输入内容生成一个json字符串,并保存在一个Var变量中,
function
handlePrint() {
//
获取用户输入的值
const product =
document.getElementById("cmbProduct").value
|| "";
const customer =
document.getElementById("cmbCustomer").value
|| "";
const year =
document.getElementById("cmbYear").value || "";
const month =
document.getElementById("cmbMonth").value ||
"";
// 生成JSON对象
const filterData = {
product: product,
customer: customer,
year: year,
month: month
};
//将Json对象存储在Var变量中,方便Foxtable使用:
ft.Vars["printFilter"] = JSON.stringify(filterData);
//模拟单击btnPrint按钮,生成PDF文件
ft.Forms["
混合编程之一"].Controls["btnPrint"].PerformClick();
}
2、后端的打印按钮(btnPrint)根据用户输入的内容合成筛选条件,然后筛选出数据并生成PDF文件:
'''Async
Await Task.Delay(0)
If
Vars("printFilter")
Is
Nothing
Then
'判断前端是否传递了打印条件
Return
End
If
Dim
jo
As
JObject =
JsonConvert.DeserializeObject(Vars("printFilter"))
Dim
filter
As
String
=
""
If
jo("product").ToString()
>
""
Then
filter =
"产品
= '"
& jo("product").ToString()
&
"'"
End
If
If
jo("customer").ToString()
>
""
Then
If
filter >
""
Then
filter = filter &
" and "
End
If
filter =
filter &
"客户
= '"
& jo("customer").ToString()
&
"'"
End
If
If
jo("year").ToString()
>
""
Then
Dim
year
As
Integer
= -1
Dim
month
As
Integer
= -1
year =
CInt(jo("year").ToString())
If
jo("month").ToString()
>
""
Then
month =
CInt(jo("month").ToString())
End
If
If
year > 0
AndAlso
month > 0
Then
Dim
d1
As
Date
=
New
Date(year,
month, 1)
Dim
d2
As
Date
=
New
Date(year,
month,
Date.DaysInMonth(year,
month))
If
filter >
""
Then
filter = filter &
" and "
End
If
filter = filter &
"日期
>= #"
& d1 &
"# And
日期
<= #"
& d2 &
"#"
End
If
End
If
If
filter =
""
Then
Return
End
If
'下面
是打印代码,省略
Dim
pdc
As
New
PDFCreator()
...
'生成完成后保存PDF文件,注意用的是异步对话框
Dim
dlg
As
New
SaveFileDialogA()
dlg.Filter =
"PDF文件|*.pdf"
If
Await
dlg.ShowDialog() = DialogResult.OK
Then
pdc.Save(dlg.FileName)
'保存文件
Process.Start(dlg.FileName)
'打开文件
End
If
提示:
你可也可以不通过Var变量和json字符串传递数据,改为直接在Foxtable端获取用户输入内容然后合成条件,可以参考后面的《使用内置DOM》的这一章