| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 | using DevExpress.Data;using DevExpress.Mvvm;using DevExpress.Xpo;using DevExpress.XtraBars;using DevExpress.XtraEditors;using DevExpress.XtraGrid.Views.Grid;using Ips.Library.Basic;using Ips.Library.DxpLib;using Ips.Library.Entity;using Ips.Sps.Store;using Ips.Sps.Tools;using Ips.Sps.Tools.HandPoses;using Ips.Sps.TskResults.Commands;using Ips.Sps.TskResults.Peses;using System.ComponentModel;using System.Data;namespace Ips.Sps.TskResults.Poses{    public partial class PosListCtrl : DevExpress.XtraEditors.XtraUserControl    {        public PosListCtrl()        {            InitializeComponent();            posTypeCheckedComboBoxEdit.Items.AddEnum<PosType>();            this.gvPosList.RowCellStyle += GvPosList_RowCellStyle;            _posStore = PosStore.Default;            _posStore.ListFilterChanged += _posStore_ListFilterChanged;            RegisterMessages();        }        private void _posStore_ListFilterChanged(object sender, EventArgs e)        {            if (_posStore.FilterPosIds.IsNotNullOrEmpty())            {                gvPosList.ActiveFilterString = $"[Id] in ({_posStore.FilterPosIds.JoinAsString(",")})";            }            else            {                gvPosList.ActiveFilterString = null;            }        }        PosStore _posStore;        RealTimeSource realTimeSource;        private bool _isFullQuery = false;        private void RegisterMessages()        {            Messenger.Default.Register<PosSelectedChangedMessage>(this.Parent, "map", PosListSelectedChanged);        }        private void PosListCtrl_Load(object sender, EventArgs e)        {            BindList();            realTimeSource = new RealTimeSource() { DataSource = _posStore.List, IgnoreItemEvents = true };            grdPosList.DataSource = realTimeSource;            gvPosList.BestFitColumns();        }        private void BindList()        {            var queryModel = _posStore.QueryModel;            queryModel.LastHours = (int)(txtSigTimeRange.EditValue ?? 0);            queryModel.PosTypes = (txtPosType.EditValue as List<object>)?.Cast<PosType>()?.ToArray();            queryModel.ShowNotValidPoint = (bool)(txtShowInValid.EditValue ?? false);            _posStore.List.ListChanged += List_ListChanged;            _posStore.GetAll();            pesGridListCtrl1.SetResourceList(xpcSat, xpcEmt);        }        public void PosListSelectedChanged(PosSelectedChangedMessage msg)        {            if (msg.PosId > 0)            {                this.Invoke(() =>                {                    var rowHandle = gvPosList.LocateByValue(colId.FieldName, msg.PosId);                    if (rowHandle < 0) return;                    gvPosList.FocusedRowHandle = rowHandle;                });            }        }        private void List_ListChanged(object sender, ListChangedEventArgs e)        {            this.Invoke(() =>            {                txtPosCount.Caption = $"共{_posStore.List.Count}个定位点";                if (e.ListChangedType == ListChangedType.ItemAdded)                {                    if (gvPosList.TopRowIndex < 3)                    {                        gvPosList.TopRowIndex = 0;                    }                }            });        }        private void GvPosList_RowCellStyle(object sender, RowCellStyleEventArgs e)        {            if (e.RowHandle < 0) return;            if (e.Column == colPosText || e.Column == colMirrText)            {                var isValid = (bool)gvPosList.GetRowCellValue(e.RowHandle, colIsValid);                if (!isValid)                {                    e.Appearance.BackColor = Color.LightGray;                }            }        }        private void QueryModel_Changed(object sender, EventArgs e)        {            if (_isFullQuery) return;            BindList();        }        private void btnFind_ItemClick(object sender, ItemClickEventArgs e)        {            var form = new PosQueryForm(_posStore.QueryModel);            if (form.ShowDialog() == DialogResult.OK)            {                try                {                    var queryModel = _posStore.QueryModel;                    if (queryModel.LastHours == 0)                    {                        txtSigTimeRange.EditValue = null;                    }                    else                    {                        txtSigTimeRange.EditValue = queryModel.LastHours;                    }                    txtPosType.EditValue = queryModel.PosTypes;                    txtShowInValid.EditValue = queryModel.ShowNotValidPoint;                    BindList();                }                catch (Exception ex)                {                    MsgHelper.ShowError("查询定位列表错误:" + ex.Message);                }                finally                {                    _isFullQuery = false;                }            }        }        private void gvPosList_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)        {            if (e.ListSourceRowIndex < 0) return;            if (e.Column == colSigFreq)            {                e.DisplayText = ((long)e.Value).E6m().ToString();            }            else if (e.Column == colBandWidth)            {                e.DisplayText = ((int)e.Value).E3m().ToString();            }            else if (e.Column == colEmtId)            {                if ((int)e.Value == 0)                {                    e.DisplayText = "未知";                }            }            else if (e.Column == colPosType)            {                var rowHandle = gvPosList.GetRowHandle(e.ListSourceRowIndex);                var gdopErr = (int)gvPosList.GetRowCellValue(rowHandle, colGdopErr);                if (gdopErr > 0)                    e.DisplayText = $"{EnumDisplayTextHelper.GetCachedDisplayText(e.Value)}({gdopErr * 1e-3:F1}km)";            }        }        private void gvPosList_RowClick(object sender, RowClickEventArgs e)        {            if (e.Button == MouseButtons.Right)            {                var rowHandles = gvPosList.GetSelectedRows();                if (rowHandles.Length == 1)                {                    var isValid = (bool)gvPosList.GetFocusedRowCellValue(colIsValid);                    btnSetNotValid.Visibility = isValid ? BarItemVisibility.Always : BarItemVisibility.Never;                    btnSetValid.Visibility = isValid ? BarItemVisibility.Never : BarItemVisibility.Always;                }                else                {                    btnSetNotValid.Visibility = btnSetValid.Visibility = BarItemVisibility.Always;                }                popMenu.ShowPopup(Cursor.Position);            }        }        private void btnDrawDtoDfoLine_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)        {            DrawDtoDfoLine(true);        }        private void btnDrawDtoDfoLineNoRef_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)        {            DrawDtoDfoLine(false);        }        private void DrawDtoDfoLine(bool hasRef)        {            try            {                MsgHelper.ShowOverlay(this);                var posId = (long)gvPosList.GetFocusedRowCellValue(colId);                var cmd = DrawLineMessage.CreateByPos(posId, hasRef);                Messenger.Default.Send(cmd);                MsgHelper.CloseOverlay();            }            catch (Exception ex)            {                MsgHelper.CloseOverlay();                MsgHelper.ShowError("绘制时频差线出错,错误消息:" + ex.Message);            }        }        private void btnUseMirr_ItemClick(object sender, ItemClickEventArgs e)        {            var idxs = gvPosList.GetSelectDataIndexes();            if (idxs.IsNullOrEmpty())            {                MsgHelper.ShowError("请选择定位点");                return;            }            try            {                _posStore.UseMirr(idxs);            }            catch (Exception ex)            {                MsgHelper.ShowError(ex.Message);            }        }        private void btnDeletePos_ItemClick(object sender, ItemClickEventArgs e)        {            var idxs = gvPosList.GetSelectDataIndexes();            if (idxs.IsNullOrEmpty())            {                MsgHelper.ShowError("请选择定位点");                return;            }            bool isOk = MsgHelper.ShowConfirm("你确定要删除选择的定位点吗?");            if (!isOk) return;            try            {                _posStore.Delete(idxs);            }            catch (Exception ex)            {                MsgHelper.ShowError(ex.Message);            }        }        private void btnShowPes_ItemClick(object sender, ItemClickEventArgs e)        {            var posId = (long)gvPosList.GetFocusedRowCellValue(colId);            BindPesList(posId);            pnlPesList.Width = this.Width - 60;            pnlPesList.ShowBeakForm();        }        private void BindPesList(long posId)        {            var pesIds = Session.DefaultSession.Query<PosRel>()                .Where(m => m.PosId == posId)                .Select(m => m.PesId)                .ToList();            var pesList = Session.DefaultSession.Query<Pes>()                .Where(m => pesIds.Contains(m.Id))                .OrderBy(m => m.Category).ThenByDescending(m => m.SigTime)                .ToList();            pesGridListCtrl1.SetDataSource(pesList);        }        private void grpPesList_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)        {            if (e.Button.Properties.Caption == "关闭")            {                pnlPesList.HideBeakForm();            }        }        private void btnSetValid_ItemClick(object sender, ItemClickEventArgs e)        {            var idxs = gvPosList.GetSelectDataIndexes();            if (idxs.IsNullOrEmpty())            {                MsgHelper.ShowError("请选择定位点");                return;            }            try            {                bool isValid = e.Item == btnSetValid;                _posStore.SetValid(idxs, isValid);            }            catch (Exception ex)            {                MsgHelper.ShowError(ex.Message);            }        }        private void btnHandPos_ItemClick(object sender, ItemClickEventArgs e)        {            SimpleHandPosForm form = new SimpleHandPosForm();            var posId = (long)gvPosList.GetFocusedRowCellValue(colId);            form.PosId = posId;            FormManager.ShowDocument(form);        }        private void gvPosList_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)        {            if (gvPosList.FocusedRowHandle < 0) return;            var posId = (long)gvPosList.GetFocusedRowCellValue(colId);            _posStore.SetGridSelectPosId(posId);            if (pnlPesList.Visible)            {                BindPesList(posId);            }        }        private void btnErrEllipse_ItemClick(object sender, ItemClickEventArgs e)        {            var posId = (long)gvPosList.GetFocusedRowCellValue(colId);            if (posId == 0) return;            var msg = new DrawLocErrMessage(posId);            Messenger.Default.Send(msg);        }        private void btnGdopAnalyse_ItemClick(object sender, ItemClickEventArgs e)        {            var posId = (long)gvPosList.GetFocusedRowCellValue(colId);            if (posId == 0) return;            var gdopAnalyForm = new GdopAnalyseForm(posId);            FormManager.ShowDocument(gdopAnalyForm);        }        private void btnExportCsv_ItemClick(object sender, ItemClickEventArgs e)        {            string filename = ToolDialog.SaveFile($"定位列表{DateTime.Now:yyyyMMddHHmmss}.csv", "导出定位列表", null, "csv文件(*.csv)|*.csv");            if (filename.IsNotNullOrWhitespace())            {                gvPosList.ExportToCsv(filename);            }        }        private void btnEditPos_ItemClick(object sender, ItemClickEventArgs e)        {            var posId = (long)gvPosList.GetFocusedRowCellValue(colId);            if (posId == 0) return;            PosEditForm editForm = new PosEditForm(posId);            if (editForm.ShowDialog() == DialogResult.OK)            {                BindList();            }        }    }}
 |