年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1945 lines
82 KiB

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类全局变量
/// <summary>
/// 视图选中数量(取消了默认焦点行,该值为零)
/// </summary>
int SelectCount = 0;
/// <summary>
/// 要查询的属性图层
/// </summary>
private IFeatureLayer _curFeatureLayer;
public IFeatureLayer CurFeatureLayer
{
get { return _curFeatureLayer; }
set { _curFeatureLayer = value; }
}
/// <summary>
/// 当前图层
/// </summary>
private IFeatureClass SourceFeature
{
get;
set;
}
/// <summary>
/// 要查询的属性图层
/// </summary>
private IHookHelper _hookHelper;
public IHookHelper M_hookHelper
{
get { return _hookHelper; }
set { _hookHelper = value; }
}
public static bool selectbox = false;//选择
/// <summary>
/// GridView视图表
/// </summary>
DataTable Data = new DataTable();
/// <summary>
/// 视图数据
/// </summary>
IFeature pFeature = null;
/// <summary>
/// 编辑状态
/// </summary>
public bool isEngineEditing = true;
EngineEditor engineEditor = new EngineEditor();
/// <summary>
/// 属性表全部的objectid
/// </summary>
List<int> objectids = new List<int>();
/// <summary>
/// 属性表过滤后全部的OIDs
/// </summary>
List<int> Filteredids = new List<int>();
/// <summary>
/// 初始化mapService工具
/// </summary>
IMapService _mapService = null;
private int IndexOID = 1;
private EngineEditor _Edit = null;
public List<ViewAttrTable> AttrTableViewLists = new List<ViewAttrTable>();
#endregion
public ViewAttrTable(object m_hookHelper, List<AttributeViewParameter> 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<int, string> dic_Name = new Dictionary<int, string>();
Dictionary<int, string> dic_AliasName = new Dictionary<int, string>();
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;
}
}
/// <summary>
/// 创建xml工程文件
/// </summary>
/// <param name="xmlPath"></param>
/// <param name="projectStruct"></param>
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;
/// <summary>
/// 查询条件
/// </summary>
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<int, string> 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<int, string> 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<int, string> GetFieldIndex_NameDict()
{
Dictionary<int, string> fieldIndex_NameDic = new Dictionary<int, string>();
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;
}
}
/// <summary>
/// 图层主键字段名称
/// </summary>
private string KeyIDName = "OBJECTID";
private bool IsLoadData = false;
/// <summary>
/// 数据加载
/// </summary>
/// <param name="IsLaodDefintion">是否默认预查询加载</param>
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<int> selectionOIDs = new List<int>();
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<DevExpress.Utils.Menu.DXMenuItem> cols = e.Menu.Items.Where(f => f.Caption.Contains("分组"));
List<DevExpress.Utils.Menu.DXMenuItem> remoList = new List<DevExpress.Utils.Menu.DXMenuItem>();
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<int> selectionOIDs = new List<int>();
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;
}
}
/// <summary>
/// 获取过滤后数据的全部OID
/// </summary>
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 + "已选择)";
}
/// <summary>
/// 判断指定OID在要素类中是否存在
/// </summary>
/// <param name="pOID">指定的OID</param>
/// <param name="IsAllowDelRow">是否允许删除行数据</param>
/// <returns></returns>
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;
}
/// <summary>
/// 行双击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void gridView1_DoubleClick(object sender, EventArgs e)
{
}
/// <summary>
/// 关闭GridControl窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void gridControl1_ControlRemoved(object sender, ControlEventArgs e)
{
//注销选择图层要素时触发的选择改变事件
MapsManager.Instance.MapService.OnSelectionChanged -= AxMapControl_OnSelectionChanged;
}
/// <summary>
/// 已选择要素同步到视图数据(独立的)
/// </summary>
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顶部事件
/// <summary>
/// 全选(视图上所有数据)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;//鼠标不在视图数据区点击
}
}
/// <summary>
/// 切换选择(反选)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SwitchSelectClick(object sender, ItemClickEventArgs e)
{
//切换选择数据,图层要素选择同步切换
List<int> SelectedRowsList = new List<int>();//切换之前已选择的数据
List<int> unSelectedRowsList = new List<int>();//切换之后选择的数据
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;//鼠标不在视图数据区点击
}
}
/// <summary>
/// 取消选择
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 缩放至选中项
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<int> vsTemp = new List<int>();
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;
/// <summary>
/// 删除(直接操作图层)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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 数据行定位
/// <summary>
/// 定位到第一行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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; //编辑所在行
}
}
/// <summary>
/// 定位到上一行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 定位到下一行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 定位到最后一行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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
/// <summary>
/// 重新加载全部-刷新按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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 + "已选择)";
}
}
/// <summary>
/// 显示所有记录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DisplayAllData(object sender, ItemClickEventArgs e)
{
try
{
List<int> 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;
}
}
/// <summary>
/// 仅显示所选记录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void barButtonItem11_ItemClick(object sender, ItemClickEventArgs e)
{
try
{
List<int> vsTemp = GetSelectRowsOIDS();
if (objectids.Count == 0) GetAllObjectid();
if (vsTemp.Count == 0)
{
MessageHelper.ShowTips("请勾选所需显示的数据!");
return;
}
//筛选要剔除的数据
List<int> 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);
}
}
/// <summary>
/// 获取属性表选择行的OIDs
/// </summary>
/// <returns></returns>
private List<int> GetSelectRowsOIDS()
{
List<int> vsTemp = new List<int>();
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
/// <summary>
/// 获取属性表全部的OBJECTID
/// </summary>
public void GetAllObjectid()
{
if (_curFeatureLayer == null) return;
objectids = new List<int>();
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);
}
/// <summary>
/// 返回被选择的要素OID
/// </summary>
/// <returns></returns>
private List<int> GetFeatureSelection(ISelectionSet fSelectionSetes)
{
List<int> selectionOIDs = new List<int>();
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<AttributeViewParameter> 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<object>, ParamItem);
break;
};
case "CheckCombox":
{
if (ParamItem.Data is IEnumerable)
CreatrCheckComboxItem(ParamItem.LableInfo, ParamItem.Data as List<object>, ParamItem);
break;
}
case "RadioCombox":
{
if (ParamItem.Data is IFeatureLayer)
CreatrRadioComboxItem(ParamItem.LableInfo, ParamItem.Data as List<object>, 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<AttributeViewParameter> 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<object> 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<object>();
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<object> 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<object>();
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<string, string>).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<object> 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();
}
}