using System; using System.Collections.Generic; using System.Drawing; using System.Data; using System.Windows.Forms; using KGIS.Framework.Views; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Controls; using KGIS.Framework.Maps; using DevExpress.XtraBars; using DevExpress.XtraGrid.Views.Grid; using KGIS.Framework.Platform; using ESRI.ArcGIS.Geometry; using DevExpress.XtraGrid.Columns; using System.Linq; using System.Threading.Tasks; using KGIS.Framework.Utils; using KGIS.Framework.Platform.Helper; using System.Collections; using KGIS.Framework.Utils.Helper; using KGIS.Framework.Utils.Interface; using DockStyle = KGIS.Framework.Views.DockStyle; using Kingo.Plugin.MapView.Common; using Kingo.PluginServiceInterface; using ESRI.ArcGIS.esriSystem; using KGIS.Framework.AE; using KGIS.Framework.ThreadManager; using System.Runtime.InteropServices; using KGIS.Framework.Utils.ExtensionMethod; using KGIS.Framework.AE.Enum; using System.IO; using DevExpress.Data; using System.Xml; namespace Kingo.Plugin.MapView.Views { public partial class ViewAttrTable : UserControl, IDockPanel2, IAttrTableView { #region UCAttribute_Form类全局变量 /// /// 视图选中数量(取消了默认焦点行,该值为零) /// int SelectCount = 0; /// /// 要查询的属性图层 /// private IFeatureLayer _curFeatureLayer; public IFeatureLayer CurFeatureLayer { get { return _curFeatureLayer; } set { _curFeatureLayer = value; } } /// /// 当前图层 /// private IFeatureClass SourceFeature { get; set; } /// /// 要查询的属性图层 /// private IHookHelper _hookHelper; public IHookHelper M_hookHelper { get { return _hookHelper; } set { _hookHelper = value; } } public static bool selectbox = false;//选择 /// /// GridView视图表 /// DataTable Data = new DataTable(); /// /// 视图数据 /// IFeature pFeature = null; /// /// 编辑状态 /// public bool isEngineEditing = true; EngineEditor engineEditor = new EngineEditor(); /// /// 属性表全部的objectid /// List objectids = new List(); /// /// 属性表过滤后全部的OIDs /// List Filteredids = new List(); /// /// 初始化mapService工具 /// IMapService _mapService = null; private int IndexOID = 1; private EngineEditor _Edit = null; public List AttrTableViewLists = new List(); #endregion public ViewAttrTable(object m_hookHelper, List pViewParam) { InitializeComponent(); DockAreas = DockStyle.DockRight | DockStyle.DockBottom | DockStyle.DockLeft; FloatSize = new Size(1030, 660); DockWidth = 660; DockHeight = 380; DefaultArea = DockStyle.DockBottom; ShowCloseButton = true; ShowAutoHideButton = false; IsShowInMap = true; this.gridView1.PopupMenuShowing += GridView1_PopupMenuShowing; Platform.Instance.NotifyMsgEven2 += Instance_NotifyMsgEven2; _hookHelper = m_hookHelper as IHookHelper; InitView(pViewParam); _Edit = new EngineEditorClass(); _Edit.OnStartEditing += () => { // }; DeleteSelected.Enabled = false; } //属性表图层处于编辑状态 可修改值 private void gridView1_CellValueChangedEvent(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { EditFeature(e.Column.FieldName, e.Value); } public void EditFeature(string ColumnName, object value) { IFeature pFeature = null; IFeatureCursor pFeatureCursor = null; try { int ColumnIndex = _curFeatureLayer.FeatureClass.FindField(ColumnName); QueryFilter filter = new QueryFilterClass(); filter.WhereClause = $"OBJECTID = {(gridView1.DataSource as DataView)[gridView1.GetFocusedDataSourceRowIndex()][KeyIDName].ToString()}"; pFeatureCursor = _curFeatureLayer.FeatureClass.Update(filter, true); while ((pFeature = pFeatureCursor.NextFeature()) != null) { if (pFeature.OID.ToString() == (gridView1.DataSource as DataView)[gridView1.GetFocusedDataSourceRowIndex()][KeyIDName].ToString()) { pFeature.set_Value(ColumnIndex, value); pFeatureCursor.UpdateFeature(pFeature); break; } } #region //方法二 //string sql = string.Format("UPDATE {0} SET {1} = '{2}' WHERE OBJECTID={3}", (_curFeatureLayer.FeatureClass as FeatureClass).BrowseName, ColumnName, value, (gridView1.DataSource as DataView)[gridView1.GetFocusedDataSourceRowIndex()][KeyIDName].ToString()); //(_curFeatureLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL(sql); //FeatureClass featureClass = _curFeatureLayer.FeatureClass as FeatureClass; //IWorkspace workspace = featureClass.Workspace; //workspace.ExecuteSQL(sql); #endregion } catch (Exception ex) { LogAPI.Debug("属性表编辑更新失败,原因如下:" + ex.Message); return; } finally { if (pFeatureCursor != null) Marshal.ReleaseComObject(pFeatureCursor); if (pFeature != null) Marshal.ReleaseComObject(pFeature); } } private void gridView1_ColumnPositionChanged(object sender, EventArgs e) { Dictionary dic_Name = new Dictionary(); Dictionary dic_AliasName = new Dictionary(); try { foreach (DevExpress.XtraGrid.Columns.GridColumn g in this.gridView1.Columns) { dic_Name[g.VisibleIndex] = g.FieldName; dic_AliasName[g.VisibleIndex] = g.ToString(); } dic_Name = dic_Name.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value.ToString()); dic_AliasName = dic_AliasName.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value.ToString()); //xml文件 string xmlPath = System.IO.Path.Combine((MapsManager.Instance.CurrProjectInfo as ProjectInfo).ProjDir, "RootLayerProperty.xml"); //string xmlPath = @"D:\Kingo.BuildDB\Kingo.Plugins\Kingo.Plugin.MapView\Views\RootLayerProperty.xml"; System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument(); if (System.IO.File.Exists(xmlPath)) { xmlDocument.Load(xmlPath); XmlNode rootNode = xmlDocument.SelectSingleNode("RootLayerProperty"); if (rootNode != null) { XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes("Layers"); foreach (object obj in xmlNodeList) { XmlNode xmlNode = (XmlNode)obj; XmlAttribute node = xmlNode.Attributes["Name"]; if (node.Value == _curFeatureLayer.FeatureClass.AliasName) { rootNode.RemoveChild(xmlNode); xmlDocument.Save(xmlPath); break; } } } } else { //创建xml CreateProjectXML(xmlPath); xmlDocument.Load(xmlPath); } //根节点 XmlNode pXmlRootNode = xmlDocument.SelectSingleNode("RootLayerProperty"); //创建node XmlElement FieldElement = xmlDocument.CreateElement("Layers"); FieldElement.SetAttribute("Name", _curFeatureLayer.FeatureClass.AliasName); foreach (var item in dic_AliasName) { XmlElement childFieldElement = xmlDocument.CreateElement("FieldCfg"); childFieldElement.SetAttribute("Index", item.Key.ToString()); childFieldElement.SetAttribute("AliasName", item.Value); childFieldElement.SetAttribute("Name", dic_Name[item.Key]); FieldElement.AppendChild(childFieldElement); } pXmlRootNode.AppendChild(FieldElement); xmlDocument.Save(xmlPath); } catch (Exception ex) { LogAPI.Debug("属性表列顺序更新失败,原因如下:" + ex); return; } } /// /// 创建xml工程文件 /// /// /// public static void CreateProjectXML(string xmlPath) { try { XmlDocument pXmlDocument = new XmlDocument(); XmlDeclaration pXmlDeclaration = pXmlDocument.CreateXmlDeclaration("1.0", "utf-8", null); pXmlDocument.AppendChild(pXmlDeclaration); //加入一个根元素 XmlElement pElement = pXmlDocument.CreateElement("", "RootLayerProperty", ""); pXmlDocument.AppendChild(pElement); pXmlDocument.Save(xmlPath); } catch (Exception ex) { LogAPI.Debug("创建配置文件失败!" + ex); return; } } private void _Edit_OnDeleteFeature(IObject Object) { } private void _Edit_OnChangeFeature(IObject Object) { // } #region 加载数据 private string queryWhere = string.Empty; /// /// 查询条件 /// public string QueryWhere { get { return queryWhere; } set { queryWhere = value; } } private void ConstructColumn(IFields fields) { if (fields != null) { Data.Clear(); Data.PrimaryKey = null; Data.Columns.Clear(); Dictionary fieldIndex_NameDic = GetFieldIndex_NameDict(); if (fieldIndex_NameDic == null || fieldIndex_NameDic.Count == 0) { AddInitFieldData(fields); } else { AddInitDictionaryData(fieldIndex_NameDic, fields); } string oidField = "OBJECTID"; if (!Data.Columns.Contains(oidField) && Data.Columns.Contains("FID")) { oidField = "FID"; } Data.PrimaryKey = new DataColumn[] { Data.Columns[oidField] }; } } private void AddInitFieldData(IFields fields) { try { for (int i = 0; i < fields.FieldCount; i++) { IField field = fields.get_Field(i); if (field.Name.ToUpper().EndsWith("SHAPE")) continue; DataColumn col = new DataColumn(); col.ExtendedProperties.Add("index", i); col.ColumnName = field.Name; col.Caption = field.AliasName; switch (field.Type) { case esriFieldType.esriFieldTypeSmallInteger: col.DataType = typeof(short); break; case esriFieldType.esriFieldTypeInteger: col.DataType = typeof(int); break; case esriFieldType.esriFieldTypeSingle: break; case esriFieldType.esriFieldTypeDouble: col.DataType = typeof(double); break; case esriFieldType.esriFieldTypeString: col.DataType = typeof(string); break; case esriFieldType.esriFieldTypeDate: col.DataType = typeof(DateTime); break; case esriFieldType.esriFieldTypeOID: col.DataType = typeof(Int32); break; case esriFieldType.esriFieldTypeGeometry: break; case esriFieldType.esriFieldTypeBlob: break; case esriFieldType.esriFieldTypeRaster: break; case esriFieldType.esriFieldTypeGUID: break; case esriFieldType.esriFieldTypeGlobalID: break; case esriFieldType.esriFieldTypeXML: break; default: break; } col.ReadOnly = !field.Editable;//编辑状态启用默认是否可以编辑 if (Data.Columns.Contains(col.ColumnName) == false)//不存在则添加 { Data.Columns.Add(col); } Marshal.ReleaseComObject(field); } } catch (Exception ex) { LogAPI.Debug("加载表格数据失败!" + ex); return; } } private void AddInitDictionaryData(Dictionary fieldIndex_NameDic, IFields fields) { try { if (fields == null || fields.FieldCount == 0) return; foreach (var item in fieldIndex_NameDic) { int itemIndex = fields.FindField(item.Value); if (itemIndex == -1) continue; IField field = fields.get_Field(itemIndex); if (field.Name.ToUpper().EndsWith("SHAPE")) continue; DataColumn col = new DataColumn(); col.ExtendedProperties.Add("index", item.Key); col.ColumnName = field.Name; col.Caption = field.AliasName; switch (field.Type) { case esriFieldType.esriFieldTypeSmallInteger: col.DataType = typeof(short); break; case esriFieldType.esriFieldTypeInteger: col.DataType = typeof(int); break; case esriFieldType.esriFieldTypeSingle: break; case esriFieldType.esriFieldTypeDouble: col.DataType = typeof(double); break; case esriFieldType.esriFieldTypeString: col.DataType = typeof(string); break; case esriFieldType.esriFieldTypeDate: col.DataType = typeof(DateTime); break; case esriFieldType.esriFieldTypeOID: col.DataType = typeof(Int32); break; case esriFieldType.esriFieldTypeGeometry: break; case esriFieldType.esriFieldTypeBlob: break; case esriFieldType.esriFieldTypeRaster: break; case esriFieldType.esriFieldTypeGUID: break; case esriFieldType.esriFieldTypeGlobalID: break; case esriFieldType.esriFieldTypeXML: break; default: break; } col.ReadOnly = !field.Editable;//编辑状态启用默认是否可以编辑 if (Data.Columns.Contains(col.ColumnName) == false)//不存在则添加 { Data.Columns.Add(col); } Marshal.ReleaseComObject(field); } } catch (Exception ex) { LogAPI.Debug("加载表格数据失败!" + ex); return; } } private Dictionary GetFieldIndex_NameDict() { Dictionary fieldIndex_NameDic = new Dictionary(); try { if (MapsManager.Instance.CurrProjectInfo == null) return null; //string xmlPath = @"D:\Kingo.BuildDB\Kingo.Plugins\Kingo.Plugin.MapView\Views\RootLayerProperty.xml"; string xmlPath = System.IO.Path.Combine((MapsManager.Instance.CurrProjectInfo as ProjectInfo).ProjDir, "RootLayerProperty.xml"); System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument(); if (System.IO.File.Exists(xmlPath)) { xmlDocument.Load(xmlPath); XmlNode rootNode = xmlDocument.SelectSingleNode("RootLayerProperty"); if (rootNode != null) { XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes("Layers"); foreach (object obj in xmlNodeList) { XmlNode xmlNode = (XmlNode)obj; XmlAttribute node = xmlNode.Attributes["Name"]; if (node.Value == _curFeatureLayer.FeatureClass.AliasName) { foreach (XmlNode item in xmlNode.ChildNodes) { fieldIndex_NameDic.Add(int.Parse(item.Attributes["Index"].Value), item.Attributes["Name"].Value); } break; } } } } return fieldIndex_NameDic; } catch (Exception ex) { LogAPI.Debug("获取字段信息失败!" + ex); return fieldIndex_NameDic; } } /// /// 图层主键字段名称 /// private string KeyIDName = "OBJECTID"; private bool IsLoadData = false; /// /// 数据加载 /// /// 是否默认预查询加载 private void LoadData(bool IsLaodDefintion = true) { try { if (_curFeatureLayer == null || _curFeatureLayer.FeatureClass == null) return; KeyIDName = this._curFeatureLayer.FeatureClass.OIDFieldName; gridView1.Columns.Clear(); ConstructColumn(this._curFeatureLayer.FeatureClass.Fields); gridControl1.DataSource = Data.Clone(); gridControl1.Refresh(); //清除所有选择 _mapService.ClearFeatureSelection(_hookHelper.Hook as IMapControlDefault); string strLayer = GeoDBAPI.SerialzedPersist(_curFeatureLayer); ThreadManager.Instance.QueueUserWorkItem(new System.Threading.WaitCallback(ThreadLoadData), strLayer, new System.Threading.WaitCallback(LoadDataCompleteCallBack)); } catch (Exception ex) { LogAPI.Debug("属性表数据加载失败,原因如下:" + ex.Message); LogAPI.Debug("属性表数据加载失败,原因如下:" + ex.StackTrace); } } private void ThreadLoadData(object pParm) { try { IsLoadData = true; string strLayer = pParm.ToString(); IFeatureLayer pLayer = GeoDBAPI.DeSerialzedPersist(strLayer) as IFeatureLayer; if (pLayer == null) return; IQueryFilter queryfilter = new QueryFilterClass { WhereClause = queryWhere }; IAttributeTable AttrTable = pLayer as IAttributeTable; //ITable table = SourceFeature as ITable; ICursor cursor = AttrTable.AttributeTable.Search(queryfilter, true); int count = AttrTable.AttributeTable.RowCount(queryfilter); this.BeginInvoke((Action)delegate () { //barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + count + "已选择)"; }); IRow row = null; DataTable tempDt = Data.Copy(); tempDt.Rows.Clear(); bool isExitFeatureXML = JudgeExistsCurrentFeatureXML(); int columnCount = 0; int fieldIndex = 0; while ((row = cursor.NextRow()) != null) { DataRow dr = tempDt.NewRow(); if (isExitFeatureXML) columnCount = tempDt.Columns.Count - 1; else columnCount = tempDt.Columns.Count; for (int i = 0; i < columnCount; i++) { if (isExitFeatureXML) fieldIndex = (int)tempDt.Columns[row.Fields.FindField(tempDt.Columns[i].ColumnName)].ExtendedProperties["index"]; else fieldIndex = (int)tempDt.Columns[i].ExtendedProperties["index"]; object obj = row.get_Value(fieldIndex); if (obj == null) { continue; } else { if (obj.ToString().Contains("1899/12/30 0:00:00")) { obj = DBNull.Value; } } dr[i] = obj; } tempDt.Rows.Add(dr); if (tempDt.Rows.Count == 10000) { this.Invoke((Action)delegate () { Data = tempDt.Copy(); gridControl1.DataSource = null; gridView1.Columns.Clear(); gridControl1.DataSource = Data; //OpaqueLayerHelper.HideOpaqueLayer(); UpdateViewState(); //OpaqueLayerHelper.ShowOpaqueLayer(this, 50, true); //barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + Data.Rows.Count + "已选择)"; }); } } Data = tempDt.Copy(); Marshal.ReleaseComObject(AttrTable); Marshal.ReleaseComObject(pLayer); } catch (Exception ex) { LogAPI.Debug("属性表数据加载失败,原因如下:" + ex.Message); } } private bool JudgeExistsCurrentFeatureXML() { try { if (MapsManager.Instance.CurrProjectInfo == null) return false; //string xmlPath = @"D:\Kingo.BuildDB\Kingo.Plugins\Kingo.Plugin.MapView\Views\RootLayerProperty.xml"; string xmlPath = System.IO.Path.Combine((MapsManager.Instance.CurrProjectInfo as ProjectInfo).ProjDir, "RootLayerProperty.xml"); System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument(); if (System.IO.File.Exists(xmlPath)) { xmlDocument.Load(xmlPath); XmlNode rootNode = xmlDocument.SelectSingleNode("RootLayerProperty"); if (rootNode != null) { XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes("Layers"); foreach (object obj in xmlNodeList) { XmlNode xmlNode = (XmlNode)obj; XmlAttribute node = xmlNode.Attributes["Name"]; if (node.Value == _curFeatureLayer.FeatureClass.AliasName) { return true; } } } } return false; } catch (Exception ex) { LogAPI.Debug("判断是否存在字段配置变失败!" + ex); return false; } } public void LoadDataCompleteCallBack(object obj) { try { this.Invoke((Action)delegate () { Platform.Instance.OutputMsg(string.Format("{0}属性表加载完成,共{1}条记录", Title, Data.Rows.Count)); //OpaqueLayerHelper.HideOpaqueLayer(); gridControl1.DataSource = null; gridView1.Columns.Clear(); gridControl1.DataSource = Data; UpdateViewState(); if (Data.Rows.Count == 0) barEditItem1.EditValue = 0; else barEditItem1.EditValue = 1; barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + Data.Rows.Count + "已选择)"; IsLoadData = false; }); } catch (Exception) { LogAPI.Debug("属性表数据加载this.Invoke执行失败!"); } } private void UpdateViewState() { try { ISelectionSet pSelectionSetes = (_curFeatureLayer as IFeatureSelection).SelectionSet;//获取图层要素已被选择的 if (pSelectionSetes == null) return;//监测是否有要素被选择 IEnumIDs enumIDs = pSelectionSetes.IDs; enumIDs.Reset(); List selectionOIDs = new List(); int oid = -1; DataTable tempDT = (gridView1.DataSource as DataView).Table as DataTable; if (tempDT == null) return; gridView1.BeginSelection(); if (IsLoadData) gridView1.ClearSelection(); while ((oid = enumIDs.Next()) >= 0) { DataRow dr = tempDT.Rows.Find(oid); int i = tempDT.Rows.IndexOf(dr); int rowHandle = gridView1.GetRowHandle(i); gridView1.SelectRow(rowHandle); if (selectionOIDs.Count == 0) { gridView1.FocusedRowHandle = rowHandle; } selectionOIDs.Add(oid); } gridView1.EndSelection(); barEditItem1.EditValue = gridView1.FocusedRowHandle + 1; barEditItem3.EditValue = "(" + selectionOIDs.Count + "/" + Data.Rows.Count + "已选择)"; return; } catch (Exception) { return; } } #endregion private void Instance_NotifyMsgEven2(NotifyMsgPackage msg) { switch (msg.MsgType) { case "RefreshViewAttrTable": if (this.Data != null && this.Data.Rows.Count != 0) { if (msg.Content is IFeature) { IFeature feature = msg.Content as IFeature; int oidIndex = feature.Fields.FindField("OBJECTID"); int oid = Convert.ToInt32(feature.Value[oidIndex]); string where = string.Format("OBJECTID={0}", oid); IFeatureLayer player = MapsManager.Instance.MapService.GetFeatureLayerByName((feature.Class as FeatureClass).BrowseName); if (_curFeatureLayer.Name != player.Name) break; //IFeature ChangerF = _curFeatureLayer.FeatureClass.GetFeature(oid); IQueryFilter queryFilter = new QueryFilterClass(); queryFilter.WhereClause = where; IFeatureCursor featureCursor = player.Search(queryFilter, false); IFeature ChangerF = featureCursor.NextFeature(); DataRow[] newrow = Data.Select(where); DataRow row = newrow[0]; for (int i = 0; i < feature.Fields.FieldCount; i++) { string colName = feature.Fields.Field[i].Name; if (colName.ToUpper() == "OBJECTID" || colName.ToUpper().Contains("SHAPE")) continue; row[colName] = feature.Value[i]; ChangerF.Value[i] = feature.Value[i]; } ChangerF.Store(); Marshal.ReleaseComObject(ChangerF); } else if (msg.Content is DataRow) { DataRow row = msg.Content as DataRow; int oid = Convert.ToInt32(row["OBJECTID"]); string where = string.Format("OBJECTID={0}", oid); DataRow[] newrow = Data.Select(where); for (int i = 0; i < row.Table.Columns.Count; i++) { string colName = row.Table.Columns[i].ColumnName; if (colName.ToUpper() == "OBJECTID" || colName.ToUpper().Contains("SHAPE")) continue; if (newrow[0].Table.Columns.Contains(colName)) { Type dataType = Data.Columns[colName].DataType; if (dataType.Name == "String" && row[colName] != null && !string.IsNullOrWhiteSpace(row[colName].ToString())) { newrow[0][colName] = row[colName].ToString(); } else if (dataType.Name == "Int32" && row[colName] != null && !string.IsNullOrWhiteSpace(row[colName].ToString())) { newrow[0][colName] = Convert.ToInt32(row[colName]); } else if (dataType.Name == "Int16" && row[colName] != null && !string.IsNullOrWhiteSpace(row[colName].ToString())) { newrow[0][colName] = Convert.ToInt16(row[colName]); } else if (dataType.Name == "Double" && row[colName] != null && !string.IsNullOrWhiteSpace(row[colName].ToString())) { newrow[0][colName] = Convert.ToDouble(row[colName]); } else { if (dataType.Name != "Int32" && dataType.Name != "Int16" && dataType.Name != "Double" && dataType.Name != "Decimal") newrow[0][colName] = row[colName]; } } } } else if (msg.Extend.ToString() == "DelDataByOID")//当前仅仅考虑删除对应OID下的更新数据 { string where = string.Format("OBJECTID={0}", msg.Content); DataRow[] newrow = Data.Select(where); if (newrow.Count() == 1) { DataRow row = newrow[0]; Data.Rows.Remove(row); } else { break; } } gridControl1.DataSource = Data; gridControl1.Refresh(); } break; case "ShowDetailView": if (msg.Content is IDockPanel2) { (msg.Content as IDockPanel2).ShowPanel(); } break; case "CloseViewAttrTable": if (msg.Content != null && msg.Extend.ToString() == "CloseViewAttrTableByLayer") { if (msg.Content is string) { ViewAttrTable viewAttr = AttrTableViewLists.FirstOrDefault(x => x.Title.Contains("属性表_" + msg.Content.ToTrim())); if (viewAttr != null) { //viewAttr.ClosePanel(); //viewAttr.ClosePanelInvoke(); } } } break; default: break; } //检测图斑详情页-上下键 if (msg.MsgType == "NextDataDetailView") { NextItemClick(null, null); } else if (msg.MsgType == "PrevDataDetailView") { PreItemClick(null, null); } } private void GridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) { if (e.MenuType == GridMenuType.Column) { IEnumerable cols = e.Menu.Items.Where(f => f.Caption.Contains("分组")); List remoList = new List(); foreach (DevExpress.Utils.Menu.DXMenuItem item in cols) { remoList.Add(item); } foreach (var item in remoList) { e.Menu.Items.Remove(item); } } } #region 视图与属性表数据同步事件 private void AxMapControl_OnSelectionChanged(object sender, EventArgs e) { try { if (_curFeatureLayer == null) return; if (IsRowClick) return; ISelectionSet pSelectionSetes = (_curFeatureLayer as IFeatureSelection).SelectionSet;//获取图层要素已被选择的 if (pSelectionSetes == null) return;//监测是否有要素被选择 IEnumIDs enumIDs = pSelectionSetes.IDs; enumIDs.Reset(); List selectionOIDs = new List(); int oid = -1; if (gridView1.DataSource == null) return; DataTable tempDT = (gridView1.DataSource as DataView).Table as DataTable; gridView1.BeginSelection(); gridView1.ClearSelection(); while ((oid = enumIDs.Next()) >= 0) { DataRow dr = tempDT.Rows.Find(oid); if (dr == null) { dr = tempDT.NewRow(); dr[tempDT.PrimaryKey[0]] = oid; IFeature feature = _curFeatureLayer.FeatureClass.GetFeature(oid); for (int i = 1; i < Data.Columns.Count; i++) { object obj = feature.get_Value((int)Data.Columns[i].ExtendedProperties["index"]); if (obj == null) { continue; } else { if (obj.ToString().Contains("1899/12/30 0:00:00")) { obj = DBNull.Value; } } dr[i] = obj; } tempDT.Rows.Add(dr); Marshal.ReleaseComObject(feature); } int j = tempDT.Rows.IndexOf(dr); int rowHandle = gridView1.GetRowHandle(j); gridView1.SelectRow(rowHandle); if (selectionOIDs.Count == 0) { gridView1.FocusedRowHandle = rowHandle; } selectionOIDs.Add(oid); } gridView1.EndSelection(); oid = -1; barEditItem1.EditValue = Data.Rows.Count == 0 ? 0 : gridView1.FocusedRowHandle + 1; barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + Data.Rows.Count + "已选择)"; } catch (Exception) { return; } } /// /// 获取过滤后数据的全部OID /// private void GetAllFilteredOid() { try { string oidFiled = "OBJECTID"; if (!Data.Columns.Contains("OBJECTID") && Data.Columns.Contains("FID")) { oidFiled = "OBJECTID"; } Filteredids.Clear(); //获取过滤后的所有行数据 IList filtertests = gridView1.DataController.GetAllFilteredAndSortedRows(); if (filtertests.Count == 0) return; foreach (DataRowView item in filtertests) { Filteredids.Add(Convert.ToInt32(item.Row[oidFiled].ToString())); } } catch (Exception ex) { LogAPI.Debug(ex.Message); } } #endregion #region 窗体事件 private bool IsRowClick = false; private void gridView1_RowClick(object sender, RowClickEventArgs e) { try { if (e.Clicks == 2 || _mapService == null) { return; } int oid = -1; IsRowClick = true; //int[] rows = gridView1.GetSelectedRows(); if (gridView1.DataSource is DataView) { oid = (int)(gridView1.DataSource as DataView)[gridView1.GetFocusedDataSourceRowIndex()][KeyIDName]; } if (oid == -1) return; if (_curFeatureLayer == null) return; ISelectionSet pSelectionSetes = (_curFeatureLayer as IFeatureSelection).SelectionSet; if (pSelectionSetes.Count > 0) { pSelectionSetes.RemoveList(GetFeatureSelection(pSelectionSetes).Count, ref GetFeatureSelection(pSelectionSetes).ToArray()[0]); M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent); } if (IsExistFature(oid)) { if (_curFeatureLayer == null) return; _mapService.SelectFeature((_curFeatureLayer.FeatureClass as FeatureClass).BrowseName, oid.ToString()); } barEditItem1.EditValue = gridView1.FocusedRowHandle + 1; barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + Data.Rows.Count + "已选择)"; Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "Positioning", Content = _curFeatureLayer.FeatureClass.GetFeature(oid) }); Marshal.ReleaseComObject(pSelectionSetes); } catch (Exception ex) { LogAPI.Debug("行点击改变绑定值:" + ex.Message); } finally { IsRowClick = false; } } private void gridView1_RowCellClick(object sender, RowCellClickEventArgs e) { if (_Edit == null) return; //当前属性表处于编辑 可修改 if (_Edit.EditState != esriEngineEditState.esriEngineStateNotEditing) { if ((_Edit as EngineEditorClass).IEngineEditLayers_TargetLayer == _curFeatureLayer) this.gridView1.OptionsBehavior.Editable = true; else this.gridView1.OptionsBehavior.Editable = false; } else this.gridView1.OptionsBehavior.Editable = false; } private void gridView1_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (_Edit == null) return; //当前属性表处于编辑 可修改 if (_Edit.EditState != esriEngineEditState.esriEngineStateNotEditing) { if ((_Edit as EngineEditorClass).IEngineEditLayers_TargetLayer == _curFeatureLayer) this.gridView1.OptionsBehavior.Editable = true; else this.gridView1.OptionsBehavior.Editable = false; } else this.gridView1.OptionsBehavior.Editable = false; barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + Data.Rows.Count + "已选择)"; } /// /// 判断指定OID在要素类中是否存在 /// /// 指定的OID /// 是否允许删除行数据 /// private bool IsExistFature(int pOID, bool IsAllowDelRow = true) { bool result = true; try { if (_curFeatureLayer == null) return result; //刷新下当前状态 _curFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName((_curFeatureLayer.FeatureClass as FeatureClass).BrowseName); if (_curFeatureLayer == null) return result; var f = _curFeatureLayer.FeatureClass.GetFeature(pOID); } catch (Exception) { result = false; if (!IsAllowDelRow) return result; if (MessageHelper.ShowYesNoAndTips(string.Format("OID = {0} 的要素不存在,是否从当前列表中移除该记录?", pOID)) == DialogResult.Yes) { int[] rows = gridView1.GetSelectedRows(); for (int i = 0; i < rows.Length; i++) { if (gridView1.DataSource is DataView) { (gridView1.DataSource as DataView)[rows[i]].Delete(); break; } } } } return result; } /// /// 行双击事件 /// /// /// private void gridView1_DoubleClick(object sender, EventArgs e) { } /// /// 关闭GridControl窗体 /// /// /// private void gridControl1_ControlRemoved(object sender, ControlEventArgs e) { //注销选择图层要素时触发的选择改变事件 MapsManager.Instance.MapService.OnSelectionChanged -= AxMapControl_OnSelectionChanged; } /// /// 已选择要素同步到视图数据(独立的) /// private void PSelectedSynchronizeGridView() { ISelectionSet pSelectionSetes = (_curFeatureLayer as IFeatureSelection).SelectionSet;//获取图层要素已被选择的 if (pSelectionSetes == null) return;//监测是否有要素被选择 try { if (pSelectionSetes.Count <= 0) { gridView1.ClearSelection(); return; } IEnumIDs enumIDs = pSelectionSetes.IDs; enumIDs.Reset(); int objectid = 0;//与第一行 while ((objectid = enumIDs.Next()) >= 0) { gridView1.SelectRow(objectids.IndexOf(objectid));//objectid与选择行并不是一一对应的 SelectCount++; } } catch (Exception) { return; } finally { barEditItem3.EditValue = "(" + pSelectionSetes.Count + "/" + Data.Rows.Count + "已选择)"; } } #endregion #region BarManger顶部事件 /// /// 全选(视图上所有数据) /// /// /// private void AllSelectClick(object sender, ItemClickEventArgs e) { try { if (_curFeatureLayer == null) return; //获取高亮对象 ISelectionSet pSelectionSet = (_curFeatureLayer as IFeatureSelection).SelectionSet; //是否存在过滤条件 if (string.IsNullOrEmpty(gridView1.FilterPanelText)) { GetAllObjectid(); gridView1.SelectAll(); barEditItem3.EditValue = "(" + Data.Rows.Count + "/" + Data.Rows.Count + "已选择)"; pSelectionSet.AddList(objectids.Count, ref objectids.ToArray()[0]); } else { GetAllFilteredOid(); gridView1.SelectRows(0, Filteredids.Count - 1); barEditItem3.EditValue = "(" + Filteredids.Count + "/" + Data.Rows.Count + "已选择)"; //获取高亮对象 pSelectionSet.AddList(Filteredids.Count, ref Filteredids.ToArray()[0]); } //视图部分刷新 M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent); Marshal.ReleaseComObject(pSelectionSet); } catch (Exception ex) { LogAPI.Debug("全选操作失败:" + ex.Message); return;//鼠标不在视图数据区点击 } } /// /// 切换选择(反选) /// /// /// private void SwitchSelectClick(object sender, ItemClickEventArgs e) { //切换选择数据,图层要素选择同步切换 List SelectedRowsList = new List();//切换之前已选择的数据 List unSelectedRowsList = new List();//切换之后选择的数据 ISelectionSet pSelectionSet = (_curFeatureLayer as IFeatureSelection).SelectionSet;//获取图层要素已被选择的 if (pSelectionSet == null) return;//监测是否有要素被选择 IEnumIDs enumIDs = pSelectionSet.IDs; enumIDs.Reset(); int objectid = 0; while ((objectid = enumIDs.Next()) >= 0) { SelectedRowsList.Add(objectid); } if (SelectedRowsList == null || SelectedRowsList.Count == 0) { AllSelectClick(sender, e); return; } else if (SelectedRowsList.Count == Data.Rows.Count) { CancelSelectClick(sender, e); return; } if (queryWhere != "1=1") { IQueryFilter queryFilter = new QueryFilterClass(); queryFilter.WhereClause = queryWhere; IFeatureCursor pFeatureCursor = _curFeatureLayer.Search(queryFilter, true); while ((pFeature = pFeatureCursor.NextFeature()) != null) { unSelectedRowsList.Add(Convert.ToInt32(pFeature.get_Value(0))); } Marshal.ReleaseComObject(pFeatureCursor); } else { unSelectedRowsList = objectids.Copy(); } for (int i = 0; i < SelectedRowsList.Count; i++) { unSelectedRowsList.Remove(SelectedRowsList[i]); } M_hookHelper.FocusMap.ClearSelection();//清除图层上要素选择 //视图部分刷新 M_hookHelper.ActiveView.Refresh();//刷新当前视图 try { pSelectionSet.AddList(unSelectedRowsList.Count, ref unSelectedRowsList.ToArray()[0]);//要素选择高亮 for (int i = 0; i < unSelectedRowsList.Count; i++) { gridView1.SelectRow(objectids.IndexOf(unSelectedRowsList[i])); } //视图部分刷新 M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent); //刷新视图数据源 //gridControl1.RefreshDataSource(); //PSelectedSynchronizeGridView(); } catch (Exception ex) { LogAPI.Debug("反选操作失败:" + ex.Message); return;//鼠标不在视图数据区点击 } } /// /// 取消选择 /// /// /// private void CancelSelectClick(object sender, ItemClickEventArgs e) { try { gridView1.ClearSelection(); barEditItem3.EditValue = "(0/" + Data.Rows.Count + "已选择)"; M_hookHelper.FocusMap.ClearSelection();//清除图层上要素选择 M_hookHelper.ActiveView.Refresh();//视图部分刷新 } catch (Exception ex) { LogAPI.Debug("取消选择操作失败:" + ex.Message); } } /// /// 缩放至选中项 /// /// /// private void ZoomSelectedClick(object sender, ItemClickEventArgs e) { try { if (_curFeatureLayer == null) return; IsRowClick = true; M_hookHelper.FocusMap.ClearSelection();//清除图层上要素选择 ISelectionSet pSelectionSet = (_curFeatureLayer as IFeatureSelection).SelectionSet; List vsTemp = new List(); int[] SelectR = gridView1.GetSelectedRows(); int objectid = -1; foreach (var item in SelectR) { int idx = gridView1.ViewRowHandleToDataSourceIndex(item); objectid = Convert.ToInt32(Data.Rows[idx][Data.Columns[0]].ToString()); vsTemp.Add(objectid); } pSelectionSet.AddList(vsTemp.Count, ref vsTemp.ToArray()[0]);//要素选择高亮 if (pSelectionSet.Count == 0) return;//不能为空 IEnumGeometryBind tEnumGeometryBind = new EnumFeatureGeometryClass();//实例化一个要素边界线绑定框 tEnumGeometryBind.BindGeometrySource(null, pSelectionSet);//绑定选中数据源 IEnumGeometry tEnumGeometry = (IEnumGeometry)tEnumGeometryBind;//数据填充过的绑定框 IGeometryFactory tGeometryFactory = new GeometryEnvironmentClass();//几何工厂指向实例化几何要素类 IGeometry tGeometry = tGeometryFactory.CreateGeometryFromEnumerator(tEnumGeometry); //缓冲处理,使处于边界的元素在视图中能够完全显示 ITopologicalOperator mTopologicalOperator = (ITopologicalOperator)tGeometry;//ITopologicaOperator括扑操作员 IGeometry mPolygonBuffer = mTopologicalOperator.Buffer(0.1) as IGeometry;//Buffer缓冲区(点线面),大于0向外做缓冲区,小于0向内做缓冲区 M_hookHelper.ActiveView.Extent = mPolygonBuffer.Envelope;//缓冲区外部边界 //视图部分刷新 M_hookHelper.ActiveView.Refresh(); } catch (Exception ex) { LogAPI.Debug("缩放至选中项操作失败:" + ex.Message); } finally { IsRowClick = false; } } //private ControlsEditingClearCommandClass controlsEditingClearCommandClass = null; /// /// 删除(直接操作图层) /// /// /// private void DeleteSelectedClick(object sender, ItemClickEventArgs e) { //if (controlsEditingClearCommandClass == null) //{ // controlsEditingClearCommandClass = new ControlsEditingClearCommandClass(); // controlsEditingClearCommandClass.OnCreate(MapsManager.Instance.MapService.Hook); //} //controlsEditingClearCommandClass.OnClick(); //通知刷新图斑查看界面 //Platform.Instance.SendMsg(new NotifyMsgPackage() { Content = "RefreshTBBGDetail", MsgType = "RefreshTBBGDetail" }); } #endregion #region Barmanger底部事件 #region 数据行定位 /// /// 定位到第一行 /// /// /// private void firstItemClick(object sender, ItemClickEventArgs e) { if (Data.Rows.Count == 0) return; gridView1.MoveFirst();//移动到第一行 if (_curFeatureLayer == null) return; if (gridView1.DataSource is DataView) { int oid = (int)(gridView1.DataSource as DataView)[gridView1.FocusedRowHandle][KeyIDName]; _mapService.SelectFeature((_curFeatureLayer.FeatureClass as FeatureClass).BrowseName, oid.ToString()); barEditItem1.EditValue = gridView1.FocusedRowHandle + 1; //编辑所在行 } } /// /// 定位到上一行 /// /// /// private void PreItemClick(object sender, ItemClickEventArgs e) { try { if (gridView1.FocusedRowHandle == 0) return; gridView1.MovePrev(); RePre: { if (gridView1.DataSource is DataView) { int oid = (int)(gridView1.DataSource as DataView)[gridView1.FocusedRowHandle][KeyIDName]; if (!IsExistFature(oid, false)) { (gridView1.DataSource as DataView)[gridView1.FocusedRowHandle].Delete(); goto RePre; } if (_curFeatureLayer == null) return; _mapService.SelectFeature((_curFeatureLayer.FeatureClass as FeatureClass).BrowseName, oid.ToString()); barEditItem1.EditValue = gridView1.FocusedRowHandle + 1; //编辑所在行 } } } catch (Exception ex) { LogAPI.Debug(ex.Message); } } /// /// 定位到下一行 /// /// /// private void NextItemClick(object sender, ItemClickEventArgs e) { try { if (gridView1.FocusedRowHandle >= gridView1.RowCount) return; gridView1.MoveNext(); ReNext: { if (gridView1.DataSource is DataView) { int oid = (int)(gridView1.DataSource as DataView)[gridView1.FocusedRowHandle][KeyIDName]; if (!IsExistFature(oid, false)) { (gridView1.DataSource as DataView)[gridView1.FocusedRowHandle].Delete(); goto ReNext; } if (_curFeatureLayer == null) return; _mapService.SelectFeature((_curFeatureLayer.FeatureClass as FeatureClass).BrowseName, oid.ToString()); barEditItem1.EditValue = gridView1.FocusedRowHandle + 1; //编辑所在行 } } } catch (Exception ex) { LogAPI.Debug(ex.Message); } } /// /// 定位到最后一行 /// /// /// private void LastItemClick(object sender, ItemClickEventArgs e) { try { if (Data.Rows.Count == 0) return; gridView1.MoveLast(); if (_curFeatureLayer == null) return; if (gridView1.DataSource is DataView) { int oid = (int)(gridView1.DataSource as DataView)[gridView1.FocusedRowHandle][KeyIDName]; _mapService.SelectFeature((_curFeatureLayer.FeatureClass as FeatureClass).BrowseName, oid.ToString()); barEditItem1.EditValue = gridView1.FocusedRowHandle + 1; //编辑所在行 } } catch (Exception ex) { LogAPI.Debug("定位操作失败:" + ex.Message); return; } } #endregion /// /// 重新加载全部-刷新按钮 /// /// /// private void RefreshingClick(object sender, ItemClickEventArgs e) { try { if (_curFeatureLayer == null) return; //刷新重新获取当前图层对象 _curFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName((_curFeatureLayer.FeatureClass as FeatureClass).BrowseName); if (_curFeatureLayer == null) return; if (_curFeatureLayer.FeatureClass.FeatureCount(null) == 0) { gridControl1.DataSource = null; ConstructColumn(this._curFeatureLayer.FeatureClass.Fields); gridControl1.DataSource = Data.Clone(); gridControl1.RefreshDataSource(); return; } gridView1.Columns.Clear(); gridControl1.DataSource = null; //创建列 ConstructColumn(this._curFeatureLayer.FeatureClass.Fields); gridControl1.DataSource = Data.Clone(); //清除所有选择 //_mapService.ClearFeatureSelection(_hookHelper.Hook as IMapControlDefault); string strLayer = GeoDBAPI.SerialzedPersist(_curFeatureLayer); ThreadLoadData(strLayer); gridControl1.DataSource = Data; UpdateViewState(); if (Data.Rows.Count == 0) barEditItem1.EditValue = 0; else barEditItem1.EditValue = 1; //barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + Data.Rows.Count + "已选择)"; } catch (Exception ex) { MessageHelper.ShowError("加载失败:" + ex.Message); LogAPI.Debug("加载失败原因:" + ex.Message); } finally { barEditItem3.EditValue = "(" + gridView1.GetSelectedRows().Length + "/" + Data.Rows.Count + "已选择)"; } } /// /// 显示所有记录 /// /// /// private void DisplayAllData(object sender, ItemClickEventArgs e) { try { List vsTemp = GetSelectRowsOIDS(); if (vsTemp == null || vsTemp.Count == 0) return; gridControl1.DataSource = Data; gridControl1.RefreshDataSource(); if (Data.Rows.Count != 0) gridView1.UnselectRow(0); foreach (var item in vsTemp) { DataRow dr = Data.Rows.Find(item); int rowHandle = gridView1.GetRowHandle(Data.Rows.IndexOf(dr)); gridView1.SelectRow(rowHandle); } } catch (Exception) { return; } } /// /// 仅显示所选记录 /// /// /// private void barButtonItem11_ItemClick(object sender, ItemClickEventArgs e) { try { List vsTemp = GetSelectRowsOIDS(); if (objectids.Count == 0) GetAllObjectid(); if (vsTemp.Count == 0) { MessageHelper.ShowTips("请勾选所需显示的数据!"); return; } //筛选要剔除的数据 List vs = objectids.Except(vsTemp).ToList(); DataTable DataTemp = Data.Copy(); foreach (int item in vs) { DataRow dataRow = DataTemp.Rows.Find(item); DataTemp.Rows.Remove(dataRow); } gridControl1.DataSource = DataTemp; gridControl1.RefreshDataSource(); gridView1.SelectAll(); M_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, M_hookHelper.ActiveView.Extent); } catch (Exception ex) { LogAPI.Debug(ex.Message); } } /// /// 获取属性表选择行的OIDs /// /// private List GetSelectRowsOIDS() { List vsTemp = new List(); int[] SelectR = gridView1.GetSelectedRows(); int objectid = -1; DataTable tempDT = (gridView1.DataSource as DataView).Table as DataTable; if (tempDT == null) return vsTemp; foreach (var item in SelectR) { int idx = gridView1.ViewRowHandleToDataSourceIndex(item); objectid = Convert.ToInt32(tempDT.Rows[idx][tempDT.Columns[0]].ToString()); vsTemp.Add(objectid); } return vsTemp; } #endregion #region ConmonMethod /// /// 获取属性表全部的OBJECTID /// public void GetAllObjectid() { if (_curFeatureLayer == null) return; objectids = new List(); IQueryFilter queryFilter = new QueryFilterClass(); queryFilter.WhereClause = queryWhere; IFeatureCursor pFeatureCursor = _curFeatureLayer.Search(queryFilter, true); while ((pFeature = pFeatureCursor.NextFeature()) != null) { objectids.Add(Convert.ToInt32(pFeature.get_Value(0))); } //释放指针(游标) Marshal.ReleaseComObject(pFeatureCursor); } /// /// 返回被选择的要素OID /// /// private List GetFeatureSelection(ISelectionSet fSelectionSetes) { List selectionOIDs = new List(); if (fSelectionSetes == null) return null; IEnumIDs enumIDs = fSelectionSetes.IDs; enumIDs.Reset(); int oid = -1; while ((oid = enumIDs.Next()) >= 0) { selectionOIDs.Add(oid); } if (selectionOIDs.Count == 0) return null; return selectionOIDs; } public event EventHandler CloseViewHandler; public event CustomCallbackHandler CustomCallBack; #endregion #region 实现IDockPanel接口 public Guid ID { get; set; } public DockStyle DockAreas { get; set; } public Size FloatSize { get; set; } public int DockWidth { get; set; } public int DockHeight { get; set; } public DockStyle DefaultArea { get; set; } public bool ShowCloseButton { get; set; } public bool ShowAutoHideButton { get; set; } public string Title { get; set; } public bool IsShowInMap { get; set; } #endregion public void ShowPanel() { Platform.Instance.OpenView(this, false); if (MapsManager.Instance.MapService != null) { MapsManager.Instance.MapService.ProjectClosed += MapsService_ProjectClosed; MapsManager.Instance.MapService.OnSelectionChanged += AxMapControl_OnSelectionChanged; } foreach (Bar item in barManager1.Bars) { item.Visible = true; } } private void MapsService_ProjectClosed(object sender, EventArgs e) { ClosePanel(); } public void ClosePanel() { try { Platform.Instance.CloseView(this); } catch (Exception ex) { LogAPI.Debug("关闭属性表面板失败:" + ex); } MapsManager.Instance.MapService.OnSelectionChanged -= AxMapControl_OnSelectionChanged; _Edit.OnChangeFeature -= _Edit_OnChangeFeature; _Edit.OnDeleteFeature -= _Edit_OnDeleteFeature; } public void ClosePanelInvoke() { Platform.Instance.NotifyMsgEven2 -= Instance_NotifyMsgEven2; CloseViewHandler?.Invoke(this, null); } //记录之前选择项 private int SelectedRowIndexByOID = 1; public void InitView(List pViewParam) { try { if (pViewParam == null) return; foreach (var ParamItem in pViewParam) { switch (ParamItem.Type) { case "Combox": { if (ParamItem.Data is IEnumerable) CreateComboxItem(ParamItem.LableInfo, ParamItem.Data as List, ParamItem); break; }; case "CheckCombox": { if (ParamItem.Data is IEnumerable) CreatrCheckComboxItem(ParamItem.LableInfo, ParamItem.Data as List, ParamItem); break; } case "RadioCombox": { if (ParamItem.Data is IFeatureLayer) CreatrRadioComboxItem(ParamItem.LableInfo, ParamItem.Data as List, ParamItem); break; } case "LabCheckBar": { BarCheckItem baritem = new BarCheckItem(); baritem.Caption = ParamItem.LableInfo; baritem.PaintStyle = BarItemPaintStyle.Caption; baritem.CheckedChanged += (s, e) => { if (!(s as BarCheckItem).Checked) return; IndexOID = SelectedRowIndexByOID; if (gridView1.GetSelectedRows().Length >= 0 && _curFeatureLayer != null) { string oidField = _curFeatureLayer.FeatureClass.OIDFieldName; if (gridView1.GetSelectedRows().Count() > 0) { int idx = gridView1.ViewRowHandleToDataSourceIndex(gridView1.GetSelectedRows()[0]); SelectedRowIndexByOID = Convert.ToInt32(Data.Rows[idx][oidField].ToString());//储存 } else { SelectedRowIndexByOID = 1; } } List list = pViewParam.FindAll(f => f.RadioGroupName == ParamItem.RadioGroupName); foreach (var item in list) { if (item.LableInfo == ParamItem.LableInfo) continue; if (item.BarItem is BarCheckItem) { (item.BarItem as BarCheckItem).Checked = false; } } ParamItem.OnCallBack(); }; ParamItem.BarItem = baritem; baritem.Checked = ParamItem.IsChecked; if (ParamItem.IsChecked) { //LoadData(ParamItem.Data, null); } bar1.AddItem(baritem); } break; case "ButtonItem": { BarButtonItem button = new BarButtonItem(); button.ItemClick += (s, e) => { ParamItem.OnCallBack(); }; ParamItem.BarItem = button; button.Caption = ParamItem.LableInfo; bar1.AddItem(button); break; } default: break; } } } catch (Exception ex) { MessageHelper.Show("初始化属性表时发生错误!"); LogAPI.Debug("初始化属性表视图时发生异常,异常信息如下:"); LogAPI.Debug(ex); } } BarItem CreateComboxItem(string pLableText, List pListItem, AttributeViewParameter pParam) { BarEditItem barItem = new BarEditItem(); barItem.Caption = pLableText; try { DevExpress.XtraEditors.Repository.RepositoryItemComboBox comboxEdit = new DevExpress.XtraEditors.Repository.RepositoryItemComboBox(); if (pListItem == null) pListItem = new List(); foreach (var item in pListItem) { comboxEdit.Items.Add(item); } comboxEdit.AutoHeight = true; comboxEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; comboxEdit.DropDownRows = 20; comboxEdit.Tag = pParam; comboxEdit.SelectedValueChanged += (s, a) => { var sender = (s as DevExpress.XtraEditors.ComboBoxEdit); AttributeViewParameter result = barItem.Edit.Tag as AttributeViewParameter; result.Value = barItem.EditValue; CustomCallBack?.Invoke(pParam); }; barItem.EditWidth = 120; barItem.Edit = comboxEdit; barItem.PaintStyle = BarItemPaintStyle.CaptionGlyph; bar1.AddItem(barItem); } catch (Exception ex) { LogAPI.Debug("属性表:创建下拉框控件失败:"); LogAPI.Debug(ex); return barItem; } return barItem; } BarItem CreatrCheckComboxItem(string pLableText, List pListItem, AttributeViewParameter pParam) { BarEditItem barItem = new BarEditItem(); barItem.Caption = pLableText; try { DevExpress.XtraEditors.Repository.RepositoryItemCheckedComboBoxEdit checkComboxEdit = new DevExpress.XtraEditors.Repository.RepositoryItemCheckedComboBoxEdit(); if (pListItem == null) pListItem = new List(); foreach (var item in pListItem) { checkComboxEdit.Items.Add(item); } checkComboxEdit.AutoHeight = true; checkComboxEdit.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; checkComboxEdit.DropDownRows = 20; checkComboxEdit.Tag = pParam; checkComboxEdit.DataSource = (pParam.Data as Dictionary).Values; checkComboxEdit.EditValueChanged += (s, a) =>//筛选数据 { var sender = s as DevExpress.XtraEditors.CheckedComboBoxEdit; AttributeViewParameter result = barItem.Edit.Tag as AttributeViewParameter; result.Value = sender.EditValue;//改变值 queryWhere = "1=1"; if (sender.EditValue.ToString() != "") { string ZLDM_Temp = string.Empty; foreach (string item in sender.EditValue.ToString().Split(',')) { ZLDM_Temp += string.Format("'{0}' ,", item.Split('_')[0].Trim()); } if (!string.IsNullOrEmpty(ZLDM_Temp)) { //if (IsLoadJCTB) // DefinitionQueryWhere += string.Format(" AND (SUBSTRING(ZLDWDM,1,9) in ({0}) AND SFJCTB <>'' ) ", ZLDM_Temp.Trim(',')); //else // DefinitionQueryWhere += string.Format(" AND (SUBSTRING(ZLDWDM,1,9) in ({0}) ) ", ZLDM_Temp.Trim(',')); pParam.Value = ZLDM_Temp.Trim(','); CustomCallBack?.Invoke(pParam); } } CustomCallBack?.Invoke(pParam); //InitUI(); }; barItem.EditWidth = 180; barItem.Edit = checkComboxEdit; barItem.PaintStyle = BarItemPaintStyle.CaptionGlyph; bar1.AddItem(barItem); } catch (Exception ex) { LogAPI.Debug("创建自定义控件失败:" + ex.Message); throw; } return barItem; } BarItem CreatrRadioComboxItem(string pLableText, List pListItem, AttributeViewParameter pParam) { BarEditItem barItem = new BarEditItem(); barItem.Caption = pLableText; try { DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit radioComboxEdit = new DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit(); radioComboxEdit.AutoHeight = true; radioComboxEdit.Tag = pParam; radioComboxEdit.CheckStateChanged += (s, a) => { //var sender = s as DevExpress.XtraEditors.CheckEdit; //if ((pParam.Data as IFeatureLayer).FeatureClass.FindField("SFJCTB") != -1) // IsLoadJCTB = sender.Checked; //else // sender.Checked = false; //if (DefinitionQueryWhere.Contains("AND") && IsLoadJCTB) // DefinitionQueryWhere = string.Format("({0}) AND SFJCTB <>''", DefinitionQueryWhere); //else if (!DefinitionQueryWhere.Contains("AND") && IsLoadJCTB) // DefinitionQueryWhere += " AND SFJCTB <>''"; //if (IsLoadJCTB) // InitUI(); var sender = s as DevExpress.XtraEditors.CheckEdit; if ((pParam.Data as IFeatureLayer).FeatureClass.FindField("SFJCTB") != -1 && sender.Checked) pParam.Value = sender.Checked; else pParam.Value = null; CustomCallBack?.Invoke(pParam); }; barItem.EditWidth = 20; barItem.Edit = radioComboxEdit; barItem.PaintStyle = BarItemPaintStyle.CaptionGlyph; bar1.AddItem(barItem); } catch (Exception ex) { LogAPI.Debug("创建自定义控件失败:" + ex.Message); throw; } return barItem; } public void LoadData(object featureLayer, object pDataFilter) { if (!(featureLayer is IFeatureLayer)) return; _curFeatureLayer = featureLayer as IFeatureLayer; //当前属性表处于编辑 可修改 if (_Edit.EditState != esriEngineEditState.esriEngineStateNotEditing) { if ((_Edit as EngineEditorClass).IEngineEditLayers_TargetLayer == _curFeatureLayer) this.gridView1.OptionsBehavior.Editable = true; else this.gridView1.OptionsBehavior.Editable = false; } else this.gridView1.OptionsBehavior.Editable = false; _mapService = MapsManager.Instance.MapService; //if (queryWhere == null || string.IsNullOrEmpty(queryWhere)) // queryWhere = "1=1"; //if (!string.IsNullOrWhiteSpace(pDataFilter.ToTrim())) // queryWhere += string.Format(" and ({0})", pDataFilter.ToString()); if (this.Title == "地类增量图斑更新") { RefreshingClick(null, null);//暂-主线程加载测试项 } else if (this.Title == "监测图斑") { queryWhere = ""; LoadData(false); } else { LoadData();//线程加载 } IFeatureClass pFeatureClass = _curFeatureLayer.FeatureClass; IDataset dataset = pFeatureClass as IDataset; if (dataset != null && dataset.Name == "DLTBBG" && Platform.Instance.SystemType == SystemTypeEnum.TBBG) { Platform.Instance.SendMsg(new NotifyMsgPackage() { Content = "GetTBBGDetail", MsgType = "GetTBBGDetail" }); } } public void SelectNextRow() { try { NextItemClick(null, null); } catch (Exception ex) { LogAPI.Debug("获取当前行失败:" + ex.Message); } } public void SelectPrevRow() { try { PreItemClick(null, null); } catch (Exception) { //MessageHelper.ShowTips("当前行不存在!"); //gridView1.ClearSelection(); //gridView1.FocusedRowHandle++; //gridView1.SelectRow(gridView1.FocusedRowHandle); } } public ITable AttributeTable => throw new NotImplementedException(); } }