From 55d5ea262506e17e92ecb86583b3545a94e1e906 Mon Sep 17 00:00:00 2001
From: yibo <361071264@qq.com>
Date: Wed, 27 Sep 2017 14:06:38 +0800
Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0=E5=AE=8C?=
=?UTF-8?q?=E5=96=84=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
AutoUpdate/AutoUpdate.csproj | 1 +
AutoUpdate/ClientVersion.cs | 68 +++++++
AutoUpdate/Update.Designer.cs | 64 ++++++-
AutoUpdate/Update.cs | 172 ++++++++++++++++--
B3ButcherManageClient.sln | 6 +
BO/Utils/LoginRpcUtil.cs | 6 -
BO/Utils/XmlUtil.cs | 23 ++-
ButcherManageClient/Login.cs | 27 ++-
ButcherOrder/ButcherOrderForm.Designer.cs | 19 +-
ButcherOrder/ButcherOrderForm.cs | 27 ++-
ButcherOrder/ButcherOrderForm.resx | 2 +-
CreateUpdateXmlFile/App.config | 6 +
CreateUpdateXmlFile/ClientVersion.cs | 47 +++++
.../CreateUpdateXmlFile.csproj | 89 +++++++++
CreateUpdateXmlFile/Form1.Designer.cs | 145 +++++++++++++++
CreateUpdateXmlFile/Form1.cs | 57 ++++++
CreateUpdateXmlFile/Form1.resx | 123 +++++++++++++
CreateUpdateXmlFile/Program.cs | 22 +++
.../Properties/AssemblyInfo.cs | 36 ++++
.../Properties/Resources.Designer.cs | 71 ++++++++
CreateUpdateXmlFile/Properties/Resources.resx | 117 ++++++++++++
.../Properties/Settings.Designer.cs | 30 +++
.../Properties/Settings.settings | 7 +
Setup/Release/Setup.msi | Bin 1314816 -> 1318400 bytes
24 files changed, 1112 insertions(+), 53 deletions(-)
create mode 100644 AutoUpdate/ClientVersion.cs
create mode 100644 CreateUpdateXmlFile/App.config
create mode 100644 CreateUpdateXmlFile/ClientVersion.cs
create mode 100644 CreateUpdateXmlFile/CreateUpdateXmlFile.csproj
create mode 100644 CreateUpdateXmlFile/Form1.Designer.cs
create mode 100644 CreateUpdateXmlFile/Form1.cs
create mode 100644 CreateUpdateXmlFile/Form1.resx
create mode 100644 CreateUpdateXmlFile/Program.cs
create mode 100644 CreateUpdateXmlFile/Properties/AssemblyInfo.cs
create mode 100644 CreateUpdateXmlFile/Properties/Resources.Designer.cs
create mode 100644 CreateUpdateXmlFile/Properties/Resources.resx
create mode 100644 CreateUpdateXmlFile/Properties/Settings.Designer.cs
create mode 100644 CreateUpdateXmlFile/Properties/Settings.settings
diff --git a/AutoUpdate/AutoUpdate.csproj b/AutoUpdate/AutoUpdate.csproj
index 400953e..cfcccd4 100644
--- a/AutoUpdate/AutoUpdate.csproj
+++ b/AutoUpdate/AutoUpdate.csproj
@@ -44,6 +44,7 @@
+
diff --git a/AutoUpdate/ClientVersion.cs b/AutoUpdate/ClientVersion.cs
new file mode 100644
index 0000000..f06016b
--- /dev/null
+++ b/AutoUpdate/ClientVersion.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+
+namespace AutoUpdate
+{
+ public class ClientVersion
+ {
+ public string Version { get; set; }
+
+ public string ServerUrl { get; set; }
+
+ private List _update = new List();
+ public List UpdateFiles { get { return _update; } set { _update = value; } }
+ }
+
+ public class UpdateFile
+ {
+ public string FileName { get; set; }
+
+ public string Url { get; set; }
+
+ public int Size { get; set; }
+
+ public bool NeedRestart { get; set; }
+ }
+
+ public static class XmlUtil
+ {
+ public static T XmlDeserializeObject(string xmlOfObject) where T : class
+ {
+ using (MemoryStream ms = new MemoryStream())
+ {
+ using (StreamWriter sr = new StreamWriter(ms, Encoding.UTF8))
+ {
+ sr.Write(xmlOfObject);
+ sr.Flush();
+ ms.Seek(0, SeekOrigin.Begin);
+ XmlSerializer serializer = new XmlSerializer(typeof(T));
+ return serializer.Deserialize(ms) as T;
+ }
+ }
+ }
+
+ public static T DeserializeFromFile(string fileName = "")
+ {
+ if (string.IsNullOrWhiteSpace(fileName))
+ {
+ fileName = typeof(T).Name + ".xml";
+ }
+ if (!File.Exists(fileName))
+ {
+ throw new FileNotFoundException("不存在文件:" + fileName);
+ }
+ using (var reader = new StreamReader(fileName))
+ {
+ var xs = new XmlSerializer(typeof(T));
+ object obj = xs.Deserialize(reader);
+ reader.Close();
+ return (T)obj;
+ }
+ }
+ }
+}
diff --git a/AutoUpdate/Update.Designer.cs b/AutoUpdate/Update.Designer.cs
index eca2b38..84b6cc0 100644
--- a/AutoUpdate/Update.Designer.cs
+++ b/AutoUpdate/Update.Designer.cs
@@ -28,24 +28,82 @@
///
private void InitializeComponent()
{
+ this.progressBarTotal = new System.Windows.Forms.ProgressBar();
+ this.progressBarCurrent = new System.Windows.Forms.ProgressBar();
+ this.labelCurrentItem = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.labelCurrent = new System.Windows.Forms.Label();
this.SuspendLayout();
//
+ // progressBarTotal
+ //
+ this.progressBarTotal.Location = new System.Drawing.Point(28, 81);
+ this.progressBarTotal.Name = "progressBarTotal";
+ this.progressBarTotal.Size = new System.Drawing.Size(438, 12);
+ this.progressBarTotal.Step = 1;
+ this.progressBarTotal.TabIndex = 6;
+ //
+ // progressBarCurrent
+ //
+ this.progressBarCurrent.Location = new System.Drawing.Point(27, 42);
+ this.progressBarCurrent.Name = "progressBarCurrent";
+ this.progressBarCurrent.Size = new System.Drawing.Size(438, 12);
+ this.progressBarCurrent.Step = 1;
+ this.progressBarCurrent.TabIndex = 7;
+ //
+ // labelCurrentItem
+ //
+ this.labelCurrentItem.AutoSize = true;
+ this.labelCurrentItem.Location = new System.Drawing.Point(97, 27);
+ this.labelCurrentItem.Name = "labelCurrentItem";
+ this.labelCurrentItem.Size = new System.Drawing.Size(0, 12);
+ this.labelCurrentItem.TabIndex = 3;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(26, 66);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(53, 12);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "总进度:";
+ //
+ // labelCurrent
+ //
+ this.labelCurrent.AutoSize = true;
+ this.labelCurrent.Location = new System.Drawing.Point(26, 27);
+ this.labelCurrent.Name = "labelCurrent";
+ this.labelCurrent.Size = new System.Drawing.Size(65, 12);
+ this.labelCurrent.TabIndex = 5;
+ this.labelCurrent.Text = "正在下载:";
+ //
// Update
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(580, 148);
+ this.ClientSize = new System.Drawing.Size(483, 134);
+ this.ControlBox = false;
+ this.Controls.Add(this.progressBarTotal);
+ this.Controls.Add(this.progressBarCurrent);
+ this.Controls.Add(this.labelCurrentItem);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.labelCurrent);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.MaximizeBox = false;
- this.MinimizeBox = false;
this.Name = "Update";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "自动更新";
this.Load += new System.EventHandler(this.Update_Load);
this.ResumeLayout(false);
+ this.PerformLayout();
}
#endregion
+
+ private System.Windows.Forms.ProgressBar progressBarTotal;
+ private System.Windows.Forms.ProgressBar progressBarCurrent;
+ private System.Windows.Forms.Label labelCurrentItem;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label labelCurrent;
}
}
\ No newline at end of file
diff --git a/AutoUpdate/Update.cs b/AutoUpdate/Update.cs
index d4f60b8..5616591 100644
--- a/AutoUpdate/Update.cs
+++ b/AutoUpdate/Update.cs
@@ -8,6 +8,7 @@ using System.IO;
using System.Linq;
using System.Net;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -15,29 +16,172 @@ namespace AutoUpdate
{
public partial class Update : Form
{
- string[] updateInfo;
+ const string serUri = "http://172.28.1.194:7799/AutoUpdate/ClientVersion.xml";
+ const string PuKey = "c756e02cedb42a33f78091a466411bde8447d854";
+ private bool isFinished = false;
+ private List downloadFileList = null;
+ private ManualResetEvent evtDownload = null;
+ private ManualResetEvent evtPerDonwload = null;
+ private WebClient clientDownload = null;
+ bool error = false;
public Update(string[] args)
{
InitializeComponent();
- updateInfo = args;
+ if (args == null || args.Length == 0 || args[0] != PuKey)
+ error = true;
}
private void Update_Load(object sender, EventArgs e)
{
- if (updateInfo != null && updateInfo.Length > 0)
+ if (error)
+ Application.Exit();
+ var versionFile = "ClientVersion.xml";
+ ClientVersion old = new ClientVersion();
+ if (File.Exists(versionFile))
+ old = XmlUtil.DeserializeFromFile(versionFile);
+ if (string.IsNullOrEmpty(old.ServerUrl))
+ old.ServerUrl = serUri;
+
+ clientDownload = new WebClient();
+ var version = XmlUtil.XmlDeserializeObject(clientDownload.DownloadString(old.ServerUrl));
+ downloadFileList = version.UpdateFiles;
+
+ evtDownload = new ManualResetEvent(true);
+ evtDownload.Reset();
+ Thread t = new Thread(new ThreadStart(ProcDownload));
+ t.Name = "download";
+ t.Start();
+ }
+
+ long total = 0;
+ long nDownloadedTotal = 0;
+ string startFile = "ButcherManageClient.exe";
+ string oldFolder;
+ private void ProcDownload()
+ {
+ evtPerDonwload = new ManualResetEvent(false);
+
+ foreach (var file in this.downloadFileList)
+ {
+ total += file.Size;
+ }
+ oldFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "old");
+ if (!Directory.Exists(oldFolder))
+ Directory.CreateDirectory(oldFolder);
+
+ while (!evtDownload.WaitOne(0, false))
+ {
+ if (this.downloadFileList.Count == 0)
+ break;
+
+ var file = this.downloadFileList[0];
+ if (file.NeedRestart)
+ startFile = file.FileName;
+
+ this.ShowCurrentDownloadFileName(file.FileName);
+
+ //下载
+ clientDownload = new WebClient();
+
+ clientDownload.DownloadProgressChanged += new DownloadProgressChangedEventHandler(OnDownloadProgressChanged);
+ clientDownload.DownloadFileCompleted += new AsyncCompletedEventHandler(OnDownloadFileCompleted);
+
+ evtPerDonwload.Reset();
+
+ clientDownload.DownloadFileAsync(new Uri(file.Url), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, file.FileName + ".tmp"), file);
+
+ //等待下载完成
+ evtPerDonwload.WaitOne();
+
+ clientDownload.Dispose();
+ clientDownload = null;
+
+ //移除已下载的文件
+ this.downloadFileList.Remove(file);
+ }
+
+ if (this.downloadFileList.Count == 0)
+ {
+ Exit(true);
+ evtDownload.Set();
+ Process.Start(Path.Combine(Application.StartupPath, startFile));
+ Application.Exit();
+ }
+ else
+ Exit(false);
+
+ evtDownload.Set();
+ }
+
+ void OnDownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
+ {
+ var file = e.UserState as UpdateFile;
+ nDownloadedTotal += file.Size;
+ this.SetProcessBar(0, (int)(nDownloadedTotal * 100 / total));
+ //备份文件
+ string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, file.FileName);
+ var oldFile = Path.Combine(oldFolder, file.FileName);
+ if (File.Exists(filePath))
+ {
+ if (File.Exists(oldFile))
+ File.Delete(oldFile);
+
+ File.Move(filePath, oldFile);
+ }
+
+ File.Move(filePath + ".tmp", filePath);
+ //继续下载其它文件
+ evtPerDonwload.Set();
+ }
+
+ void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
+ {
+ this.SetProcessBar(e.ProgressPercentage, (int)((nDownloadedTotal + e.BytesReceived) * 100 / total));
+ }
+
+ delegate void ShowCurrentDownloadFileNameCallBack(string name);
+ private void ShowCurrentDownloadFileName(string name)
+ {
+ if (this.labelCurrentItem.InvokeRequired)
+ {
+ ShowCurrentDownloadFileNameCallBack cb = new ShowCurrentDownloadFileNameCallBack(ShowCurrentDownloadFileName);
+ this.Invoke(cb, new object[] { name });
+ }
+ else
+ {
+ this.labelCurrentItem.Text = name;
+ }
+ }
+
+ delegate void SetProcessBarCallBack(int current, int total);
+ private void SetProcessBar(int current, int total)
+ {
+ if (this.progressBarCurrent.InvokeRequired)
+ {
+ SetProcessBarCallBack cb = new SetProcessBarCallBack(SetProcessBar);
+ this.Invoke(cb, new object[] { current, total });
+ }
+ else
+ {
+ this.progressBarCurrent.Value = current;
+ this.progressBarTotal.Value = total;
+ }
+ }
+
+ delegate void ExitCallBack(bool success);
+ private void Exit(bool success)
+ {
+ if (this.InvokeRequired)
+ {
+ ExitCallBack cb = new ExitCallBack(Exit);
+ this.Invoke(cb, new object[] { success });
+ }
+ else
{
- var parameters = updateInfo[0].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
- var serverUrl = parameters[0];
- var files = parameters[1].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
- foreach (var file in files)
- {
- var path = serverUrl + file;
- var clientDownload = new WebClient();
- clientDownload.DownloadFileAsync(new Uri(path), file);
- }
+ this.isFinished = success;
+ this.DialogResult = success ? DialogResult.OK : DialogResult.Cancel;
+ this.Close();
}
- Process.Start(Path.Combine(Application.StartupPath, "ButcherManageClient.exe"));
- Application.Exit();
}
}
}
diff --git a/B3ButcherManageClient.sln b/B3ButcherManageClient.sln
index d4ef8a1..ed54cc3 100644
--- a/B3ButcherManageClient.sln
+++ b/B3ButcherManageClient.sln
@@ -21,6 +21,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WeighAndGrading", "WeighAnd
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoUpdate", "AutoUpdate\AutoUpdate.csproj", "{5751AEE3-83BD-4CBE-8E65-0727FEC0F6C4}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreateUpdateXmlFile", "CreateUpdateXmlFile\CreateUpdateXmlFile.csproj", "{57BB1A02-118A-443D-A38A-BB36B9A77F6A}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -61,6 +63,10 @@ Global
{5751AEE3-83BD-4CBE-8E65-0727FEC0F6C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5751AEE3-83BD-4CBE-8E65-0727FEC0F6C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5751AEE3-83BD-4CBE-8E65-0727FEC0F6C4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {57BB1A02-118A-443D-A38A-BB36B9A77F6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {57BB1A02-118A-443D-A38A-BB36B9A77F6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {57BB1A02-118A-443D-A38A-BB36B9A77F6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {57BB1A02-118A-443D-A38A-BB36B9A77F6A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/BO/Utils/LoginRpcUtil.cs b/BO/Utils/LoginRpcUtil.cs
index f6e902c..c50db0a 100644
--- a/BO/Utils/LoginRpcUtil.cs
+++ b/BO/Utils/LoginRpcUtil.cs
@@ -43,11 +43,5 @@ namespace BO.Utils
userInfo.Role = obj.Get("Role");
}
}
-
- public static string CheckVersion(string version)
- {
- const string method = "/MainSystem/B3ClientService/Rpcs/VersionRpc/CheckVersion";
- return RpcFacade.Call(method, version);
- }
}
}
diff --git a/BO/Utils/XmlUtil.cs b/BO/Utils/XmlUtil.cs
index 5a886e9..38c65fd 100644
--- a/BO/Utils/XmlUtil.cs
+++ b/BO/Utils/XmlUtil.cs
@@ -23,7 +23,6 @@ namespace BO.Utils
}
}
-
public static T DeserializeFromFile(string fileName = "")
{
if (string.IsNullOrWhiteSpace(fileName))
@@ -42,5 +41,27 @@ namespace BO.Utils
return (T)obj;
}
}
+
+ public static T XmlDeserializeObject(string xmlOfObject) where T : class
+ {
+ using (MemoryStream ms = new MemoryStream())
+ {
+ using (StreamWriter sr = new StreamWriter(ms, Encoding.UTF8))
+ {
+ sr.Write(xmlOfObject);
+ sr.Flush();
+ ms.Seek(0, SeekOrigin.Begin);
+ XmlSerializer serializer = new XmlSerializer(typeof(T));
+ return serializer.Deserialize(ms) as T;
+ }
+ }
+ }
+ }
+
+ public class ClientVersion
+ {
+ public string Version { get; set; }
+
+ public string ServerUrl { get; set; }
}
}
diff --git a/ButcherManageClient/Login.cs b/ButcherManageClient/Login.cs
index 0ebc347..ed50240 100644
--- a/ButcherManageClient/Login.cs
+++ b/ButcherManageClient/Login.cs
@@ -99,31 +99,30 @@ namespace ButcherManageClient
pwdTxt.Text = keyBoard.Result;
}
+ const string serUri = "http://172.28.1.194:7799/AutoUpdate/ClientVersion.xml";
+ const string puKey = "c756e02cedb42a33f78091a466411bde8447d854";
private void AutoUpdate()
{
if (!File.Exists("AutoUpdate.exe"))
return;
- var version = string.Empty;
- if (File.Exists("Version.txt"))
- {
- version = File.ReadAllText("Version.txt");
- }
- IniteRpcFacade();
- var files = LoginRpcUtil.CheckVersion(version);
- if (string.IsNullOrEmpty(files))
+ var versionInfo = new ClientVersion();
+ if (File.Exists("ClientVersion.xml"))
+ versionInfo = XmlUtil.DeserializeFromFile();
+ if (string.IsNullOrEmpty(versionInfo.ServerUrl))
+ versionInfo.ServerUrl = serUri;
+
+ var down = new System.Net.WebClient();
+ var serverVersion = XmlUtil.XmlDeserializeObject(down.DownloadString(versionInfo.ServerUrl));
+ if (versionInfo.Version == serverVersion.Version)
return;
- var serverUrl = ButcherAppContext.Context.UrlConfig.ServerUrl.Replace("Rest.aspx", "");
- if (!serverUrl.EndsWith("/"))
- serverUrl += "/";
- serverUrl += "ClientVersion/";
- System.Diagnostics.Process.Start(Path.Combine(Application.StartupPath, "AutoUpdate.exe"), serverUrl + "|" + files);
+ System.Diagnostics.Process.Start(Path.Combine(Application.StartupPath, "AutoUpdate.exe"), puKey);
Application.Exit();
}
private void Login_Load(object sender, EventArgs e)
{
- //AutoUpdate();
+ AutoUpdate();
}
}
}
diff --git a/ButcherOrder/ButcherOrderForm.Designer.cs b/ButcherOrder/ButcherOrderForm.Designer.cs
index 476e59f..8481133 100644
--- a/ButcherOrder/ButcherOrderForm.Designer.cs
+++ b/ButcherOrder/ButcherOrderForm.Designer.cs
@@ -48,7 +48,7 @@
this.ID = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.OrderDetail_ID = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.IsOk = new System.Windows.Forms.DataGridViewTextBoxColumn();
- this.Ordre = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.Order = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.PlanNumber = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.HotFadeNumber = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.updateBtn = new System.Windows.Forms.DataGridViewButtonColumn();
@@ -175,7 +175,7 @@
this.ID,
this.OrderDetail_ID,
this.IsOk,
- this.Ordre,
+ this.Order,
this.PlanNumber,
this.HotFadeNumber,
this.updateBtn,
@@ -193,6 +193,7 @@
this.secondOrderGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.secondOrderGridView.Size = new System.Drawing.Size(513, 569);
this.secondOrderGridView.TabIndex = 12;
+ this.secondOrderGridView.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.secondOrderGridView_CellClick);
this.secondOrderGridView.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.secondOrderGridView_CellContentClick);
//
// uDatePicker1
@@ -233,13 +234,13 @@
this.IsOk.ReadOnly = true;
this.IsOk.Visible = false;
//
- // Ordre
+ // Order
//
- this.Ordre.DataPropertyName = "Order";
- this.Ordre.HeaderText = "顺序号";
- this.Ordre.Name = "Ordre";
- this.Ordre.ReadOnly = true;
- this.Ordre.Width = 110;
+ this.Order.DataPropertyName = "Order";
+ this.Order.HeaderText = "顺序号";
+ this.Order.Name = "Order";
+ this.Order.ReadOnly = true;
+ this.Order.Width = 110;
//
// PlanNumber
//
@@ -322,7 +323,7 @@
private System.Windows.Forms.DataGridViewTextBoxColumn ID;
private System.Windows.Forms.DataGridViewTextBoxColumn OrderDetail_ID;
private System.Windows.Forms.DataGridViewTextBoxColumn IsOk;
- private System.Windows.Forms.DataGridViewTextBoxColumn Ordre;
+ private System.Windows.Forms.DataGridViewTextBoxColumn Order;
private System.Windows.Forms.DataGridViewTextBoxColumn PlanNumber;
private System.Windows.Forms.DataGridViewTextBoxColumn HotFadeNumber;
private System.Windows.Forms.DataGridViewButtonColumn updateBtn;
diff --git a/ButcherOrder/ButcherOrderForm.cs b/ButcherOrder/ButcherOrderForm.cs
index 6744d74..f2bf0db 100644
--- a/ButcherOrder/ButcherOrderForm.cs
+++ b/ButcherOrder/ButcherOrderForm.cs
@@ -82,6 +82,7 @@ namespace ButcherOrder
BindGrid();
}
+ int? lastSelectOrder = null;
void BindGrid()
{
secondOrderGridView.DataSource = orderList.OrderBy(x => x.Order).OrderBy(x => x.IsOk).ToList();
@@ -89,6 +90,10 @@ namespace ButcherOrder
{
if ((bool)row.Cells["IsOk"].Value)
row.DefaultCellStyle.BackColor = Color.YellowGreen;
+ if (lastSelectOrder.HasValue && lastSelectOrder == (int?)row.Cells["Order"].Value)
+ {
+ row.Selected = true;
+ }
}
if (secondOrderGridView.CurrentRow != null)
{
@@ -101,6 +106,10 @@ namespace ButcherOrder
orderLabel.Text = "0";
InitScrollBar1();
secondOrderGridView.Refresh();
+ if (roll != -1)
+ {
+ secondOrderGridView.FirstDisplayedScrollingRowIndex = roll;// secondOrderGridView.Rows[roll].Index;
+ }
}
private void okBtn_Click(object sender, EventArgs e)
@@ -112,7 +121,7 @@ namespace ButcherOrder
var entity = secondOrderGridView.CurrentRow.DataBoundItem as SecondOrder;
if (entity.IsOk)
{
- var result = MessageBox.Show("当前行已更新\n确定要继续修改吗?","确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
+ var result = MessageBox.Show("当前行已更新\n确定要继续修改吗?", "确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (result != DialogResult.OK)
return;
}
@@ -140,8 +149,6 @@ namespace ButcherOrder
if (e.RowIndex == -1)
return;
var entity = secondOrderGridView.CurrentRow.DataBoundItem as SecondOrder;
- BindSelectColor(entity);
-
if (e.ColumnIndex < secondOrderGridView.ColumnCount - 2)
return;
@@ -163,6 +170,7 @@ namespace ButcherOrder
}
}
+ int roll = -1;
private void InitScrollBar1()
{
vScrollBar1.Maximum = (secondOrderGridView.RowCount - secondOrderGridView.DisplayedRowCount(false) + 30) * secondOrderGridView.RowTemplate.Height;
@@ -171,9 +179,18 @@ namespace ButcherOrder
vScrollBar1.LargeChange = secondOrderGridView.RowTemplate.Height * 30;
this.vScrollBar1.Scroll += (sender, e) =>
{
- secondOrderGridView.FirstDisplayedScrollingRowIndex = e.NewValue / secondOrderGridView.RowTemplate.Height;
- Application.DoEvents();
+ roll = e.NewValue / secondOrderGridView.RowTemplate.Height;
+ secondOrderGridView.FirstDisplayedScrollingRowIndex = roll;
};
}
+
+ private void secondOrderGridView_CellClick(object sender, DataGridViewCellEventArgs e)
+ {
+ if (e.RowIndex == -1)
+ return;
+ var entity = secondOrderGridView.CurrentRow.DataBoundItem as SecondOrder;
+ lastSelectOrder = entity.Order;
+ BindSelectColor(entity);
+ }
}
}
diff --git a/ButcherOrder/ButcherOrderForm.resx b/ButcherOrder/ButcherOrderForm.resx
index 0df345f..15107e7 100644
--- a/ButcherOrder/ButcherOrderForm.resx
+++ b/ButcherOrder/ButcherOrderForm.resx
@@ -126,7 +126,7 @@
True
-
+
True
diff --git a/CreateUpdateXmlFile/App.config b/CreateUpdateXmlFile/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/CreateUpdateXmlFile/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CreateUpdateXmlFile/ClientVersion.cs b/CreateUpdateXmlFile/ClientVersion.cs
new file mode 100644
index 0000000..5b19df9
--- /dev/null
+++ b/CreateUpdateXmlFile/ClientVersion.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+
+namespace CreateUpdateXmlFile
+{
+ public class ClientVersion
+ {
+ public string Version { get; set; }
+
+ public string ServerUrl { get; set; }
+
+ private List _update = new List();
+ public List UpdateFiles { get { return _update; } set { _update = value; } }
+ }
+
+ public class UpdateFile
+ {
+ public string FileName { get; set; }
+
+ public string Url { get; set; }
+
+ public int Size { get; set; }
+
+ public bool NeedRestart { get; set; }
+ }
+
+ public static class XmlUtil
+ {
+ public static void SerializerObjToFile(object obj, string fileName = "")
+ {
+ if (string.IsNullOrWhiteSpace(fileName))
+ {
+ fileName = obj.GetType().Name + ".xml";
+ }
+ var ser = new XmlSerializer(obj.GetType());
+ using (var stream = File.Open(fileName, FileMode.Create))
+ {
+ ser.Serialize(stream, obj);
+ }
+ }
+ }
+}
diff --git a/CreateUpdateXmlFile/CreateUpdateXmlFile.csproj b/CreateUpdateXmlFile/CreateUpdateXmlFile.csproj
new file mode 100644
index 0000000..9d37841
--- /dev/null
+++ b/CreateUpdateXmlFile/CreateUpdateXmlFile.csproj
@@ -0,0 +1,89 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {57BB1A02-118A-443D-A38A-BB36B9A77F6A}
+ WinExe
+ Properties
+ CreateUpdateXmlFile
+ CreateUpdateXmlFile
+ v4.5
+ 512
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ Form1.cs
+
+
+
+
+ Form1.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CreateUpdateXmlFile/Form1.Designer.cs b/CreateUpdateXmlFile/Form1.Designer.cs
new file mode 100644
index 0000000..5921c20
--- /dev/null
+++ b/CreateUpdateXmlFile/Form1.Designer.cs
@@ -0,0 +1,145 @@
+namespace CreateUpdateXmlFile
+{
+ partial class Form1
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 窗体设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.create = new System.Windows.Forms.Button();
+ this.view = new System.Windows.Forms.Button();
+ this.textBox2 = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.textBox3 = new System.Windows.Forms.TextBox();
+ this.SuspendLayout();
+ //
+ // textBox1
+ //
+ this.textBox1.Font = new System.Drawing.Font("宋体", 12F);
+ this.textBox1.Location = new System.Drawing.Point(97, 98);
+ this.textBox1.Multiline = true;
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(408, 59);
+ this.textBox1.TabIndex = 0;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(26, 98);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(65, 12);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "目录选择:";
+ //
+ // create
+ //
+ this.create.Location = new System.Drawing.Point(296, 178);
+ this.create.Name = "create";
+ this.create.Size = new System.Drawing.Size(93, 38);
+ this.create.TabIndex = 2;
+ this.create.Text = "生成";
+ this.create.UseVisualStyleBackColor = true;
+ this.create.Click += new System.EventHandler(this.create_Click);
+ //
+ // view
+ //
+ this.view.Location = new System.Drawing.Point(126, 178);
+ this.view.Name = "view";
+ this.view.Size = new System.Drawing.Size(93, 38);
+ this.view.TabIndex = 3;
+ this.view.Text = "浏览";
+ this.view.UseVisualStyleBackColor = true;
+ this.view.Click += new System.EventHandler(this.view_Click);
+ //
+ // textBox2
+ //
+ this.textBox2.Location = new System.Drawing.Point(115, 67);
+ this.textBox2.Name = "textBox2";
+ this.textBox2.Size = new System.Drawing.Size(390, 21);
+ this.textBox2.TabIndex = 4;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(26, 70);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(77, 12);
+ this.label2.TabIndex = 5;
+ this.label2.Text = "服务器地址:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(26, 27);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(53, 12);
+ this.label3.TabIndex = 6;
+ this.label3.Text = "主程序:";
+ //
+ // textBox3
+ //
+ this.textBox3.Location = new System.Drawing.Point(115, 24);
+ this.textBox3.Name = "textBox3";
+ this.textBox3.Size = new System.Drawing.Size(285, 21);
+ this.textBox3.TabIndex = 7;
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(545, 261);
+ this.Controls.Add(this.textBox3);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.textBox2);
+ this.Controls.Add(this.view);
+ this.Controls.Add(this.create);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.textBox1);
+ this.Name = "Form1";
+ this.Text = "Form1";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;
+ private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button create;
+ private System.Windows.Forms.Button view;
+ private System.Windows.Forms.TextBox textBox2;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.TextBox textBox3;
+ }
+}
+
diff --git a/CreateUpdateXmlFile/Form1.cs b/CreateUpdateXmlFile/Form1.cs
new file mode 100644
index 0000000..ba14cdd
--- /dev/null
+++ b/CreateUpdateXmlFile/Form1.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.IO;
+
+namespace CreateUpdateXmlFile
+{
+ public partial class Form1 : Form
+ {
+ public Form1()
+ {
+ InitializeComponent();
+ this.textBox2.Text = "http://172.28.1.194:7799/AutoUpdate/";
+ this.textBox3.Text = "ButcherManageClient.exe";
+ }
+
+ private void view_Click(object sender, EventArgs e)
+ {
+ if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
+ this.textBox1.Text = folderBrowserDialog1.SelectedPath;
+ }
+
+ private void create_Click(object sender, EventArgs e)
+ {
+ if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "")
+ {
+ MessageBox.Show("请完善信息");
+ return;
+ }
+ var entity = new ClientVersion();
+ entity.ServerUrl = textBox2.Text + "ClientVersion.xml";
+ entity.Version = DateTime.Now.ToString("yyyyMMddHHmm");
+ var folder = new DirectoryInfo(textBox1.Text);
+ foreach (var file in folder.GetFiles())
+ {
+ if (file.Name == "AutoUpdate.exe")
+ continue;
+ if (file.Extension == ".xml" && file.Name != "ClientVersion.xml")
+ continue;
+ var detail = new UpdateFile();
+ detail.FileName = file.Name;
+ detail.NeedRestart = textBox3.Text == detail.FileName;
+ detail.Size = (int)file.Length;
+ detail.Url = textBox2.Text + detail.FileName;
+ entity.UpdateFiles.Add(detail);
+ }
+ XmlUtil.SerializerObjToFile(entity);
+ MessageBox.Show("OK");
+ }
+ }
+}
diff --git a/CreateUpdateXmlFile/Form1.resx b/CreateUpdateXmlFile/Form1.resx
new file mode 100644
index 0000000..69f943d
--- /dev/null
+++ b/CreateUpdateXmlFile/Form1.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/CreateUpdateXmlFile/Program.cs b/CreateUpdateXmlFile/Program.cs
new file mode 100644
index 0000000..f0fdf25
--- /dev/null
+++ b/CreateUpdateXmlFile/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace CreateUpdateXmlFile
+{
+ static class Program
+ {
+ ///
+ /// 应用程序的主入口点。
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+}
diff --git a/CreateUpdateXmlFile/Properties/AssemblyInfo.cs b/CreateUpdateXmlFile/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8b1875e
--- /dev/null
+++ b/CreateUpdateXmlFile/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的常规信息通过以下
+// 特性集控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("CreateUpdateXmlFile")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("CreateUpdateXmlFile")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 使此程序集中的类型
+// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
+// 则将该类型上的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("9502ffc3-cd87-4eea-adbe-6bac36ca04f8")]
+
+// 程序集的版本信息由下面四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/CreateUpdateXmlFile/Properties/Resources.Designer.cs b/CreateUpdateXmlFile/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..6881bcb
--- /dev/null
+++ b/CreateUpdateXmlFile/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本: 4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace CreateUpdateXmlFile.Properties
+{
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// 返回此类使用的、缓存的 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CreateUpdateXmlFile.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 为所有资源查找重写当前线程的 CurrentUICulture 属性,
+ /// 方法是使用此强类型资源类。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/CreateUpdateXmlFile/Properties/Resources.resx b/CreateUpdateXmlFile/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/CreateUpdateXmlFile/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/CreateUpdateXmlFile/Properties/Settings.Designer.cs b/CreateUpdateXmlFile/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..cc24edb
--- /dev/null
+++ b/CreateUpdateXmlFile/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace CreateUpdateXmlFile.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/CreateUpdateXmlFile/Properties/Settings.settings b/CreateUpdateXmlFile/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/CreateUpdateXmlFile/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Setup/Release/Setup.msi b/Setup/Release/Setup.msi
index 446f9843f9babe3defdb8c060c91885ad7d9901e..af4c4f66a6c300080daa44be1bc5d166960c516f 100644
GIT binary patch
delta 268828
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