wyq 4 mesiacov pred
rodič
commit
9bb42ad959

+ 2 - 2
DW5S.App/DW5S.App.csproj

@@ -14,8 +14,8 @@
 
   <ItemGroup>
     <PackageReference Include="DevExpress.Win.Design" Version="23.2.3" />
-    <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.1" />
-    <PackageReference Include="System.Management" Version="9.0.1" />
+    <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.2" />
+    <PackageReference Include="System.Management" Version="9.0.2" />
   </ItemGroup>
 
   <ItemGroup>

+ 53 - 16
DW5S.App/DxHelper/SvgHelper.cs

@@ -579,10 +579,6 @@ namespace DxHelper
             ms.Dispose();
             return svg;
         }
-        /// <summary>
-        /// Info
-        /// </summary>
-        /// <returns></returns>
         public static SvgImage CreateInfo(string color = "#1177D7", int width = 24, int height = 24)
         {
             string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
@@ -594,10 +590,6 @@ namespace DxHelper
             ms.Dispose();
             return svg;
         }
-        /// <summary>
-        /// Warning
-        /// </summary>
-        /// <returns></returns>
         public static SvgImage CreateWarning(string color = "#FFB115", int width = 24, int height = 24)
         {
             string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
@@ -610,10 +602,6 @@ namespace DxHelper
             ms.Dispose();
             return svg;
         }
-        /// <summary>
-        /// Error
-        /// </summary>
-        /// <returns></returns>
         public static SvgImage CreateError(string color = "#D11C1C", int width = 24, int height = 24)
         {
             string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
@@ -624,10 +612,6 @@ namespace DxHelper
             ms.Dispose();
             return svg;
         }
-        /// <summary>
-        /// Error
-        /// </summary>
-        /// <returns></returns>
         public static SvgImage CreateRefresh(string color = "#039C23", int width = 24, int height = 24)
         {
             string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
@@ -639,5 +623,58 @@ namespace DxHelper
             ms.Dispose();
             return svg;
         }
+        public static SvgImage CreateDownload(string color = "#1177D7", int width = 24, int height = 24)
+        {
+            string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
+                + $"<path fill='{color}' d='M25.2,9.2L18,16.3V2h-4v14.3L6.8,9.2L4,12l12,12l12-12L25.2,9.2z M28,30H4v-4h24V30z'/>"
+                + "</svg>";
+            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
+            var svg = SvgLoader.LoadFromStream(ms);
+            ms.Dispose();
+            return svg;
+        }
+        public static SvgImage CreateTskStateStoped(string color = "#D11C1C", int width = 24, int height = 24)
+        {
+            string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
+                + $"<path fill='{color}' d='M16,4C9.4,4,4,9.4,4,16s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z M16,8c1.5,0,2.9,0.4,4.1,1.1l-11,11C8.4,18.9,8,17.5,8,16C8,11.6,11.6,8,16,8zM16,24c-1.5,0-2.8-0.4-4-1.1L22.9,12c0.7,1.2,1.1,2.5,1.1,4C24,20.4,20.4,24,16,24z'/>"
+                + "</svg>";
+            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
+            var svg = SvgLoader.LoadFromStream(ms);
+            ms.Dispose();
+            return svg;
+        }
+        public static SvgImage CreateTskStateWaitToRun(string color = "#1177D7", int width = 24, int height = 24)
+        {
+            string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
+                + $"<polygon fill='#727272' points='16,16 16,10 14,10 14,18 22,18 22,16 '/>"
+                + $"<path fill='{color}' d='M16,2C11.6,2,7.7,4,5.2,7.2L2,4v10h0.2h4H12l-4-4c1.8-2.4,4.7-4,8-4c5.5,0,10,4.5,10,10c0,5.5-4.5,10-10,10c-4.8,0-8.9-3.4-9.8-8h-4c1,6.8,6.8,12,13.8,12c7.7,0,14-6.3,14-14S23.7,2,16,2z'/>"
+                + "</svg>";
+            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
+            var svg = SvgLoader.LoadFromStream(ms);
+            ms.Dispose();
+            return svg;
+        }
+        public static SvgImage CreateTskStateRunning(string color = "#039C23", int width = 24, int height = 24)
+        {
+            string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
+                + $"<path fill='{color}' d='M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14S23.7,2,16,2z M12,22V10l10,6L12,22z'/>"
+                + "</svg>";
+            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
+            var svg = SvgLoader.LoadFromStream(ms);
+            ms.Dispose();
+            return svg;
+        }
+
+        public static SvgImage CreateTskStateStopping(string color = "#D11C1C", int width = 24, int height = 24)
+        {
+            string xml = $"<svg xmlns='http://www.w3.org/2000/svg\' width='{width}px' height='{height}px' viewBox='0 0 32 32'>"
+                + $"<polygon fill='#727272' points='16,16 16,8 14,8 14,18 24,18 24,16'/>"
+                + $"<path fill='{color}' d='M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14S23.7,2,16,2z M16,26c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10s10,4.5,10,10C26,21.5,21.5,26,16,26z'/>"
+                + "</svg>";
+            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
+            var svg = SvgLoader.LoadFromStream(ms);
+            ms.Dispose();
+            return svg;
+        }
     }
 }

+ 7 - 8
DW5S.App/EditForms/CdbEditor.cs

@@ -21,17 +21,17 @@ namespace DW5S.App.EditForms
         
         
 
-        public TxInfo info;
-        private List<TxInfo> infos;
+        public CdbTxViewModel info;
+        private List<CdbTxViewModel> infos;
         public CdbEditor()
         {
             InitializeComponent();
             this.layoutControl1.UseDefault();
             this.Text = "添加超短波";
-            info = new TxInfo();
+            info = new CdbTxViewModel();
             this.StartPosition = FormStartPosition.CenterParent;
         }
-        public CdbEditor(TxInfo info)
+        public CdbEditor(CdbTxViewModel info)
            : this()
         {
             this.Text = "编辑超短波";
@@ -47,11 +47,11 @@ namespace DW5S.App.EditForms
                 this.txtLat.Text = info.Lat.ToString();
                 this.txtRemark.EditValue = info.Remark;
             }
-            infos = new List<TxInfo>();
+            infos = new List<CdbTxViewModel>();
             var unitOfWork = IocContainer.UnitOfWork;
             var repsCdb = unitOfWork.Of<TxInfo>();
-            var res = await repsCdb.GetAllAsync(p => p.Name);
-            infos.AddRange(res);
+            var res = await repsCdb.FindAsync(f => f.TxType == EnumTxType.Cdb);
+            infos.AddRange(res.To<List<CdbTxViewModel>>());
         }
 
         private void btnOk_Click(object sender, EventArgs e)
@@ -67,7 +67,6 @@ namespace DW5S.App.EditForms
                 info.Lon=Convert.ToDouble(txtLon.Text);
                 info.Lat = Convert.ToDouble(txtLat.Text);
                 info.Remark = txtRemark.Text;
-                info.TxType = EnumTxType.Cdb;
                 this.DialogResult = DialogResult.OK;
             }
             catch (Exception ex)

+ 7 - 8
DW5S.App/EditForms/CxEditor.cs

@@ -18,17 +18,17 @@ namespace DW5S.App.EditForms
 {  
     public partial class CxEditor : DevExpress.XtraEditors.XtraForm
     {
-        public TxInfo info;
-        private List<TxInfo> infos;
+        public CxTxViewModel info;
+        private List<CxTxViewModel> infos;
         public CxEditor()
         {
             InitializeComponent();
             this.layoutControl1.UseDefault();
             this.Text = "添加测向站";
-            info = new TxInfo();
+            info = new CxTxViewModel();
             this.StartPosition = FormStartPosition.CenterParent;
         }
-        public CxEditor(TxInfo info)
+        public CxEditor(CxTxViewModel info)
            : this()
         {
             this.Text = "编辑测向站";
@@ -44,11 +44,11 @@ namespace DW5S.App.EditForms
                 this.txtLat.Text = info.Lat.ToString();
                 this.txtRemark.EditValue = info.Remark;
             }
-            infos = new List<TxInfo>();
+            infos = new List<CxTxViewModel>();
             var unitOfWork = IocContainer.UnitOfWork;
             var repsCx = unitOfWork.Of<TxInfo>();
-            var res = await repsCx.GetAllAsync(p => p.Name);
-            infos.AddRange(res);
+            var res = await repsCx.FindAsync(f=>f.TxType== EnumTxType.Cx);
+            infos.AddRange(res.To<List<CxTxViewModel>>());
         }
 
         private void btnOk_Click(object sender, EventArgs e)
@@ -64,7 +64,6 @@ namespace DW5S.App.EditForms
                 info.Lon=Convert.ToDouble(txtLon.Text);
                 info.Lat = Convert.ToDouble(txtLat.Text);
                 info.Remark = txtRemark.Text;
-                info.TxType = EnumTxType.Cx;
                 this.DialogResult = DialogResult.OK;
             }
             catch (Exception ex)

+ 7 - 8
DW5S.App/EditForms/RecEditor.cs

@@ -19,21 +19,21 @@ namespace DW5S.App.EditForms
 {
     public partial class RecEditor : DevExpress.XtraEditors.XtraForm
     {
-        public TxInfo info;
-        private List<TxInfo> infos;
+        public RecTxViewModel info;
+        private List<RecTxViewModel> infos;
         public RecEditor()
         {
             InitializeComponent();
             this.layoutControl1.UseDefault();
             this.Text = "添加接收站";
-            info = new TxInfo();
+            info = new RecTxViewModel();
             this.StartPosition = FormStartPosition.CenterParent;
         }
         public RecEditor(RecTxViewModel info)
            : this()
         {
             this.Text = "编辑接收站";
-            this.info = info.To<TxInfo>();
+            this.info = info.To<RecTxViewModel>();
         }
 
         private async void RecEditor_Load(object sender, EventArgs e)
@@ -45,11 +45,11 @@ namespace DW5S.App.EditForms
                 this.txtLat.Text = info.Lat.ToString();
                 this.txtRemark.EditValue = info.Remark;
             }
-            infos = new List<TxInfo>();
+            infos = new List<RecTxViewModel>();
             var unitOfWork = IocContainer.UnitOfWork;
             var repsRec = unitOfWork.Of<TxInfo>();
-            var res = await repsRec.FindAsync(f => f.TxType == EnumTxType.Rec, p => p.Name);
-            infos.AddRange(res);
+            var res = await repsRec.FindAsync(f => f.TxType == EnumTxType.Rec);
+            infos.AddRange(res.To<List<RecTxViewModel>>());
         }
 
         private void btnOk_Click(object sender, EventArgs e)
@@ -65,7 +65,6 @@ namespace DW5S.App.EditForms
                 info.Lon = Convert.ToDouble(txtLon.Text);
                 info.Lat = Convert.ToDouble(txtLat.Text);
                 info.Remark = txtRemark.Text;
-                info.TxType = EnumTxType.Rec;
                 this.DialogResult = DialogResult.OK;
             }
             catch (Exception ex)

+ 7 - 8
DW5S.App/EditForms/RefEditor.cs

@@ -20,17 +20,17 @@ namespace DW5S.App.EditForms
     {
         
         
-        public TxInfo info;
-        private List<TxInfo> infos;
+        public RefTxViewModel info;
+        private List<RefTxViewModel> infos;
         public RefEditor()
         {
             InitializeComponent();
             this.layoutControl1.UseDefault();
             this.Text = "添加参考站";
-            info = new TxInfo();
+            info = new RefTxViewModel();
             this.StartPosition = FormStartPosition.CenterParent;
         }
-        public RefEditor(TxInfo info)
+        public RefEditor(RefTxViewModel info)
            : this()
         {
             this.Text = "编辑参考站";
@@ -46,11 +46,11 @@ namespace DW5S.App.EditForms
                 this.txtLat.Text = info.Lat.ToString();
                 this.txtRemark.EditValue = info.Remark;
             }
-            infos = new List<TxInfo>();
+            infos = new List<RefTxViewModel>();
             var unitOfWork = IocContainer.UnitOfWork;
             var repsRef = unitOfWork.Of<TxInfo>();
-            var res = await repsRef.GetAllAsync();
-            infos.AddRange(res);
+            var res = await repsRef.FindAsync(f=>f.TxType== EnumTxType.Ref);
+            infos.AddRange(res.To<List<RefTxViewModel>>());
         }
 
         private void btnOk_Click(object sender, EventArgs e)
@@ -66,7 +66,6 @@ namespace DW5S.App.EditForms
                 info.Lon=Convert.ToDouble(txtLon.Text);
                 info.Lat = Convert.ToDouble(txtLat.Text);
                 info.Remark = txtRemark.Text;
-                info.TxType = EnumTxType.Ref;
                 this.DialogResult = DialogResult.OK;
             }
             catch (Exception ex)

+ 0 - 1
DW5S.App/ExtensionsDev/DateEditExtension.cs

@@ -6,7 +6,6 @@ using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using DW5S.Repostory;
 
 namespace ExtensionsDev
 {

+ 461 - 80
DW5S.App/ExtensionsDev/GridControlEx.cs

@@ -1,7 +1,6 @@
 using DevExpress.Utils;
 using DevExpress.Utils.Helpers;
 using DevExpress.Utils.Menu;
-using DevExpress.Utils.Paint;
 using DevExpress.Utils.Svg;
 using DevExpress.XtraBars;
 using DevExpress.XtraEditors;
@@ -10,15 +9,19 @@ using DevExpress.XtraEditors.Repository;
 using DevExpress.XtraGrid;
 using DevExpress.XtraGrid.Columns;
 using DevExpress.XtraGrid.Views.Grid;
+using DevExpress.XtraRichEdit.Model;
 using DxHelper;
+using ExtensionsDev;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Drawing;
 using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+
 public static class GridControlEx
 {
     internal class GridTag
@@ -41,21 +44,119 @@ public static class GridControlEx
     /// <param name="showScrollH">是否显示水平滚动条(默认不显示)</param>
     /// <typeparam name="T">绑定的数据源模型类型</typeparam>
     /// <returns></returns>
-    public static GridControl UseDefault<T>(this GridControl grid, List<T> dataSource, int rowHeight = 24, bool showScrollH = false)
+    public static GridControl UseDefault<T>(this GridControl grid, List<T> dataSource, int rowHeight = 24, bool showScrollH = false, bool formatNullValue = true)
     {
         grid.DataSource = dataSource;
-        grid.HideColumn("ID","CreateTime","UpdateTime");
+        grid.Load += (sender, e) =>
+        {
+            grid.HideColumn("UpdateTime");
+            grid.HideColumn(p => p.FieldName.ToUpper().EndsWith("ID"));
+            grid.HideColumn(p => p.ColumnType == typeof(List<>));
+            grid.HideColumn(p => p.ColumnType == typeof(ICollection<>));
+            grid.HideColumn(p => p.ColumnType.BaseType != null && p.ColumnType.BaseType.Name.Contains("BaseEntity"));
+        };
+
         grid.MainView.BorderStyle = BorderStyles.Flat;
         var view = grid.MainView as GridView;
+        SetViewDefaultProps(grid, view, rowHeight, showScrollH);
+        var childView = grid.GetChildView();
+        if (childView != null)
+        {
+            view.OptionsView.ShowDetailButtons = true;
+            SetViewDefaultProps(grid, childView, rowHeight, showScrollH);
+            childView.OptionsMenu.EnableColumnMenu = false;
+            childView.OptionsCustomization.AllowSort = false;
+            childView.OptionsCustomization.AllowFilter = false;
+            childView.OptionsCustomization.AllowGroup = false;
+
+        }
+
+        grid.Tag = new GridTag();
+        if (formatNullValue)
+            grid.UseNullValueText();
+        return grid;
+    }
+
+    /// <summary>
+    /// 初始化表格(默认禁用分组)
+    /// </summary>
+    /// <param name="grid"></param>
+    /// <param name="dataSource">绑定的数据源</param>
+    /// <param name="rowHeight">行高(默认24px)</param>
+    /// <param name="showScrollH">是否显示水平滚动条(默认不显示)</param>
+    /// <typeparam name="T">绑定的数据源模型类型</typeparam>
+    /// <returns></returns>
+    public static GridControl UseDefaultEx<T>(this GridControl grid, BindingList<T> dataSource, int rowHeight = 24, bool showScrollH = false, bool formatNullValue = true)
+    {
+        grid.DataSource = dataSource;
+        grid.Load += (sender, e) =>
+        {
+            grid.HideColumn("UpdateTime");
+            grid.HideColumn(p => p.FieldName.ToUpper().EndsWith("ID"));
+            grid.HideColumn(p => p.ColumnType == typeof(List<>));
+            grid.HideColumn(p => p.ColumnType == typeof(ICollection<>));
+            grid.HideColumn(p => p.ColumnType.BaseType != null && p.ColumnType.BaseType.Name.Contains("BaseEntity"));
+        };
+
+        grid.MainView.BorderStyle = BorderStyles.Flat;
+        var view = grid.MainView as GridView;
+        SetViewDefaultProps(grid, view, rowHeight, showScrollH);
+        var childView = grid.GetChildView();
+        if (childView != null)
+        {
+            view.OptionsView.ShowDetailButtons = true;
+            SetViewDefaultProps(grid, childView, rowHeight, showScrollH);
+            childView.OptionsMenu.EnableColumnMenu = false;
+            childView.OptionsCustomization.AllowSort = false;
+            childView.OptionsCustomization.AllowFilter = false;
+            childView.OptionsCustomization.AllowGroup = false;
+
+        }
+
+        grid.Tag = new GridTag();
+        if (formatNullValue)
+            grid.UseNullValueText();
+        return grid;
+    }
+    public static GridView GetChildView(this GridControl grid)
+    {
+        return grid.LevelTree?.Nodes?.FirstOrDefault()?.LevelTemplate as GridView;
+    }
+
+    public static GridControl UseEditForm(this GridControl grid, int columnCount, params string[] columns)
+    {
+        var view = grid.MainView as GridView;
+        view.OptionsBehavior.Editable = true;
+        view.OptionsBehavior.EditingMode = DevExpress.XtraGrid.Views.Grid.GridEditingMode.EditForm;
+        //foreach (GridColumn item in view.Columns)
+        //{
+        //    if (item.VisibleIndex > 0)
+        //        item.OptionsEditForm.VisibleIndex = item.VisibleIndex;
+        //}
+        var maxIdx = view.Columns.Max(p => p.OptionsEditForm.VisibleIndex);
+        for (int i = 0; i < columns.Length; i++)
+        {
+            view.Columns[columns[i]].OptionsEditForm.Visible = DefaultBoolean.True;
+            view.Columns[columns[i]].OptionsEditForm.VisibleIndex = maxIdx + i + 1;
+        }
+
+        return grid;
+    }
+
+    private static void SetViewDefaultProps(GridControl grid, GridView view, int rowHeight, bool showScrollH)
+    {
         view.CustomColumnDisplayText += View_CustomColumnDisplayText;
+        view.OptionsView.ShowButtonMode = DevExpress.XtraGrid.Views.Base.ShowButtonModeEnum.ShowAlways;
         view.Appearance.HeaderPanel.TextOptions.HAlignment = HorzAlignment.Center;
-
         view.Appearance.Row.Options.UseTextOptions = true;
         view.Appearance.Row.TextOptions.HAlignment = HorzAlignment.Center;
         view.OptionsView.ColumnHeaderAutoHeight = DefaultBoolean.True;
         view.RowHeight = rowHeight;
         view.OptionsView.ShowGroupPanel = false;
 
+        view.OptionsDetail.ShowDetailTabs = false;
+        view.OptionsDetail.AllowZoomDetail = false;
+
         view.OptionsBehavior.Editable = false;
         view.OptionsView.ShowDetailButtons = false;
         view.OptionsView.ShowIndicator = false;
@@ -79,61 +180,50 @@ public static class GridControlEx
         view.OptionsLayout.StoreFormatRules = true;
         view.OptionsView.ColumnAutoWidth = !showScrollH;
         view.PopupMenuShowing += View_PopupMenuShowing;
-
         view.OptionsSelection.EnableAppearanceFocusedCell = false;
+
         string GetLayoutName()
         {
-            Control ctrl;
+            Control ctrl = null;
             if (view.Tag is SearchLookUpEdit searchLookUpEdit)
+            {
                 ctrl = searchLookUpEdit;
+            }
             else
+            {
                 ctrl = grid;
+            }
             while (ctrl.Parent != null)
             {
                 ctrl = ctrl.Parent;
                 if (ctrl is UserControl) break;
+                if (ctrl is Form) break;
+
             }
-            var props = typeof(T).GetProperties();
-            StringBuilder sb = new StringBuilder();
-            foreach (var item in props)
-            {
-                sb.Append(item.Name);
-            }
-            var md5 = MD5Helper.StrToMD5(sb.ToString());
+            if (ctrl is not UserControl && ctrl is not Form) return null;
+            //var props = typeof(T).GetProperties();
+            //StringBuilder sb = new StringBuilder();
+            //foreach (var item in props)
+            //{
+            //    sb.Append(item.Name);
+            //}
+            //var md5 = MD5Helper.StrToMD5(sb.ToString());
             if (view.Tag is SearchLookUpEdit searchLookUpEdit2)
-                return $"{ctrl.Name}_{searchLookUpEdit2.Name}_{md5}";
+                return $"{ctrl.Name}_{searchLookUpEdit2.Name}";
             else
-                return $"{ctrl.Name}_{grid.Name}_{md5}";
+                return $"{ctrl.Name}_{grid.Name}_{view.Name}";
         }
         string name = GetLayoutName();
-        void SaveLayoutAction()
+        if (!string.IsNullOrWhiteSpace(name))
         {
-
-            Form frm = null;
-            if (view.Tag is SearchLookUpEdit edit)
-                frm = edit.FindForm();
-            else
-                frm = grid.FindForm();
-
-            if (frm != null)
+            view.Layout += (sender, e) =>
             {
-                frm.VisibleChanged += (sender2, e2) =>
-                {
-                    Directory.CreateDirectory("Layout");
-                    if (name == null) return;
-                    grid.MainView?.SaveLayoutToXml($"Layout\\{name}.xml", OptionsLayoutBase.FullLayout);
-                };
-            }
-        }
-        if (grid.IsLoaded)
-        {
-            SaveLayoutAction();
-        }
-        else
-        {
-            grid.Load += (sender, e) => SaveLayoutAction();
+                Directory.CreateDirectory("Layout");
+                if (name == null) return;
+                (sender as GridView).SaveLayoutToXml($"Layout\\{name}.xml", OptionsLayoutBase.FullLayout);
+            };
         }
-        if (name != null && File.Exists($"Layout\\{name}.xml"))
+        if (!string.IsNullOrWhiteSpace(name) && File.Exists($"Layout\\{name}.xml"))
         {
             view.RestoreLayoutFromXml($"Layout\\{name}.xml", OptionsLayoutBase.FullLayout);
             view.ClearColumnsFilter();
@@ -143,8 +233,6 @@ public static class GridControlEx
             view.ClearSelection();
         }
         view.KeyUp += View_KeyUp;
-        grid.Tag = new GridTag();
-        return grid;
     }
 
     /// <summary>
@@ -153,7 +241,7 @@ public static class GridControlEx
     /// <param name="grid"></param>
     /// <param name="emptyText"></param>
     /// <returns></returns>
-    public static GridControl UseEmptyText(this GridControl grid,  string emptyText = "暂无数据")
+    public static GridControl UseEmptyText(this GridControl grid, string emptyText = "暂无数据")
     {
         if (string.IsNullOrWhiteSpace(emptyText)) return grid;
         var view = grid.MainView as GridView;
@@ -163,7 +251,7 @@ public static class GridControlEx
             var x = (e.Bounds.Width - s.Width) / 2;
             var y = (e.Bounds.Height - s.Height) / 2;
             e.Appearance.ForeColor = Color.Gray;
-            e.Appearance.DrawString(e.Cache, emptyText, new Rectangle(x, y, s.Width, s.Height));
+            e.Appearance.DrawString(e.Cache, emptyText, new Rectangle(x, y + 20, s.Width, s.Height));
         };
         return grid;
     }
@@ -194,8 +282,14 @@ public static class GridControlEx
             {
                 var addRow = callback();
                 if (addRow == null) return;
-                var ds = grid.DataSource as List<T>;
-                ds.Add(addRow);
+                if (grid.DataSource is List<T> ds)
+                {
+                    ds.Add(addRow);
+                }
+                else if (grid.DataSource is BindingList<T> bl)
+                {
+                    bl.Add(addRow);
+                }
                 view.RefreshData();
             }
 
@@ -220,8 +314,14 @@ public static class GridControlEx
                 var addRow = await callback();
                 if (addRow == null) return;
                 var view = grid.MainView as GridView;
-                var ds = grid.DataSource as List<T>;
-                ds.Add(addRow);
+                if (grid.DataSource is List<T> ds)
+                {
+                    ds.Add(addRow);
+                }
+                else if (grid.DataSource is BindingList<T> bl)
+                {
+                    bl.Add(addRow);
+                }
                 view.RefreshData();
             }
 
@@ -246,10 +346,18 @@ public static class GridControlEx
                 var newRow = callback(data);
                 if (newRow == null) return;
                 var view = grid.MainView as GridView;
-                var ds = grid.DataSource as List<T>;
-                var idx = ds.IndexOf(data);
-                ds.Remove(data);
-                ds.Insert(idx, newRow);
+                if (grid.DataSource is List<T> ds)
+                {
+                    var idx=ds.IndexOf(data);
+                    ds.Remove(data);
+                    ds.Insert(idx, newRow);
+                }
+                else if (grid.DataSource is BindingList<T> bl)
+                {
+                    var idx = bl.IndexOf(data);
+                    bl.Remove(data);
+                    bl.Insert(idx, newRow);
+                }
                 view.RefreshData();
             }
 
@@ -274,10 +382,18 @@ public static class GridControlEx
                 var newRow = await callback(data);
                 if (newRow == null) return;
                 var view = grid.MainView as GridView;
-                var ds = grid.DataSource as List<T>;
-                var idx = ds.IndexOf(data);
-                ds.Remove(data);
-                ds.Insert(idx, newRow);
+                if (grid.DataSource is List<T> ds)
+                {
+                    var idx = ds.IndexOf(data);
+                    ds.Remove(data);
+                    ds.Insert(idx, newRow);
+                }
+                else if (grid.DataSource is BindingList<T> bl)
+                {
+                    var idx = bl.IndexOf(data);
+                    bl.Remove(data);
+                    bl.Insert(idx, newRow);
+                }
                 view.RefreshData();
             }
 
@@ -363,7 +479,7 @@ public static class GridControlEx
         }, false);
         return grid;
     }
-    public static GridControl SetLogImageColumn(this GridControl grid, string columnFieldName,Type enumType)
+    public static GridControl SetLogImageColumn(this GridControl grid, string columnFieldName, Type enumType)
     {
         var view = grid.MainView as GridView;
         RepositoryItemImageComboBox edit = new RepositoryItemImageComboBox();
@@ -376,9 +492,244 @@ public static class GridControlEx
         edit.SmallImages = svgImages;
         edit.GlyphAlignment = DevExpress.Utils.HorzAlignment.Center;
         view.Columns[columnFieldName].ColumnEdit = edit;
+        view.Columns[columnFieldName].VisibleIndex = 0;
+        view.Columns[columnFieldName].MaxWidth = 64;
+        view.Columns[columnFieldName].MinWidth = 64;
+        return grid;
+    }
+    public static GridControl SetStateImageColumn(this GridControl grid, string columnFieldName, Type enumType)
+    {
+        var view = grid.MainView as GridView;
+        RepositoryItemImageComboBox edit = new RepositoryItemImageComboBox();
+        edit.AddEnum(enumType);
+        SvgImageCollection svgImages = new SvgImageCollection();
+        svgImages.ImageSize = new System.Drawing.Size(20, 20);
+        svgImages.Add(SvgHelper.CreateTskStateStoped());
+        svgImages.Add(SvgHelper.CreateTskStateWaitToRun());
+        svgImages.Add(SvgHelper.CreateTskStateRunning());
+        svgImages.Add(SvgHelper.CreateTskStateStopping());
+        edit.SmallImages = svgImages;
+        edit.GlyphAlignment = DevExpress.Utils.HorzAlignment.Center;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+        view.Columns[columnFieldName].VisibleIndex = 0;
+        view.Columns[columnFieldName].MaxWidth = 64;
+        view.Columns[columnFieldName].MinWidth = 64;
+        return grid;
+    }
+
+    public static GridControl UseRowFocusedStyle(this GridControl grid)
+    {
+        var view = grid.MainView as GridView;
+        view.OptionsSelection.EnableAppearanceFocusedCell = false;
+        view.FocusRectStyle = DrawFocusRectStyle.RowFocus;
+        var childView = grid.GetChildView();
+        if (childView != null)
+        {
+            childView.OptionsSelection.EnableAppearanceFocusedCell = false;
+            childView.FocusRectStyle = DrawFocusRectStyle.RowFocus;
+        }
+        return grid;
+    }
+    public static GridControl UseFileChooseColumn(this GridControl grid, string columnFieldName, bool columnCanInput = false)
+    {
+        var view = grid.MainView as GridView;
+        var edit = new RepositoryItemButtonEdit() { AutoHeight = false };
+        edit.ReadOnly = !columnCanInput;
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+        edit.ButtonClick += (sender, e) =>
+        {
+            OpenFileDialog dlg = new OpenFileDialog();
+            dlg.Title = "文件选择";
+            dlg.Multiselect = false;
+            if (dlg.ShowDialog() == DialogResult.OK)
+            {
+                view.SetFocusedRowCellValue(columnFieldName, dlg.FileName);
+            }
+        };
+        return grid;
+    }
+    public static GridControl UseHttpDownloadColumn(this GridControl grid, string columnFieldName)
+    {
+        grid.UseEdit(false);
+
+        var view = grid.MainView as GridView;
+        var edit = new RepositoryItemButtonEdit() { AutoHeight = false, ReadOnly = true };
+        edit.Buttons[0].Kind = ButtonPredefines.Glyph;
+        edit.Buttons[0].ToolTip = "下载文件";
+        edit.TextEditStyle = TextEditStyles.DisableTextEditor;
+        edit.Buttons[0].ImageOptions.SvgImage = SvgHelper.CreateDownload(width: 12, height: 12);
+        view.Columns[columnFieldName].OptionsColumn.AllowEdit = true;
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+        edit.ButtonClick += async (sender, e) =>
+        {
+            var url = view.GetFocusedRowCellValue(columnFieldName)?.ToString();
+            if (string.IsNullOrWhiteSpace(url)) return;
+            var localFile = Path.GetFileName(url);
+            SaveFileDialog d = new SaveFileDialog();
+            d.FileName = localFile;
+            if (d.ShowDialog() == DialogResult.OK)
+            {
+                try
+                {
+                    if (await HttpHelper.DownloadFileAsync(url, d.FileName))
+                    {
+                        var dir = Path.GetDirectoryName(d.FileName);
+                        System.Diagnostics.Process.Start("explorer.exe", dir);
+                    }
+                    else
+                    {
+                        throw new Exception($"文件下载失败,url={url}");
+                    }
+                }
+                catch (Exception ex)
+                {
+                    throw new Exception($"文件下载失败,url={url}",ex);
+                }
+            }
+
+        };
+        return grid;
+    }
+    public static GridControl UseBoolColumn(this GridControl grid, string columnFieldName, string trueText = "是", string falseText = "否", GridView view = null)
+    {
+        if (view == null)
+            view = grid.MainView as GridView;
+        var edit = new RepositoryItemImageComboBox() { AutoHeight = false };
+        edit.Items.Add(new ImageComboBoxItem(trueText, true));
+        edit.Items.Add(new ImageComboBoxItem(falseText, false));
+        edit.ReadOnly = false;
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+        if (columnFieldName == "Enable")
+            view.Columns[columnFieldName].VisibleIndex = 99;
+        return grid;
+    }
+    public static GridControl UseLookUpEditColumn(this GridControl grid, string columnFieldName, string displayField = "", GridView view = null)
+    {
+        if (view == null)
+            view = grid.MainView as GridView;
+        var edit = new RepositoryItemLookUpEdit();
+        edit.AutoHeight = false;
+        edit.ValueMember = "Id";
+        edit.DisplayMember = displayField;
+        edit.NullText = "未知";
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+        return grid;
+    }
+    public static GridControl UseButtonEditColumn(this GridControl grid, string columnFieldName, GridView view = null)
+    {
+        grid.UseEdit(false);
+        if (view == null)
+            view = grid.MainView as GridView;
+        var edit = new RepositoryItemButtonEdit();
+        edit.Buttons.Clear();
+        edit.Buttons.Add(new EditorButton(ButtonPredefines.Glyph) { Caption="Click"});
+        edit.AutoHeight = false;
+        edit.TextEditStyle = TextEditStyles.HideTextEditor;
+        view.Columns[columnFieldName].OptionsColumn.AllowEdit = true;
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+        return grid;
+    }
+    public static GridControl UseDateTimeEditColumn(this GridControl grid, string columnFieldName, GridView view = null)
+    {
+        if (view == null)
+            view = grid.MainView as GridView;
+        var edit = new RepositoryItemDateEdit();
+        edit.AllowNullInput = DevExpress.Utils.DefaultBoolean.False;
+        edit.AutoHeight = false;
+        edit.CalendarTimeEditing = DevExpress.Utils.DefaultBoolean.True;
+        edit.CalendarTimeProperties.DisplayFormat.FormatString = "HH:mm:ss";
+        edit.CalendarTimeProperties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+        edit.CalendarTimeProperties.EditFormat.FormatString = "HH:mm:ss";
+        edit.CalendarTimeProperties.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+        edit.CalendarTimeProperties.MaskSettings.Set("mask", "HH:mm:ss");
+        edit.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm:ss";
+        edit.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+        edit.EditFormat.FormatString = "yyyy-MM-dd HH:mm:ss";
+        edit.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+        edit.MaskSettings.Set("mask", "yyyy-MM-dd HH:mm:ss");
+
+
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+        return grid;
+    }
+    public static void UpdateLookUpEditDataSource<T>(this GridControl grid, string columnFieldName, List<T> dataSource, GridView view = null)
+    {
+        if (view == null)
+            view = grid.MainView as GridView;
+        var edit = view.Columns[columnFieldName].ColumnEdit as RepositoryItemLookUpEdit;
+        if (edit != null)
+            edit.DataSource = dataSource;
+    }
+
+
+    public static GridControl UseSearchEditColumn<T>(this GridControl grid, string columnFieldName, List<T> editDataSource, string displayField = "This", GridView view = null)
+    {
+        if (view == null)
+            view = grid.MainView as GridView;
+        var edit = new RepositoryItemSearchLookUpEdit();
+        SearchLookUpEdit dd;
+        Control ctrl = grid;
+        while (ctrl.Parent != null)
+        {
+            ctrl = ctrl.Parent;
+            if (ctrl is UserControl) break;
+        }
+        var searchEdit1View = new DevExpress.XtraGrid.Views.Grid.GridView();
+        searchEdit1View.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;
+        searchEdit1View.OptionsSelection.EnableAppearanceFocusedCell = false;
+        searchEdit1View.OptionsView.ShowGroupPanel = false;
+        edit.Name = $"{ctrl.Name}_{grid.Name}_{columnFieldName}_SearchEdit";
+        edit.AutoHeight = false;
+        edit.PopupView = searchEdit1View;
+        edit.ValueMember = "Id";
+        edit.KeyMember = "Id";
+        edit.DisplayMember = displayField;
+        edit.UseDefault().SetData(editDataSource);
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+
+        searchEdit1View.GridControl.UseDefault<T>(null);
+        return grid;
+    }
+    public static GridControl UseSearchEditColumn<T>(this GridControl grid, string columnFieldName, Func<Task<List<T>>> onGetData, string displayField = "This", GridView view = null)
+    {
+        if (view == null)
+            view = grid.MainView as GridView;
+        var edit = new RepositoryItemSearchLookUpEdit();
+        edit.DataSource = onGetData().Result;
+        Control ctrl = grid;
+        while (ctrl.Parent != null)
+        {
+            ctrl = ctrl.Parent;
+            if (ctrl is UserControl) break;
+        }
+        var searchEdit1View = new DevExpress.XtraGrid.Views.Grid.GridView();
+        searchEdit1View.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;
+        searchEdit1View.OptionsSelection.EnableAppearanceFocusedCell = false;
+        searchEdit1View.OptionsView.ShowGroupPanel = false;
+
+        edit.Name = $"{ctrl.Name}_{grid.Name}_{columnFieldName}_SearchEdit";
+        edit.AutoHeight = false;
+        edit.PopupView = searchEdit1View;
+        edit.ValueMember = "Id";
+        edit.KeyMember = "Id";
+        edit.DisplayMember = displayField;
+        edit.UseDefault().SetData(onGetData);
+        view.Columns[columnFieldName].Visible = true;
+        view.Columns[columnFieldName].ColumnEdit = edit;
+
+        searchEdit1View.GridControl.UseDefault<T>(null);
         return grid;
     }
 
+
+
     /// <summary>
     /// 为GirdControl启用右键清除所有数据的功能
     /// </summary>
@@ -517,12 +868,11 @@ public static class GridControlEx
         if (e.Column.ColumnType == typeof(DateTime) || e.Column.ColumnType == typeof(DateTime?))
         {
             if (e.Value == null) return;
-            if (e.Column.FieldName == "SigTime")
-                e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm:ss.fff");
-            else
+            if (e.Column.ColumnType == typeof(DateTime))
                 e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm:ss");
 
         }
+
     }
     public static GridControl ShowColumn(this GridControl grid, params string[] colField)
     {
@@ -536,11 +886,14 @@ public static class GridControlEx
         }
         return grid;
     }
-    public static GridControl UseMultiSelect(this GridControl grid)
+    public static GridControl UseMultiSelect(this GridControl grid, bool useCheckBoxSelect = false)
     {
         var view = grid.MainView as GridView;
         view.OptionsSelection.MultiSelect = true;
-        view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect;
+        if (useCheckBoxSelect)
+            view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;
+        else
+            view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect;
         return grid;
     }
     public static GridControl UseGroup(this GridControl grid)
@@ -561,17 +914,18 @@ public static class GridControlEx
         return grid;
 
     }
-    public static GridControl UseEdit(this GridControl grid)
+    public static GridControl UseEdit(this GridControl grid, bool columnsEdit = false)
     {
         var view = grid.MainView as GridView;
         view.OptionsBehavior.Editable = true;
         view.OptionsSelection.EnableAppearanceFocusedCell = true;
         foreach (GridColumn item in view.Columns)
         {
-            item.OptionsColumn.AllowEdit = false;
+            item.OptionsColumn.AllowEdit = columnsEdit;
         }
         return grid;
     }
+
     public static GridControl UseRowNumber(this GridControl grid)
     {
         var view = grid.MainView as GridView;
@@ -603,17 +957,19 @@ public static class GridControlEx
         return grid;
 
     }
-
-    public static GridControl UseNullValueText(this GridControl grid, string nullText = "--")
+    private static GridControl UseNullValueText(this GridControl grid, string nullText = "--")
     {
         var view = grid.MainView as GridView;
         view.CustomColumnDisplayText += (sender, e) =>
         {
-            if (e.Value == null) e.DisplayText = nullText;
+            if (e.Value == null || e.Value.ToString().Trim() == "")
+                e.DisplayText = nullText;
         };
         return grid;
     }
 
+
+
     public static GridControl SetDisplayText(this GridControl grid, string columnFieldName, Func<object, string> action)
     {
         var view = grid.MainView as GridView;
@@ -625,19 +981,30 @@ public static class GridControlEx
         };
         return grid;
     }
+    /// <summary>
+    /// 隐藏指定字段的列
+    /// </summary>
+    /// <param name="grid"></param>
+    /// <param name="colField"></param>
+    /// <returns></returns>
     public static GridControl HideColumn(this GridControl grid, params string[] colField)
     {
-
+        colField = colField.Select(t => t.ToLower()).ToArray();
         var view = grid.MainView as GridView;
         if (colField == null || colField.Length == 0) return grid;
         foreach (GridColumn item in view.Columns)
         {
-            if (colField.Contains(item.FieldName))
+            if (colField.Contains(item.FieldName.ToLower()))
                 item.Visible = false;
         }
         return grid;
     }
-
+    /// <summary>
+    /// 根据条件隐藏列(只会处理ColumnEdit==null的列)
+    /// </summary>
+    /// <param name="grid"></param>
+    /// <param name="condition"></param>
+    /// <returns></returns>
     public static GridControl HideColumn(this GridControl grid, Func<GridColumn, bool> condition)
     {
         var view = grid.MainView as GridView;
@@ -648,8 +1015,6 @@ public static class GridControlEx
         }
         return grid;
     }
-
-
     /// <summary>
     /// GridControl添加单行元素选择后的右键菜单
     /// </summary>
@@ -907,10 +1272,18 @@ public static class GridControlEx
         {
             if (action != null)
             {
-                var ds = grid.DataSource as List<T>;
-                if (!showWithNoneDataRow && (ds == null || ds.Count == 0)) return;
-                item.Enabled = false;
-                action.Invoke(ds);
+                if (grid.DataSource is List<T> ds)
+                {
+                    if (!showWithNoneDataRow && (ds == null || ds.Count == 0)) return;
+                    item.Enabled = false;
+                    action.Invoke(ds);
+                }
+                else if (grid.DataSource is BindingList<T> bl)
+                {
+                    if (!showWithNoneDataRow && (bl == null || bl.Count == 0)) return;
+                    item.Enabled = false;
+                    action.Invoke(bl.ToList());
+                }
                 item.Enabled = true;
             }
         });
@@ -954,10 +1327,18 @@ public static class GridControlEx
         {
             if (action != null)
             {
-                var ds = grid.DataSource as List<T>;
-                if (!showWithNoneDataRow && (ds == null || ds.Count == 0)) return;
-                item.Enabled = false;
-                await action.Invoke(ds);
+                if (grid.DataSource is List<T> ds)
+                {
+                    if (!showWithNoneDataRow && (ds == null || ds.Count == 0)) return;
+                    item.Enabled = false;
+                    await action.Invoke(ds);
+                }
+                else if (grid.DataSource is BindingList<T> bl)
+                {
+                    if (!showWithNoneDataRow && (bl == null || bl.Count == 0)) return;
+                    item.Enabled = false;
+                    await action.Invoke(bl.ToList());
+                }
                 item.Enabled = true;
             }
         });

+ 77 - 12
DW5S.App/ExtensionsDev/SearchLookUpEditExtension.cs

@@ -1,4 +1,6 @@
-using DevExpress.XtraEditors;
+using DevExpress.CodeParser;
+using DevExpress.Utils;
+using DevExpress.XtraEditors;
 using DevExpress.XtraEditors.Repository;
 using DevExpress.XtraGrid.Columns;
 using DevExpress.XtraGrid.Views.Grid;
@@ -7,6 +9,7 @@ using System.Collections.Generic;
 using System.ComponentModel;
 using System.ComponentModel.DataAnnotations;
 using System.Drawing;
+using System.Drawing.Drawing2D;
 using System.IO;
 using System.Linq;
 using System.Reflection;
@@ -40,7 +43,18 @@ namespace ExtensionsDev
             ctrl.Properties.ShowPopupShadow = true;
             return ctrl;
         }
-
+        public static RepositoryItemSearchLookUpEdit UseDefault(this RepositoryItemSearchLookUpEdit ctrl, string nullText = "请选择", bool showClearBtn = false)
+        {
+            ctrl.NullText = null;
+            ctrl.NullValuePrompt = nullText;
+            ctrl.AllowFocused = false;
+            ctrl.ShowNullValuePrompt = ShowNullValuePromptOptions.Default;
+            ctrl.ShowAddNewButton = false;
+            ctrl.ShowClearButton = showClearBtn;
+            ctrl.ShowFooter = false;
+            ctrl.ShowPopupShadow = true;
+            return ctrl;
+        }
 
 
         /// <summary>
@@ -52,21 +66,13 @@ namespace ExtensionsDev
         {
             ctrl.Properties.DataSource = data;
             GridView view = ctrl.Properties.View;
-            view.Tag = ctrl;
             view.OptionsView.ShowColumnHeaders = false;
             view.GridControl.UseDefault<string>(null);
             return ctrl;
         }
-        /// <summary>
-        /// 绑定SearchLookUpEdit数据源
-        /// </summary>
-        /// <param name="ctrl"></param>
-        /// <param name="data">数据源</param>
-        /// <param name="displayField"></param>
-       
+
         public static SearchLookUpEdit SetData<T>(this SearchLookUpEdit ctrl, IEnumerable<T> data, string valueField = "Id", string displayField = "")
         {
-            if (data == null) data = new List<T>();
             ctrl.Properties.ValueMember = valueField;
             ctrl.Properties.KeyMember = valueField;
             ctrl.Properties.DisplayMember = displayField;
@@ -94,6 +100,66 @@ namespace ExtensionsDev
             };
             return ctrl;
         }
+        public static SearchLookUpEdit SetData<T>(this SearchLookUpEdit ctrl, Func<Task<List<T>>> onGetDataAsync, string valueField = "Id", string displayField = "")
+        {
+            ctrl.Properties.ValueMember = valueField;
+            ctrl.Properties.KeyMember = valueField;
+            ctrl.Properties.DisplayMember = displayField;
+            ctrl.QueryPopUp += Ctrl_QueryPopUp;
+            ctrl.Tag = onGetDataAsync;
+            GridView view = ctrl.Properties.View;
+            view.Tag = ctrl;
+            view.OptionsView.ShowColumnHeaders = true;
+            view.GridControl.UseDefault<T>(null);
+            ctrl.Properties.DataSource = onGetDataAsync().Result;
+            return ctrl;
+        }
+
+        internal static RepositoryItemSearchLookUpEdit SetData<T>(this RepositoryItemSearchLookUpEdit ctrl, List<T> data)
+        {
+            ctrl.QueryPopUp += Ctrl_QueryPopUp;
+            ctrl.DataSource = data;
+            GridView view = ctrl.View;
+            view.Layout += (sender, e) =>
+            {
+                (sender as GridView).SaveLayoutToXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
+            };
+            if (File.Exists($"Layout\\{ctrl.Name}.xml"))
+            {
+                view.RestoreLayoutFromXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
+                view.ClearColumnsFilter();
+                view.ClearFindFilter();
+                view.ClearInHeaderSearchText();
+                view.ClearSorting();
+                view.ClearSelection();
+            }
+            view.Tag = ctrl;
+            view.OptionsView.ShowColumnHeaders = true;
+            return ctrl;
+        }
+        internal static RepositoryItemSearchLookUpEdit SetData<T>(this RepositoryItemSearchLookUpEdit ctrl, Func<Task<List<T>>> onGetDataAsync)
+        {
+            ctrl.QueryPopUp += Ctrl_QueryPopUp;
+            ctrl.Tag = onGetDataAsync;
+            GridView view = ctrl.View;
+            view.Layout += (sender, e) =>
+            {
+                (sender as GridView).SaveLayoutToXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
+            };
+            if (File.Exists($"Layout\\{ctrl.Name}.xml"))
+            {
+                view.RestoreLayoutFromXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
+                view.ClearColumnsFilter();
+                view.ClearFindFilter();
+                view.ClearInHeaderSearchText();
+                view.ClearSorting();
+                view.ClearSelection();
+            }
+            view.Tag = ctrl;
+            view.OptionsView.ShowColumnHeaders = true;
+            return ctrl;
+        }
+
         private static async void Ctrl_QueryPopUp(object sender, System.ComponentModel.CancelEventArgs e)
         {
             var ctrl = sender as SearchLookUpEdit;
@@ -140,6 +206,5 @@ namespace ExtensionsDev
 
 
         }
-
     }
 }

+ 13 - 13
DW5S.App/UserControl/CtrlCdbTx.cs

@@ -15,7 +15,7 @@ namespace DW5S.App.UserControl
 {
     public partial class CtrlCdbTx : DevExpress.XtraEditors.XtraUserControl
     {
-        readonly List<TxInfo> list = new List<TxInfo>();
+        readonly List<CdbTxViewModel> list = new List<CdbTxViewModel>();
         public CtrlCdbTx()
         {
             InitializeComponent();
@@ -26,12 +26,12 @@ namespace DW5S.App.UserControl
             {
                 gridCdbTx.UseDefault(list).UseMultiSelect().UseRowNumber()
                     .UseAddAsync(Add)
-                    .UseEditAsync<TxInfo>(Edit)
-                    .UseDeleteAsync<TxInfo>(Delete);
+                    .UseEditAsync<CdbTxViewModel>(Edit)
+                    .UseDeleteAsync<CdbTxViewModel>(Delete);
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsCdbTx = unitOfWork.Of<TxInfo>();
                 var items = await repsCdbTx.FindAsync(f => f.TxType == EnumTxType.Cdb, p => p.Name);
-                list.AddRange(items);
+                list.AddRange(items.To<List<CdbTxViewModel>>());
 
             }
             catch (Exception ex)
@@ -42,18 +42,19 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<TxInfo> Add()
+        private async Task<CdbTxViewModel> Add()
         {
             try
             {
                 CdbEditor frm = new CdbEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
-                var addItem = frm.info;
+                var addItem = frm.info.To<TxInfo>();
+                addItem.TxType = EnumTxType.Cdb;
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsCdbTx = unitOfWork.Of<TxInfo>();
-                await repsCdbTx.AddOrUpdateAsync(addItem);
+               var res = await repsCdbTx.AddOrUpdateAsync(addItem);
                 await unitOfWork.SaveAsync();
-                return addItem;
+                return res.To<CdbTxViewModel>();
             }
             catch (Exception ex)
             {
@@ -64,7 +65,7 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<TxInfo> Edit(TxInfo editItem)
+        private async Task<CdbTxViewModel> Edit(CdbTxViewModel editItem)
         {
             try
             {
@@ -80,7 +81,6 @@ namespace DW5S.App.UserControl
                 find.Remark = editItem.Remark;
                 await repsCdbTx.AddOrUpdateAsync(find);
                 await unitOfWork.SaveAsync();
-
                 return editItem;
             }
             catch (Exception ex)
@@ -92,13 +92,13 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<bool> Delete(List<TxInfo> list)
+        private async Task<bool> Delete(List<CdbTxViewModel> list)
         {
             try
             {
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsCdbTx = unitOfWork.Of<TxInfo>();
-                await repsCdbTx.DeleteAsync(list);
+                await repsCdbTx.DeleteAsync(list.To<List<TxInfo>>());
                 await unitOfWork.SaveAsync();
                 return true;
             }
@@ -113,7 +113,7 @@ namespace DW5S.App.UserControl
 
         private async void gridView1_DoubleClick(object sender, EventArgs e)
         {
-            var editItem = gridView.GetFocusedRow() as TxInfo;
+            var editItem = gridView.GetFocusedRow() as CdbTxViewModel;
             if (editItem == null) return;
             await Edit(editItem);
         }

+ 13 - 12
DW5S.App/UserControl/CtrlCxTx.cs

@@ -17,7 +17,7 @@ namespace DW5S.App.UserControl
     {
         
         
-        readonly List<TxInfo> list = new List<TxInfo>();
+        readonly List<CxTxViewModel> list = new List<CxTxViewModel>();
         public CtrlCxTx()
         {
             InitializeComponent();
@@ -28,12 +28,12 @@ namespace DW5S.App.UserControl
             {
                 gridRefTx.UseDefault(list).UseMultiSelect().UseRowNumber()
                     .UseAddAsync(Add)
-                    .UseEditAsync<TxInfo>(Edit)
-                    .UseDeleteAsync<TxInfo>(Delete);
+                    .UseEditAsync<CxTxViewModel>(Edit)
+                    .UseDeleteAsync<CxTxViewModel>(Delete);
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsCxTx = unitOfWork.Of<TxInfo>();
                 var items = await repsCxTx.FindAsync(f=>f.TxType== EnumTxType.Cx, p => p.Name);
-                list.AddRange(items);
+                list.AddRange(items.To<List<CxTxViewModel>>());
             }
             catch (Exception ex)
             {
@@ -43,18 +43,19 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<TxInfo> Add()
+        private async Task<CxTxViewModel> Add()
         {
             try
             {
                 CxEditor frm = new CxEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
-                var addItem = frm.info;
+                var addItem = frm.info.To<TxInfo>();
+                addItem.TxType = EnumTxType.Cx;
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsCxTx = unitOfWork.Of<TxInfo>();
-                await repsCxTx.AddOrUpdateAsync(addItem);
+                var res = await repsCxTx.AddOrUpdateAsync(addItem);
                 await unitOfWork.SaveAsync();
-                return addItem;
+                return res.To<CxTxViewModel>();
             }
             catch (Exception ex)
             {
@@ -65,7 +66,7 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<TxInfo> Edit(TxInfo editItem)
+        private async Task<CxTxViewModel> Edit(CxTxViewModel editItem)
         {
             try
             {
@@ -92,13 +93,13 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<bool> Delete(List<TxInfo> list)
+        private async Task<bool> Delete(List<CxTxViewModel> list)
         {
             try
             {
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsCxTx = unitOfWork.Of<TxInfo>();
-                await repsCxTx.DeleteAsync(list);
+                await repsCxTx.DeleteAsync(list.To<List<TxInfo>>());
                 await unitOfWork.SaveAsync();
                 return true;
             }
@@ -113,7 +114,7 @@ namespace DW5S.App.UserControl
 
         private async void gridView1_DoubleClick(object sender, EventArgs e)
         {
-            var editItem = gridView.GetFocusedRow() as TxInfo;
+            var editItem = gridView.GetFocusedRow() as CxTxViewModel;
             if (editItem == null) return;
             await Edit(editItem);
         }

+ 1 - 1
DW5S.App/UserControl/CtrlHome.cs

@@ -93,7 +93,7 @@ namespace DW5S.App.UserControl
             });
             gridHomeTask.UseDefault(list, showScrollH: true).UseEmptyText("点击+创建任务");
             gridView1.BestFitColumns();
-            gridHomePosRes.UseDefault(new List<ModelPosRes>()).UseMultiSelect().UseRowNumber().UseNullValueText()
+            gridHomePosRes.UseDefault(new List<ModelPosRes>()).UseMultiSelect().UseRowNumber()
                 .AddRowMenu<ModelPosRes>("绘制时差线", SvgHelper.CreateDtoLine(), DrawDtoLine)
                 .AddRowMenu<ModelPosRes>("GDOP分析", SvgHelper.CreateGDOP(), DrawGdopLine)//, item => item.PosResType != EnumPosResType.RH
                 .AddRowMenu<ModelPosRes>("查看参估", SvgHelper.CreateShowCafRes(), ShowCafRes)

+ 6 - 4
DW5S.App/UserControl/CtrlRecTx.cs

@@ -28,7 +28,9 @@ namespace DW5S.App.UserControl
                 gridRecTx.UseDefault(list).UseMultiSelect().UseRowNumber()
                      .UseAddAsync(Add)
                      .UseEditAsync<RecTxViewModel>(Edit)
-                     .UseDeleteAsync<RecTxViewModel>(Delete);
+                     .UseDeleteAsync<RecTxViewModel>(Delete)
+                     .UseBoolColumn(nameof(RecTxViewModel.Enable),"启用","禁用");
+                     
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsRecTx = unitOfWork.Of<TxInfo>();
                 var items = await repsRecTx.FindAsync(f => f.TxType == EnumTxType.Rec, p => p.Name);
@@ -48,12 +50,13 @@ namespace DW5S.App.UserControl
             {
                 RecEditor frm = new RecEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
-                var addItem = frm.info;
+                var addItem = frm.info.To<TxInfo>();
+                addItem.TxType = EnumTxType.Rec;
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsRecTx = unitOfWork.Of<TxInfo>();
                var res = await repsRecTx.AddOrUpdateAsync(addItem);
                 await unitOfWork.SaveAsync();
-                return addItem.To<RecTxViewModel>();
+                return res.To<RecTxViewModel>();
             }
             catch (Exception ex)
             {
@@ -78,7 +81,6 @@ namespace DW5S.App.UserControl
                 find.Lon = editItem.Lon;
                 find.Lat = editItem.Lat;
                 find.Remark = editItem.Remark;
-                find.TxType = EnumTxType.Rec;
                 await repsRecTx.AddOrUpdateAsync(find);
                 await unitOfWork.SaveAsync();
                 return editItem.To<RecTxViewModel>();

+ 14 - 13
DW5S.App/UserControl/CtrlRefTx.cs

@@ -15,7 +15,7 @@ namespace DW5S.App.UserControl
 {
     public partial class CtrlRefTx : DevExpress.XtraEditors.XtraUserControl
     {
-        readonly List<TxInfo> list = new List<TxInfo>();
+        readonly List<RefTxViewModel> list = new List<RefTxViewModel>();
         public CtrlRefTx()
         {
             InitializeComponent();
@@ -26,12 +26,12 @@ namespace DW5S.App.UserControl
             {
                 gridRefTx.UseDefault(list).UseMultiSelect().UseRowNumber()
                     .UseAddAsync(Add)
-                    .UseEditAsync<TxInfo>(Edit)
-                    .UseDeleteAsync<TxInfo>(Delete);
+                    .UseEditAsync<RefTxViewModel>(Edit)
+                    .UseDeleteAsync<RefTxViewModel>(Delete);
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsRefTx = unitOfWork.Of<TxInfo>();
                 var items = await repsRefTx.FindAsync(f => f.TxType == EnumTxType.Ref, p => p.Name);
-                list.AddRange(items);
+                list.AddRange(items.To<List<RefTxViewModel>>());
             }
             catch (Exception ex)
             {
@@ -41,18 +41,19 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<TxInfo> Add()
+        private async Task<RefTxViewModel> Add()
         {
             try
             {
                 RefEditor frm = new RefEditor();
                 if (frm.ShowDialog() != DialogResult.OK) return null;
-                var addItem = frm.info;
+                var addItem = frm.info.To<TxInfo>();
+                addItem.TxType = EnumTxType.Ref;
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsRefTx = unitOfWork.Of<TxInfo>();
-              var ss=  await repsRefTx.AddOrUpdateAsync(addItem);
-               var res= await unitOfWork.SaveAsync();
-                return addItem;
+                var res=  await repsRefTx.AddOrUpdateAsync(addItem);
+                await unitOfWork.SaveAsync();
+                return res.To<RefTxViewModel>();
             }
             catch (Exception ex)
             {
@@ -63,7 +64,7 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<TxInfo> Edit(TxInfo editItem)
+        private async Task<RefTxViewModel> Edit(RefTxViewModel editItem)
         {
             try
             {
@@ -90,13 +91,13 @@ namespace DW5S.App.UserControl
             }
         }
 
-        private async Task<bool> Delete(List<TxInfo> list)
+        private async Task<bool> Delete(List<RefTxViewModel> list)
         {
             try
             {
                 var unitOfWork = IocContainer.UnitOfWork;
                 var repsRefTx = unitOfWork.Of<TxInfo>();
-                await repsRefTx.DeleteAsync(list);
+                await repsRefTx.DeleteAsync(list.To<List<TxInfo>>());
                 await unitOfWork.SaveAsync();
                 return true;
             }
@@ -111,7 +112,7 @@ namespace DW5S.App.UserControl
 
         private async void gridView1_DoubleClick(object sender, EventArgs e)
         {
-            var editItem = gridView.GetFocusedRow() as TxInfo;
+            var editItem = gridView.GetFocusedRow() as RefTxViewModel;
             if (editItem == null) return;
             await Edit(editItem);
         }

+ 1 - 1
DW5S.Basic/01.DW5S.Basic.csproj

@@ -9,7 +9,7 @@
 	<ItemGroup>
 		<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
 		<PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
-		<PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.1" />
+		<PackageReference Include="System.Configuration.ConfigurationManager" Version="9.0.2" />
 	</ItemGroup>
 
 </Project>

+ 5 - 0
DW5S.Controller/DetectCgController.cs

@@ -10,6 +10,7 @@ using DW5S.Repostory;
 using DW5S.WebApi;
 using Microsoft.AspNetCore.Mvc;
 using DW5S.Service;
+using Serilog;
 
 namespace DW5S.Controllers
 {
@@ -18,6 +19,10 @@ namespace DW5S.Controllers
     /// </summary>
     public class DetectCgController : BaseController
     {
+        ILogger logger { get; set; }
+
+        IUnitOfWork unitOfWork { get; set; }
+
         /// <summary>
         /// CPU参估计算(需要先上传文件)
         /// </summary>

+ 2 - 4
DW5S.Controller/FindRefController.cs

@@ -18,11 +18,9 @@ namespace DW5S.Controllers
     /// </summary>
     public class FindRefController : BaseController
     {
-        [Autowired]
-        private readonly ILogger logger;
+        ILogger logger { get; set; }
 
-        [Autowired]
-        private readonly UnitOfWork unitOfWork;
+        IUnitOfWork unitOfWork { get; set; }
 
         /// <summary>
         /// 添加两星一地参考信号缓存

+ 3 - 5
DW5S.Controller/LogController.cs

@@ -12,8 +12,8 @@ using DW5S.WebApi;
 using System.Diagnostics;
 using System.Configuration;
 using Microsoft.AspNetCore.Mvc;
-using Serilog;
 using Microsoft.EntityFrameworkCore;
+using Serilog;
 
 namespace DW5S.Controllers
 {
@@ -22,11 +22,9 @@ namespace DW5S.Controllers
     /// </summary>
     public class LogController : BaseController
     {
-        [Autowired]
-        private readonly ILogger logger;
+        ILogger logger { get; set; }
 
-        [Autowired]
-        private readonly UnitOfWork unitOfWork;
+        IUnitOfWork unitOfWork { get; set; }
 
 
         /// <summary>

+ 2 - 4
DW5S.Controller/PosController.cs

@@ -22,11 +22,9 @@ namespace DW5S.Controllers
     /// </summary>
     public class PosController : BaseController
     {
-        [Autowired]
-        private readonly ILogger logger;
+        ILogger logger { get; set; }
 
-        [Autowired]
-        private readonly UnitOfWork unitOfWork;
+        IUnitOfWork unitOfWork { get; set; }
 
         #region 一星一地测向定位
 

+ 2 - 4
DW5S.Controller/ResultController.cs

@@ -19,11 +19,9 @@ namespace DW5S.Controllers
     /// </summary>
     public class ResultController : BaseController
     {
-        [Autowired]
-        private readonly ILogger logger;
+        ILogger logger { get; set; }
 
-        [Autowired]
-        private readonly UnitOfWork unitOfWork;
+        IUnitOfWork unitOfWork { get; set; }
 
         /// <summary>
         /// 根据时间范围查询参估结果

+ 4 - 2
DW5S.Controller/SvrReportController.cs

@@ -7,6 +7,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using DW5S.DTO;
+using DW5S.Repostory;
 using DW5S.WebApi;
 using Microsoft.AspNetCore.Mvc;
 using Serilog;
@@ -18,8 +19,9 @@ namespace DW5S.Controllers
     /// </summary>
     public class SvrReportController : BaseController
     {
-        [Autowired]
-        private readonly ILogger logger;
+        ILogger logger { get; set; }
+
+        IUnitOfWork unitOfWork { get; set; }
 
         /// <summary>
         /// 服务状态上报

+ 2 - 4
DW5S.Controller/XlController.cs

@@ -20,11 +20,9 @@ namespace DW5S.Controllers
     /// </summary>
     public class XlController : BaseController
     {
-        [Autowired]
-        private readonly ILogger logger;
+        ILogger logger { get; set; }
 
-        [Autowired]
-        private readonly UnitOfWork unitOfWork;
+        IUnitOfWork unitOfWork { get; set; }
 
         /// <summary>
         /// 导入Tle星历文件

+ 1 - 1
DW5S.Repostory/04.DW5S.Repostory.csproj

@@ -6,7 +6,7 @@
 		<RootNamespace>DW5S.Repostory</RootNamespace>
 	</PropertyGroup>
 	<ItemGroup>
-		<PackageReference Include="Autofac" Version="8.1.1" />
+		<PackageReference Include="Autofac" Version="8.2.0" />
 		<PackageReference Include="EFCore.NamingConventions" Version="7.0.2" />
 		<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.20" />
 		<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.20">

+ 12 - 0
DW5S.Repostory/Repository/IRepository.cs

@@ -120,10 +120,19 @@ namespace DW5S.Repostory
         {
             if (entity.First().Id == 0)
             {
+                foreach (var item in entity)
+                {
+                    item.CreateTime = DateTime.Now;
+                    item.UpdateTime= DateTime.Now;  
+                }
                 await dbSet.AddRangeAsync(entity);
             }
             else
             {
+                foreach (var item in entity)
+                {
+                    item.UpdateTime = DateTime.Now;
+                }
                 dbSet.UpdateRange(entity);
             }
         }
@@ -132,11 +141,14 @@ namespace DW5S.Repostory
         {
             if (entity.Id == 0)
             {
+                entity.CreateTime = DateTime.Now;
+                entity.UpdateTime = DateTime.Now;
                 var res = await dbSet.AddAsync(entity);
                 return res.Entity;
             }
             else
             {
+                entity.UpdateTime = DateTime.Now;
                 var res = dbSet.Update(entity);
                 return res.Entity;
             }

+ 1 - 1
DW5S.Service/07.DW5S.Service.csproj

@@ -8,7 +8,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Autofac" Version="8.1.1" />
+    <PackageReference Include="Autofac" Version="8.2.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 0 - 1
DW5S.ViewModel/BaseViewModel.cs

@@ -16,7 +16,6 @@ namespace DW5S.ViewModel
         [Display(Name = "创建时间")]
         public DateTime CreateTime { get; set; }
 
-
         [Display(Name = "更新时间")]
         public DateTime UpdateTime { get; set; }
     }

+ 3 - 0
DW5S.ViewModel/RecTxViewModel.cs

@@ -25,5 +25,8 @@ namespace DW5S.Entity
 
         [Display(Name = "备注")]
         public string Remark { get; set; }
+
+        [Display(Name = "状态")]
+        public bool Enable { get; set; }
     }
 }

+ 3 - 3
DW5S.WebApi/05.DW5S.WebApi.csproj

@@ -11,12 +11,12 @@
 		<FrameworkReference Include="Microsoft.AspNetCore.App" />
 	</ItemGroup>
 	<ItemGroup>
-		<PackageReference Include="Grpc.AspNetCore" Version="2.66.0" />
-		<PackageReference Include="Autofac" Version="8.1.1" />
+		<PackageReference Include="Grpc.AspNetCore" Version="2.67.0" />
+		<PackageReference Include="Autofac" Version="8.2.0" />
 		<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
 		<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.20" />
 		<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
-		<PackageReference Include="Swashbuckle.AspNetCore" Version="6.9.0" />
+		<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
 	</ItemGroup>
 	<ItemGroup>
 	  <ProjectReference Include="..\DW5S.Basic\01.DW5S.Basic.csproj" />