新增温控提示音版本控制分支和设备链表上传

This commit is contained in:
2026-03-10 10:08:36 +08:00
parent 20e71513ef
commit c26c2bf49c
13 changed files with 483 additions and 22833 deletions

6
.gitignore vendored
View File

@@ -20,3 +20,9 @@ BLV_Studio/obj/Debug/BLV_Studio.vbproj.AssemblyReference.cache
BLV_Studio/obj/Debug/BLV_Studio.pdb
BLV_Studio/obj/Debug/BLV_Studio.vbproj.GenerateResource.cache
BLV_Studio/obj/Debug/DesignTimeResolveAssemblyReferences.cache
BLV_Studio/publish
BLV_Studio/obj
BLV_Studio/obj
BLV_Studio/obj/Debug/BLV_Studio.xml
BLV_Studio/bin
BLV_Studio/bin/Debug/BLV_Studio.xml

View File

@@ -35,7 +35,7 @@
<MinimumRequiredVersion>4.0.0.5</MinimumRequiredVersion>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>index.html</WebPage>
<ApplicationRevision>91</ApplicationRevision>
<ApplicationRevision>95</ApplicationRevision>
<ApplicationVersion>4.4.3.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>

View File

@@ -374,4 +374,81 @@ Public Class DbExecutor
GC.Collect() '对所有缓存垃圾进行回收
End Sub
''' <summary>
''' 添加参数到命令(简化版本,自动推断参数类型)
''' </summary>
''' <param name="parameterName">参数名称(需包含@或:前缀)</param>
''' <param name="value">参数值</param>
''' <returns>创建的DbParameter对象</returns>
Public Function AddParameter(parameterName As String, value As Object) As DbParameter
' 自动根据值类型推断DbType
Dim dbType As DbType
Dim convertedValue As Object = value
If value Is Nothing OrElse DBNull.Value.Equals(value) Then
dbType = DbType.Object
convertedValue = DBNull.Value
Else
Select Case value.GetType()
Case GetType(Integer)
dbType = DbType.Int32
Case GetType(String)
dbType = DbType.String
Case GetType(Boolean)
dbType = DbType.Boolean
Case GetType(DateTime)
dbType = DbType.DateTime
Case GetType(Decimal)
dbType = DbType.Decimal
Case GetType(Double)
dbType = DbType.Double
Case GetType(Single)
dbType = DbType.Single
Case GetType(Byte())
dbType = DbType.Binary
Case GetType(Guid)
dbType = DbType.Guid
Case Else
dbType = DbType.Object
End Select
End If
' 调用现有的AddDbParameter方法
Return AddDbParameter(dbType, parameterName, convertedValue)
End Function
''' <summary>
''' 添加参数到命令(指定明确的类型)
''' </summary>
''' <param name="parameterName">参数名称</param>
''' <param name="value">参数值</param>
''' <param name="dbType">参数的数据类型</param>
''' <returns>创建的DbParameter对象</returns>
Public Function AddParameter(parameterName As String, value As Object, dbType As DbType) As DbParameter
Dim convertedValue As Object = value
' 处理空值
If value Is Nothing OrElse DBNull.Value.Equals(value) Then
convertedValue = DBNull.Value
End If
Return AddDbParameter(dbType, parameterName, convertedValue)
End Function
''' <summary>
''' 添加参数到命令(包含方向)
''' </summary>
''' <param name="parameterName">参数名称</param>
''' <param name="value">参数值</param>
''' <param name="dbType">参数的数据类型</param>
''' <param name="direction">参数方向(输入/输出)</param>
''' <returns>创建的DbParameter对象</returns>
Public Function AddParameter(parameterName As String, value As Object, dbType As DbType, direction As ParameterDirection) As DbParameter
Dim param = AddParameter(parameterName, value, dbType)
param.Direction = direction
Return param
End Function
End Class

View File

@@ -272,6 +272,7 @@ Partial Class FrmMain
Me.tsb_SyncConfigFiles = New System.Windows.Forms.ToolStripButton()
Me.ToolStripButton4 = New System.Windows.Forms.ToolStripButton()
Me.ToolStripButton17 = New System.Windows.Forms.ToolStripButton()
Me.ToolStripButton23 = New System.Windows.Forms.ToolStripButton()
Me.MsMain.SuspendLayout()
Me.StatusStrip1.SuspendLayout()
Me.CmsEvent.SuspendLayout()
@@ -1017,7 +1018,7 @@ Partial Class FrmMain
'
'toopMax
'
Me.toopMax.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripSeparator18, Me.ToolStripButton6, Me.T_OpenfileXML, Me.ToolStripButton10, Me.ToolStripButton7, Me.ToolStripButton8, Me.ToolStripSeparator19, Me.ToolStripButton13, Me.ToolStripButton11, Me.ToolStripButton12, Me.ToolStripSeparator20, Me.ToolStripButton14, Me.ToolStripButton9, Me.ToolStripButton15, Me.ToolStripButton16, Me.ToolStripButton19, Me.ToolStripSeparator22, Me.Tablet_DeleteRow, Me.ToolStripButton3, Me.ToolStripButton21, Me.ToolStripButton5, Me.ToolStripButton18, Me.ToolStripButton22})
Me.toopMax.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripSeparator18, Me.ToolStripButton6, Me.T_OpenfileXML, Me.ToolStripButton10, Me.ToolStripButton7, Me.ToolStripButton8, Me.ToolStripSeparator19, Me.ToolStripButton13, Me.ToolStripButton11, Me.ToolStripButton12, Me.ToolStripSeparator20, Me.ToolStripButton14, Me.ToolStripButton9, Me.ToolStripButton15, Me.ToolStripButton16, Me.ToolStripSeparator22, Me.ToolStripButton19, Me.Tablet_DeleteRow, Me.ToolStripButton3, Me.ToolStripButton21, Me.ToolStripButton5, Me.ToolStripButton18, Me.ToolStripButton22})
Me.toopMax.Location = New System.Drawing.Point(0, 0)
Me.toopMax.Name = "toopMax"
Me.toopMax.Size = New System.Drawing.Size(993, 40)
@@ -1171,17 +1172,15 @@ Partial Class FrmMain
'
'ToolStripButton19
'
Me.ToolStripButton19.Enabled = False
Me.ToolStripButton19.Font = New System.Drawing.Font("宋体", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))
Me.ToolStripButton19.ForeColor = System.Drawing.Color.Black
Me.ToolStripButton19.Image = CType(resources.GetObject("ToolStripButton19.Image"), System.Drawing.Image)
Me.ToolStripButton19.ImageTransparentColor = System.Drawing.Color.Magenta
Me.ToolStripButton19.Name = "ToolStripButton19"
Me.ToolStripButton19.Size = New System.Drawing.Size(33, 37)
Me.ToolStripButton19.Text = "导出"
Me.ToolStripButton19.Size = New System.Drawing.Size(81, 37)
Me.ToolStripButton19.Text = "上传设备信息"
Me.ToolStripButton19.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
Me.ToolStripButton19.ToolTipText = "将文件导出到Excel表格"
Me.ToolStripButton19.Visible = False
'
'ToolStripSeparator22
'
@@ -1297,6 +1296,7 @@ Partial Class FrmMain
'
Me.ToolStripTextBox1.BackColor = System.Drawing.SystemColors.ButtonHighlight
Me.ToolStripTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.ToolStripTextBox1.Font = New System.Drawing.Font("Microsoft YaHei UI", 9.0!)
Me.ToolStripTextBox1.Name = "ToolStripTextBox1"
Me.ToolStripTextBox1.ReadOnly = True
Me.ToolStripTextBox1.Size = New System.Drawing.Size(100, 25)
@@ -1640,7 +1640,7 @@ Partial Class FrmMain
'
'ToolStrip2
'
Me.ToolStrip2.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.tsb_ReleaseToProjcet, Me.ToolStripSeparator7, Me.tsb_RuleCheck, Me.tsb_Compile, Me.tsb_DownLoad, Me.ToolStripSeparator4, Me.TsBtnNewFile, Me.TsBtnLoad, Me.tsb_SaveFile, Me.TsBtnSaveAs, Me.tsb_OpenFileFolder, Me.ToolStripSeparator6, Me.TsBtnAddModel, Me.TsBtnAddActions, Me.TsBtnAddDev, Me.TsBtnAddCondition, Me.TsBtnAddAction, Me.tsb_ExportToExcel, Me.ToolStripSeparator13, Me.UploadFirmware_btn, Me.ToolStripSeparator17, Me.ToolStripButton20, Me.ToolStripSeparator21})
Me.ToolStrip2.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.tsb_ReleaseToProjcet, Me.ToolStripSeparator7, Me.tsb_RuleCheck, Me.tsb_Compile, Me.tsb_DownLoad, Me.ToolStripSeparator4, Me.TsBtnNewFile, Me.TsBtnLoad, Me.tsb_SaveFile, Me.TsBtnSaveAs, Me.tsb_OpenFileFolder, Me.ToolStripSeparator6, Me.TsBtnAddModel, Me.TsBtnAddActions, Me.TsBtnAddDev, Me.TsBtnAddCondition, Me.TsBtnAddAction, Me.tsb_ExportToExcel, Me.ToolStripSeparator13, Me.UploadFirmware_btn, Me.ToolStripSeparator17, Me.ToolStripButton20, Me.ToolStripSeparator21, Me.ToolStripButton23})
Me.ToolStrip2.Location = New System.Drawing.Point(3, 3)
Me.ToolStrip2.Name = "ToolStrip2"
Me.ToolStrip2.Size = New System.Drawing.Size(987, 40)
@@ -2777,6 +2777,17 @@ Partial Class FrmMain
Me.ToolStripButton17.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
Me.ToolStripButton17.Visible = False
'
'ToolStripButton23
'
Me.ToolStripButton23.ForeColor = System.Drawing.Color.Blue
Me.ToolStripButton23.Image = CType(resources.GetObject("ToolStripButton23.Image"), System.Drawing.Image)
Me.ToolStripButton23.ImageTransparentColor = System.Drawing.Color.Magenta
Me.ToolStripButton23.Name = "ToolStripButton23"
Me.ToolStripButton23.Size = New System.Drawing.Size(60, 37)
Me.ToolStripButton23.Text = "上传设备"
Me.ToolStripButton23.TextAlign = System.Drawing.ContentAlignment.MiddleRight
Me.ToolStripButton23.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
'
'FrmMain
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
@@ -3112,4 +3123,5 @@ Partial Class FrmMain
Friend WithEvents ToolStripSeparator21 As ToolStripSeparator
Friend WithEvents ToolStripButton21 As ToolStripButton
Friend WithEvents ToolStripButton22 As ToolStripButton
Friend WithEvents ToolStripButton23 As ToolStripButton
End Class

View File

@@ -179,7 +179,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABS
PgAAAk1TRnQBSQFMAgEBQgEAAXgBIwF4ASMBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
PgAAAk1TRnQBSQFMAgEBQgEAAYABIwGAASMBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARABAQIAAQEBAAEIBgABRBgAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPAAQABwAHc
AcABAAHwAcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANNAQADQgEA
AzkBAAGAAXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGtAgAB/wEz
@@ -466,7 +466,13 @@
<value>17, 55</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>224</value>
<value>82</value>
</metadata>
<metadata name="BackgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>188, 55</value>
</metadata>
<metadata name="CustomInstaller2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>361, 55</value>
</metadata>
<data name="PictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
@@ -702,6 +708,9 @@
w4fXohzSfo/RpBT6//AY2YQM5nBRfAMSHREeGw8GSAAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="ToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>973, 55</value>
</metadata>
<data name="Label3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
@@ -720,6 +729,21 @@
<metadata name="toopMax.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>868, 55</value>
</metadata>
<metadata name="ToolStrip4.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>512, 55</value>
</metadata>
<metadata name="ToolStrip3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>685, 17</value>
</metadata>
<metadata name="ToolStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>360, 17</value>
</metadata>
<metadata name="ToolStrip5.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>624, 55</value>
</metadata>
<metadata name="toopMax.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>868, 55</value>
</metadata>
<data name="ToolStripButton6.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -1563,6 +1587,21 @@
SUVORK5CYII=
</value>
</data>
<data name="ToolStripButton23.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE9SURBVDhPtVKva8NAGI2czL8wt8nJ2sDEBhOLW9wIEZWl
svbUqCphIoSKwVUUMncThZspnBlkIhAz6OTJycq3+/JjqcgtndiD4+6+vPe+j9xz/gVyqxCOGXyzwgmD
orvZm8/DICGZ0LkSk9n9HwwO0Yq9u18MyjcJsZyDJzPIjbAS83UKGfnVUk9pxyMxoKCLEN7lhdVARgH2
yRR67IPdjDoeT1glFotTKqIs8l4TMiAxv/UwOjvvOOpVIDBF58QBX3HrBPkqBbvy4Lou+MOs431pDf25
swoHkb+X1ZuXRXmUCXGbYw0q0FNdH/nWvZmg4tAE1EhsZH+ogohh/phh91GbiJcc04k2ZIXsuU5lO2mc
9Pxo6k5paxNHYrUF4sUeYRT/GBxyetFOQJ0rsdnN1S6wgcZuOiNb2+LtON/B6OzDMC9GwAAAAABJRU5E
rkJggg==
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>82</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAA
@@ -1729,10 +1768,4 @@
AAA=
</value>
</data>
<metadata name="BackgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>188, 55</value>
</metadata>
<metadata name="CustomInstaller2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>361, 55</value>
</metadata>
</root>

View File

@@ -2,6 +2,7 @@
Imports System.Net
Imports System.Security.Cryptography
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Threading
Imports BLV_Studio.GridModel
Imports BLV_Studio.GridModel.DeviceEventModel
@@ -120,21 +121,21 @@ Public Class FrmMain
Else
If ImgLstMain.Images.Count = 0 Then Return
Dim imgindex As Integer = -1
Select Case ftpFlag
Case 0
imgindex = ImgLstMain.Images.IndexOfKey(Syncing.png)
If imgindex = -1 Then Return
FtpIcon_lab.Image = ImgLstMain.Images.Item(imgindex)
Case 1
imgindex = ImgLstMain.Images.IndexOfKey(Syncerror.png)
If imgindex = -1 Then Return
FtpIcon_lab.Image = ImgLstMain.Images.Item(imgindex)
Case 2
imgindex = ImgLstMain.Images.IndexOfKey(SyncTrue.png)
If imgindex = -1 Then Return
FtpIcon_lab.Image = ImgLstMain.Images.Item(imgindex)
End Select
End If
Select Case ftpFlag
Case 0
imgindex = ImgLstMain.Images.IndexOfKey(Syncing.png)
If imgindex = -1 Then Return
FtpIcon_lab.Image = ImgLstMain.Images.Item(imgindex)
Case 1
imgindex = ImgLstMain.Images.IndexOfKey(Syncerror.png)
If imgindex = -1 Then Return
FtpIcon_lab.Image = ImgLstMain.Images.Item(imgindex)
Case 2
imgindex = ImgLstMain.Images.IndexOfKey(SyncTrue.png)
If imgindex = -1 Then Return
FtpIcon_lab.Image = ImgLstMain.Images.Item(imgindex)
End Select
End If
End Sub
Public ricLabelGrb_li As New List(Of Control)
Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
@@ -2423,33 +2424,33 @@ Public Class FrmMain
' Try
'生成文件夹
If CreateXmlPath() Then
'先运行规则检查
ruleCheckReslut = _grdModel.StartGobleRuleCheck(ruleCheck_ErrCnt, ruleCheck_WarningCnt)
'先运行规则检查
ruleCheckReslut = _grdModel.StartGobleRuleCheck(ruleCheck_ErrCnt, ruleCheck_WarningCnt)
'如果规则检查有错误则不允许编译
If ruleCheck_ErrCnt > 0 Then
MsgBox("规则检测不通过,请逐项处理后重新编译!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "编译失败..")
Return False
'如果规则检查有错误则不允许编译
If ruleCheck_ErrCnt > 0 Then
MsgBox("规则检测不通过,请逐项处理后重新编译!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "编译失败..")
Return False
Else
'填充配置信息
'_grdModel._ConfigInf
If _grdModel.Compile(compileErrMsg, savePath dic) = True Then
_grdModel.Save(savePath) '保存配置文件
If IsShowCompileResult Then MsgBox($"编译完成, 配置版本号:" & _grdModel._ConfigInfo.CfgFileVersion)
Return True
Else
'填充配置信息
'_grdModel._ConfigInf
If _grdModel.Compile(compileErrMsg, savePath dic) = True Then
_grdModel.Save(savePath) '保存配置文件
If IsShowCompileResult Then MsgBox($"编译完成, 配置版本号:" & _grdModel._ConfigInfo.CfgFileVersion)
Return True
Else
MsgBox(compileErrMsg, MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "编译失败.")
Return False
End If
MsgBox(compileErrMsg, MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "编译失败.")
Return False
End If
End If
End If
'Catch ex As Exception
' MsgBox($"编译失败,{ex.Message}")
' Return False
'End Try
'Catch ex As Exception
' MsgBox($"编译失败,{ex.Message}")
' Return False
'End Try
Return True
Return True
End Function
@@ -4649,8 +4650,8 @@ Public Class FrmMain
MsgBox("编译失败!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "创建项目文件失败..")
Return False
End If
Catch ex As exception
msgbox($"编译失败,{ex.message}")
Catch ex As Exception
MsgBox($"编译失败,{ex.Message}")
Return False
End Try
@@ -5156,18 +5157,301 @@ Public Class FrmMain
End Function
Private Sub ToolStripButton19_Click(sender As Object, e As EventArgs) Handles ToolStripButton19.Click
If Releaseflag And Not IsNothing(TvwMain.SelectedNode) Then
Else
MsgBox("请选择发布节点")
Return
End If
Dim TrNode As TreeNode = TvwMain.SelectedNode
If TrNode.Level > 1 Then
TrNode = TrNode.Parent
End If
Dim FirmwareVer As String = TrNode.FirstNode.NextNode.NextNode.Text ' TrNode.NextVisibleNode.NextNode.Text
Dim FVer As Integer = 0
If Not String.IsNullOrEmpty(FirmwareVer) Then
Dim Firbuf As String() = FirmwareVer.Split("_")
If Firbuf.Length > 3 Then
FVer = Convert.ToInt32(Firbuf(3))
End If
End If
UploadDeviceList(FVer)
End Sub
Public Sub UploadDeviceList(pzVer As Integer)
' 1. 参数验证
If Not Releaseflag OrElse IsNothing(TvwMain.SelectedNode) Then
MsgBox("请选择发布节点")
Return
End If
If IsNothing(_TableInteraction) Then
MsgBox("未选择模型")
Return
End If
Try
' 2. 获取数据
Dim aaa = _TableInteraction.TestReportingScenario1()
If IsNothing(aaa) Then
MsgBox("请先配置逻辑表")
Return
End If
' 3. 序列化 JSON
Dim device_list_json As String = JsonConvert.SerializeObject(aaa.TDevicemodel)
Dim hotel_id As Integer = _project.HotelIndex
Dim roomtype_id As Integer = _project.RoomType(g_CurrentTreeNodeRoomTypeItemIndex).structRoomType_ID
Dim createTime As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
' 5. 使用参数化查询
Dim insertStr As String = "INSERT INTO `blv_rcu_db`.`tbl_room_type_device` " &
"(`hotel_id`, `roomtype_id`, `device_list_json`, `version`, `create_time`) " &
"VALUES (@hotel_id, @roomtype_id, @device_list_json, @version, @create_time)"
Using db As New DbExecutor(DbExecutor.DbTypeEnum.Mysql, DbConnString)
db.Open()
' 清空可能存在的旧参数
db.ClearDbParameter()
'' 使用新的AddParameter方法添加参数
'db.AddParameter("@hotel_id", hotel_id)
'db.AddParameter("@roomtype_id", roomtype_id)
'db.AddParameter("@device_list_json", device_list_json)
'db.AddParameter("@version", pzVer)
'db.AddParameter("@create_time", createTime)
' 使用明确的类型
db.AddParameter("@hotel_id", hotel_id, DbType.Int32)
db.AddParameter("@roomtype_id", roomtype_id, DbType.Int32)
db.AddParameter("@device_list_json", device_list_json, DbType.String)
db.AddParameter("@version", pzVer, DbType.Int32)
db.AddParameter("@create_time", createTime, DbType.DateTime)
' 执行插入操作
Dim result As Integer = db.ExecuteNonQuery(insertStr)
db.Close()
If result > 0 Then
MsgBox("设备列表上传成功")
Else
MsgBox("设备列表上传失败")
End If
End Using
Catch ex As Exception
MsgBox($"上传设备列表时发生错误: {ex.Message}")
' 记录详细错误日志
LogError($"UploadDeviceList error: {ex.Message}{Environment.NewLine}{ex.StackTrace}")
End Try
End Sub
' JSON验证函数
' 日志记录函数
Private Sub LogError(message As String)
Dim logPath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ErrorLog.txt")
Try
File.AppendAllText(logPath, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}{Environment.NewLine}{Environment.NewLine}")
Catch
' 日志写入失败时不抛出异常
End Try
End Sub
Private Sub ToolStripButton23_Click(sender As Object, e As EventArgs) Handles ToolStripButton23.Click
If Releaseflag And Not IsNothing(TvwMain.SelectedNode) Then
Else
MsgBox("请选择发布节点")
Return
End If
Dim TrNode As TreeNode = TvwMain.SelectedNode
If TrNode.Level > 1 Then
TrNode = TrNode.Parent
End If
Dim FirmwareVer As String = TrNode.FirstNode.NextNode.NextNode.Text ' TrNode.NextVisibleNode.NextNode.Text
Dim FVer As Integer = 0
If Not String.IsNullOrEmpty(FirmwareVer) Then
Dim Firbuf As String() = FirmwareVer.Split("_")
If Firbuf.Length > 3 Then
FVer = Convert.ToInt32(Firbuf(3))
End If
End If
UploadDeviceList1(FVer)
End Sub
Public Sub UploadDeviceList1(pzVer As Integer)
Dim headnode As RowNode
headnode = _grdModel._rootNode
Dim childnode, D485node, Virtualnode As RowNode
'初始化treeview控件
Console.WriteLine("初始化treeview控件")
' 1. 参数验证
If IsNothing(TvwMain.SelectedNode) Then
MsgBox("请选择发布节点")
Return
End If
childnode = headnode.Nodes(0)
childnode = childnode.Nodes(0)
D485node = childnode.Nodes(1)
Virtualnode = childnode.Nodes(2)
If IsNothing(_grdModel) OrElse IsNothing(_grdModel._rootNode) Then
MsgBox("未选择模型")
Return
End If
Dim li As List(Of UpdataDevnode) = New List(Of UpdataDevnode)
Dim hnode As UpdataDevnode = Extractnode(childnode, True)
li.Add(hnode)
For Each node In D485node.Nodes
For Each node2 In node.Nodes
li.Add(Extractnode(node2))
Next
Next
For Each node In Virtualnode.Nodes
For Each node2 In node.Nodes
li.Add(Extractnode(node2))
Next
Next
Try
' 3. 序列化 JSON
Dim device_list_json As String = JsonConvert.SerializeObject(li)
Dim hotel_id As Integer = _project.HotelIndex
Dim roomtype_id As Integer = _project.RoomType(g_CurrentTreeNodeRoomTypeItemIndex).structRoomType_ID
Dim createTime As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
' 5. 使用参数化查询
Dim insertStr As String = "INSERT INTO `blv_rcu_db`.`tbl_room_type_device` " &
"(`hotel_id`, `roomtype_id`, `device_list_json`, `version`, `create_time`,`format`) " &
"VALUES (@hotel_id, @roomtype_id, @device_list_json, @version, @create_time,@format)"
Using db As New DbExecutor(DbExecutor.DbTypeEnum.Mysql, DbConnString)
db.Open()
' 清空可能存在的旧参数
db.ClearDbParameter()
'' 使用新的AddParameter方法添加参数
'db.AddParameter("@hotel_id", hotel_id)
'db.AddParameter("@roomtype_id", roomtype_id)
'db.AddParameter("@device_list_json", device_list_json)
'db.AddParameter("@version", pzVer)
'db.AddParameter("@create_time", createTime)
' 使用明确的类型
db.AddParameter("@hotel_id", hotel_id, DbType.Int32)
db.AddParameter("@roomtype_id", roomtype_id, DbType.Int32)
db.AddParameter("@device_list_json", device_list_json, DbType.String)
db.AddParameter("@version", pzVer, DbType.Int32)
db.AddParameter("@create_time", createTime, DbType.DateTime)
db.AddParameter("@format", 0, DbType.Int32)
' 执行插入操作
Dim result As Integer = db.ExecuteNonQuery(insertStr)
db.Close()
If result > 0 Then
MsgBox("设备列表上传成功")
Else
MsgBox("设备列表上传失败")
End If
End Using
Catch ex As Exception
MsgBox($"上传设备列表时发生错误: {ex.Message}")
' 记录详细错误日志
LogError($"UploadDeviceList error: {ex.Message}{Environment.NewLine}{ex.StackTrace}")
End Try
End Sub
Public Function Extractnode(node As RowNode, Optional isRoot As Boolean = False) As UpdataDevnode
Dim updataDevnode As UpdataDevnode = New UpdataDevnode
updataDevnode.DevName = node.Text
updataDevnode.DevAttr = New Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, String)))
updataDevnode.DevFunc = New Dictionary(Of String, (String, Dictionary(Of String, (String, String))))
''遍历节点默认第一个节点为设备属性
For i As Integer = 0 To node.Nodes.Count - 1
If i = 0 Then
Dim attr As Dictionary(Of String, Dictionary(Of String, String)) = New Dictionary(Of String, Dictionary(Of String, String))
updataDevnode.DevAttr.Add(node.Nodes(i).Text, attr)
For j As Integer = 0 To node.Nodes(i).Nodes.Count - 1
Dim attr2 As Dictionary(Of String, String) = New Dictionary(Of String, String)
attr.Add(node.Nodes(i).Nodes(j).Text, attr2)
'继续遍历子节点
For k As Integer = 0 To node.Nodes(i).Nodes(j).Nodes.Count - 1
attr2.Add(node.Nodes(i).Nodes(j).Nodes(k).Text, node.Nodes(i).Nodes(j).Nodes(k).devicetype.ToString)
Next
Next
Else
'判断节点名称不能为"RS485"、"VirtualObject"
If node.Nodes(i).name <> "RS485" AndAlso node.Nodes(i).name <> "VirtualObject" Then
'遍历节点的子节点
Dim devtype As String = "0"
Dim tnodename As String
If isRoot Then
'"设备存在组:DO设备组信息"
tnodename = $"设备存在组:{node.Nodes(i).name}设备组信息"
If updataDevnode.DevAttr.Values(0).ContainsKey(tnodename) Then
If updataDevnode.DevAttr.Values(0)(tnodename).ContainsKey("存在:DeviceType") Then
devtype = updataDevnode.DevAttr.Values(0).Item(tnodename).Item("存在:DeviceType")
End If
End If
Else
devtype = node.Nodes(i).DEV_TYPE_DATA
End If
Dim func As Dictionary(Of String, (String, String)) = New Dictionary(Of String, (String, String))
' 功能块名 ,类型值 ,别名,序号
' Dictionary(Of String, (String, Dictionary(Of String, String)))
updataDevnode.DevFunc.Add(node.Nodes(i).Text, (devtype, func))
'Dim tag As AttributeRowNodeTag = node.Tag
For j As Integer = 0 To node.Nodes(i).Nodes.Count - 1
func.Add(node.Nodes(i).Nodes(j).Text, (node.Nodes(i).Nodes(j).index + 1, node.Nodes(i).Nodes(j).deviceAlias))
Next
End If
End If
Next
Return updataDevnode
End Function
@@ -5258,3 +5542,15 @@ Public Class RoomType
' Public Property RoomType_OldID As String
End Class
<Serializable>
Public Class UpdataDevnode
'设备名称
Public Property DevName As String
'设备属性列表
Public Property DevAttr As Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, String)))
'设备功能模块列表 功能模块名称,功能模块回路别名和回路序号 《设备功能名称,《设备类型 ,设备回路集合《回路名称,回路序号》》》
Public Property DevFunc As Dictionary(Of String, (String, Dictionary(Of String, (String, String))))
End Class

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
'通过使用 "*",如下所示:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("4.4.6.2")>
<Assembly: AssemblyFileVersion("4.4.6.2")>
<Assembly: AssemblyVersion("4.4.6.6")>
<Assembly: AssemblyFileVersion("4.4.6.6")>

View File

@@ -464,6 +464,7 @@ Public Class TableInteraction
'Case
' result = $"{buf(2)}"控制温控器
Case "Temp"
result = cellstr
If buf.Length > 5 AndAlso cbuf(7).Equals("控制温控器") Then
'cbuf = buf(3).Split(" ")
'result = $"{cbuf(cbuf.Length - 1)}"
@@ -4268,7 +4269,7 @@ Public Class TableInteraction
Dim btxtr As string
Dim bctr As Integer=32
If checkbuf(0).Equals("1") Then
If checkbuf(1).Equals("1") Then
bctr=bctr or (1<<2)
End If
If checkbuf(3).Equals("1") Then
@@ -4351,7 +4352,7 @@ Public Class TableInteraction
Dim btxtr As string
Dim bctr As Integer=32
If checkbuf(0).Equals("1") Then
If checkbuf(1).Equals("1") Then
bctr=bctr or (1<<2)
End If
If checkbuf(3).Equals("1") Then

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
<assemblyIdentity name="BLV_Studio.application" version="4.4.3.90" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" />
<description asmv2:publisher="chenzhihao" asmv2:product="宝易逻辑配置软件" xmlns="urn:schemas-microsoft-com:asm.v1" />
<deployment install="true" mapFileExtensions="true" minimumRequiredVersion="4.0.0.5" co.v1:createDesktopShortcut="true">
<subscription>
<update>
<beforeApplicationStartup />
</update>
</subscription>
<deploymentProvider codebase="http://auth.blv-oa.com/Apps/BLV_Studio/BLV_Studio.application" />
</deployment>
<compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
<framework targetVersion="4.8" profile="Full" supportedRuntime="4.0.30319" />
</compatibleFrameworks>
<dependency>
<dependentAssembly dependencyType="install" codebase="Application Files\BLV_Studio_4_4_3_90\BLV_Studio.exe.manifest" size="37870">
<assemblyIdentity name="BLV_Studio.exe" version="4.4.3.90" publicKeyToken="0000000000000000" language="neutral" processorArchitecture="msil" type="win32" />
<hash>
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>HOeGFkhw5Tl0DB6eJ8xSqJpiEqVXFXqlbkM3+T76Obo=</dsig:DigestValue>
</hash>
</dependentAssembly>
</dependency>
</asmv1:assembly>

View File

@@ -1,163 +0,0 @@
<HTML>
<HEAD>
<TITLE>宝易逻辑配置软件</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" />
<STYLE TYPE="text/css">
<!--
BODY{margin-top:20px; margin-left:20px; margin-right:20px; color:#000000; font-family:Tahoma; background-color:white}
A:link {font-weight:normal; color:#000066; text-decoration:none}
A:visited {font-weight:normal; color:#000066; text-decoration:none}
A:active {font-weight:normal; text-decoration:none}
A:hover {font-weight:normal; color:#FF6600; text-decoration:none}
P {margin-top:0px; margin-bottom:12px; color:#000000; font-family:Tahoma}
PRE {border-right:#f0f0e0 1px solid; padding-right:5px; border-top:#f0f0e0 1px solid; margin-top:-5px; padding-left:5px; font-size:x-small; padding-bottom:5px; border-left:#f0f0e0 1px solid; padding-top:5px; border-bottom:#f0f0e0 1px solid; font-family:Courier New; background-color:#e5e5cc}
TD {font-size:12px; color:#000000; font-family:Tahoma}
H2 {border-top: #003366 1px solid; margin-top:25px; font-weight:bold; font-size:1.5em; margin-bottom:10px; margin-left:-15px; color:#003366}
H3 {margin-top:10px; font-size: 1.1em; margin-bottom: 10px; margin-left: -15px; color: #000000}
UL {margin-top:10px; margin-left:20px}
OL {margin-top:10px; margin-left:20px}
LI {margin-top:10px; color: #000000}
FONT.value {font-weight:bold; color:darkblue}
FONT.key {font-weight: bold; color: darkgreen}
.divTag {border:1px; border-style:solid; background-color:#FFFFFF; text-decoration:none; height:auto; width:auto; background-color:#cecece}
.BannerColumn {background-color:#000000}
.Banner {border:0; padding:0; height:8px; margin-top:0px; color:#ffffff; filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1,StartColorStr='#1c5280',EndColorStr='#FFFFFF');}
.BannerTextCompany {font:bold; font-size:18pt; color:#cecece; font-family:Tahoma; height:0px; margin-top:0; margin-left:8px; margin-bottom:0; padding:0px; white-space:nowrap; filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2,OffY=2,Color='black',Positive='true');}
.BannerTextApplication {font:bold; font-size:18pt; font-family:Tahoma; height:0px; margin-top:0; margin-left:8px; margin-bottom:0; padding:0px; white-space:nowrap; filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2,OffY=2,Color='black',Positive='true');}
.BannerText {font:bold; font-size:18pt; font-family:Tahoma; height:0px; margin-top:0; margin-left:8px; margin-bottom:0; padding:0px; filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2,OffY=2,Color='black',Positive='true');}
.BannerSubhead {border:0; padding:0; height:16px; margin-top:0px; margin-left:10px; color:#ffffff; filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1,StartColorStr='#4B3E1A',EndColorStr='#FFFFFF');}
.BannerSubheadText {font:bold; height:11px; font-size:11px; font-family:Tahoma; margin-top:1; margin-left:10; filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2,OffY=2,Color='black',Positive='true');}
.FooterRule {border:0; padding:0; height:1px; margin:0px; color:#ffffff; filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1,StartColorStr='#4B3E1A',EndColorStr='#FFFFFF');}
.FooterText {font-size:11px; font-weight:normal; text-decoration:none; font-family:Tahoma; margin-top:10; margin-left:0px; margin-bottom:2; padding:0px; color:#999999; white-space:nowrap}
.FooterText A:link {font-weight:normal; color:#999999; text-decoration:underline}
.FooterText A:visited {font-weight:normal; color:#999999; text-decoration:underline}
.FooterText A:active {font-weight:normal; color:#999999; text-decoration:underline}
.FooterText A:hover {font-weight:normal; color:#FF6600; text-decoration:underline}
.ClickOnceInfoText {font-size:11px; font-weight:normal; text-decoration:none; font-family:Tahoma; margin-top:0; margin-right:2px; margin-bottom:0; padding:0px; color:#000000}
.InstallTextStyle {font:bold; font-size:14pt; font-family:Tahoma; a:#FF0000; text-decoration:None}
.DetailsStyle {margin-left:30px}
.ItemStyle {margin-left:-15px; font-weight:bold}
.StartColorStr {background-color:#4B3E1A}
.JustThisApp A:link {font-weight:normal; color:#000066; text-decoration:underline}
.JustThisApp A:visited {font-weight:normal; color:#000066; text-decoration:underline}
.JustThisApp A:active {font-weight:normal; text-decoration:underline}
.JustThisApp A:hover {font-weight:normal; color:#FF6600; text-decoration:underline}
-->
</STYLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
runtimeVersion = "4.8.0";
checkClient = false;
directLink = "BLV_Studio.application";
function Initialize()
{
if (HasRuntimeVersion(runtimeVersion, false) || (checkClient && HasRuntimeVersion(runtimeVersion, checkClient)))
{
InstallButton.href = directLink;
BootstrapperSection.style.display = "none";
}
}
function HasRuntimeVersion(v, c)
{
var va = GetVersion(v);
var i;
var a = navigator.userAgent.match(/\.NET CLR [0-9.]+/g);
if(va[0]==4)
a = navigator.userAgent.match(/\.NET[0-9.]+E/g);
if (c)
{
a = navigator.userAgent.match(/\.NET Client [0-9.]+/g);
if (va[0]==4)
a = navigator.userAgent.match(/\.NET[0-9.]+C/g);
}
if (a != null)
for (i = 0; i < a.length; ++i)
if (CompareVersions(va, GetVersion(a[i])) <= 0)
return true;
return false;
}
function GetVersion(v)
{
var a = v.match(/([0-9]+)\.([0-9]+)\.([0-9]+)/i);
if(a==null)
a = v.match(/([0-9]+)\.([0-9]+)/i);
return a.slice(1);
}
function CompareVersions(v1, v2)
{
if(v1.length>v2.length)
{
v2[v2.length]=0;
}
else if(v1.length<v2.length)
{
v1[v1.length]=0;
}
for (i = 0; i < v1.length; ++i)
{
var n1 = new Number(v1[i]);
var n2 = new Number(v2[i]);
if (n1 < n2)
return -1;
if (n1 > n2)
return 1;
}
return 0;
}
-->
</SCRIPT>
</HEAD>
<BODY ONLOAD="Initialize()">
<TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="2" BORDER="0">
<!-- Begin Banner -->
<TR><TD><TABLE CELLPADDING="2" CELLSPACING="0" BORDER="0" BGCOLOR="#cecece" WIDTH="100%"><TR><TD><TABLE BGCOLOR="#1c5280" WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR><TD CLASS="Banner" /></TR><TR><TD CLASS="Banner"><SPAN CLASS="BannerTextCompany">chenzhihao</SPAN></TD></TR><TR><TD CLASS="Banner"><SPAN CLASS="BannerTextApplication">宝易逻辑配置软件</SPAN></TD></TR><TR><TD CLASS="Banner" ALIGN="RIGHT" /></TR></TABLE></TD></TR></TABLE></TD></TR>
<!-- End Banner -->
<!-- Begin Dialog -->
<TR><TD ALIGN="LEFT"><TABLE CELLPADDING="2" CELLSPACING="0" BORDER="0" WIDTH="540"><TR><TD WIDTH="496">
<!-- Begin AppInfo -->
<TABLE><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>名称: </B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>宝易逻辑配置软件</TD></TR><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>版本: </B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>4.4.3.90</TD></TR><TR><TD COLSPAN="3">&nbsp;</TD></TR><TR><TD><B>发行者: </B></TD><TD WIDTH="5"><SPACER TYPE="block" WIDTH="10" /></TD><TD>chenzhihao</TD></TR><tr><td colspan="3">&nbsp;</td></tr></TABLE>
<!-- End AppInfo -->
<!-- Begin Prerequisites -->
<TABLE ID="BootstrapperSection" BORDER="0"><TR><TD COLSPAN="2">以下系统必备组件是必需的: </TD></TR><TR><TD WIDTH="10">&nbsp;</TD><TD><UL>
<LI>Microsoft .NET Framework 4.8 (x86 和 x64)</LI>
</UL></TD></TR><TR><TD COLSPAN="2">
如果已经安装了这些组件,您可以立即<SPAN CLASS="JustThisApp"><A HREF="BLV_Studio.application">启动</A></SPAN>该应用程序。否则,请单击下面的按钮,安装系统必备组件并运行该应用程序。
</TD></TR><TR><TD COLSPAN="2">&nbsp;</TD></TR></TABLE>
<!-- End Prerequisites -->
</TD></TR></TABLE>
<!-- Begin Buttons -->
<TR><TD ALIGN="LEFT"><TABLE CELLPADDING="2" CELLSPACING="0" BORDER="0" WIDTH="540" STYLE="cursor:hand" ONCLICK="window.navigate(InstallButton.href)"><TR><TD ALIGN="LEFT"><TABLE CELLPADDING="1" BGCOLOR="#333333" CELLSPACING="0" BORDER="0"><TR><TD><TABLE CELLPADDING="1" BGCOLOR="#cecece" CELLSPACING="0" BORDER="0"><TR><TD><TABLE CELLPADDING="1" BGCOLOR="#efefef" CELLSPACING="0" BORDER="0"><TR><TD WIDTH="20"><SPACER TYPE="block" WIDTH="20" HEIGHT="1" /></TD><TD><A ID="InstallButton" HREF="setup.exe">安装</A></TD><TD width="20"><SPACER TYPE="block" WIDTH="20" HEIGHT="1" /></TD></TR></TABLE></TD></TR></TABLE></TD></TR></TABLE></TD><TD WIDTH="15%" ALIGN="right" /></TR></TABLE></TD></TR>
<!-- End Buttons -->
</TD></TR>
<!-- End Dialog -->
<!-- Spacer Row -->
<TR><TD>&nbsp;</TD></TR>
<TR><TD>
<!-- Begin Footer -->
<TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0" BGCOLOR="#ffffff"><TR><TD HEIGHT="5"><SPACER TYPE="block" HEIGHT="5" /></TD></TR><TR><TD CLASS="FooterText" ALIGN="center"><A HREF="https://go.microsoft.com/fwlink/?LinkId=154571">ClickOnce 和 .NET Framework 资源</A>
</TD></TR><TR><TD HEIGHT="5"><SPACER TYPE="block" HEIGHT="5" /></TD></TR><TR><TD HEIGHT="1" bgcolor="#cecece"><SPACER TYPE="block" HEIGHT="1" /></TD></TR></TABLE>
<!-- End Footer -->
</TD></TR>
</TABLE>
</BODY>
</HTML>

Binary file not shown.