bingil 组件LayerSelectControl lanix
2012-06-01 21:11
211 查看
目标:定制一个组件,选择不用的Layer,从地图AxMapControl上选择对象,并用DataGridView显示显性。
关键代码:
LayerSelectControl.Designer.cs
LayerSelectControl.cs
用法:使用public void setBuddy(AxMapControl axMapControl)绑定对象即可。
效果图片:
关键代码:
LayerSelectControl.Designer.cs
namespace LayerSelect { partial class LayerSelectControl { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.comboBox1 = new System.Windows.Forms.ComboBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.dataGridView1 = new System.Windows.Forms.DataGridView(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); this.SuspendLayout(); // // comboBox1 // this.comboBox1.Dock = System.Windows.Forms.DockStyle.Top; this.comboBox1.FormattingEnabled = true; this.comboBox1.Location = new System.Drawing.Point(0, 0); this.comboBox1.Name = "comboBox1"; this.comboBox1.Size = new System.Drawing.Size(228, 20); this.comboBox1.TabIndex = 0; this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); // // textBox1 // this.textBox1.Dock = System.Windows.Forms.DockStyle.Bottom; this.textBox1.Location = new System.Drawing.Point(0, 200); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(228, 21); this.textBox1.TabIndex = 1; // // dataGridView1 // this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; this.dataGridView1.Location = new System.Drawing.Point(0, 20); this.dataGridView1.Name = "dataGridView1"; this.dataGridView1.RowTemplate.Height = 23; this.dataGridView1.Size = new System.Drawing.Size(228, 180); this.dataGridView1.TabIndex = 2; // // LayerSelectControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.dataGridView1); this.Controls.Add(this.textBox1); this.Controls.Add(this.comboBox1); this.Name = "LayerSelectControl"; this.Size = new System.Drawing.Size(228, 221); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.ComboBox comboBox1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.DataGridView dataGridView1; } }
LayerSelectControl.cs
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Windows.Forms; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.SystemUI; namespace LayerSelect { public partial class LayerSelectControl : UserControl { AxMapControl _axMapControl; IMap pMap; public LayerSelectControl() { InitializeComponent(); } public void setBuddy(AxMapControl axMapControl) { _axMapControl = axMapControl; pMap = _axMapControl.Map; _axMapControl_OnMapReplaced(null, null); _axMapControl.OnMapReplaced += new IMapControlEvents2_Ax_OnMapReplacedEventHandler(_axMapControl_OnMapReplaced); _axMapControl.OnMouseDown += new IMapControlEvents2_Ax_OnMouseDownEventHandler(_axMapControl_OnMouseDown); _axMapControl.OnSelectionChanged += new EventHandler(_axMapControl_OnSelectionChanged); } #region Event of axMapControl void _axMapControl_OnSelectionChanged(object sender, EventArgs e) { this.textBox1.Text = this.comboBox1.Text + " --- " + pMap.SelectionCount.ToString() + "features seleted---"; ILayer pLayer = pMap.Layer[comboBox1.SelectedIndex]; if(pLayer != null) { this.dataGridView1.DataSource = createDataTableWithSeletedData(pLayer, 100); } } void _axMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) { if (e.button == 1) { pMap.ClearSelection(); IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY); IEnvelope pEnvelope = _axMapControl.TrackRectangle(); pMap.SelectByShape(pEnvelope, null, false); _axMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, pEnvelope); } } void _axMapControl_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) { this.comboBox1.Items.Clear(); pMap = _axMapControl.Map; for (int i = 0; i < pMap.LayerCount; i++) { this.comboBox1.Items.Add(pMap.Layer[i].Name); } } #endregion #region Event of comboBox1 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { IFeatureLayer pFeatureLayer; for (int i = 0; i < pMap.LayerCount; i++) { pFeatureLayer = pMap.Layer[i] as IFeatureLayer; if (i == comboBox1.SelectedIndex) { pFeatureLayer.Selectable = true; DataTable pDataTable = createDataTableWithData(pMap.Layer[i],100); dataGridView1.DataSource = pDataTable; } else { pFeatureLayer.Selectable = false; } } } #endregion #region Function of Create DataTabel DataTable createDataTableWithField(ILayer pLayer) { DataTable pDataTable = new DataTable(); ITable pTable = pLayer as ITable; IField pField = null; DataColumn pDataColumn; for (int i = 0; i < pTable.Fields.FieldCount; i++) { pField = pTable.Fields.get_Field(i); pDataColumn = new DataColumn(pField.Name); if (pField.Name == pTable.OIDFieldName) { pDataColumn.Unique = true; } pDataColumn.AllowDBNull = pField.IsNullable; pDataColumn.Caption = pField.AliasName; pDataColumn.DataType = System.Type.GetType(ParseFieldType(pField.Type)); pDataColumn.DefaultValue = pField.DefaultValue; if (pField.VarType == 8) { pDataColumn.MaxLength = pField.Length; } pDataTable.Columns.Add(pDataColumn); pField = null; pDataColumn = null; } return pDataTable; } DataTable createDataTableWithData(ILayer pLayer,int maxNumber) { DataTable pDataTable = createDataTableWithField(pLayer); string shapeType = getShape(pLayer); DataRow pDataRow = null; ITable pTable = pLayer as ITable; ICursor pCursor = pTable.Search(null, false); IRow pRow = pCursor.NextRow(); int n = 0;//the maxinum number of data show on the datagrids while (pRow != null) { pDataRow = pDataTable.NewRow(); for (int i = 0; i < pRow.Fields.FieldCount; i++) { if (pRow.Fields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry) { pDataRow[i] = shapeType; } else if (pRow.Fields.get_Field(i).Type == esriFieldType.esriFieldTypeBlob) { pDataRow[i] = "Element"; } else { pDataRow[i] = pRow.get_Value(i); } } pDataTable.Rows.Add(pDataRow); pDataRow = null; n++; if (n == maxNumber) { pRow = null; } else { pRow = pCursor.NextRow(); } } return pDataTable; } private DataTable createDataTableWithSeletedData(ILayer pLayer, int maxNumber) { DataTable pDataTable = createDataTableWithField(pLayer); string shapeType = getShape(pLayer); ILayer rLayer = getSelectedLayer(pMap, this.comboBox1.SelectedIndex); return createDataTableWithData(rLayer, maxNumber); } #endregion private static string ParseFieldType(esriFieldType fieldType) { switch (fieldType) { case esriFieldType.esriFieldTypeBlob: return "System.String"; case esriFieldType.esriFieldTypeDate: return "System.DateTime"; case esriFieldType.esriFieldTypeDouble: return "System.Double"; case esriFieldType.esriFieldTypeGeometry: return "System.String"; case esriFieldType.esriFieldTypeGlobalID: return "System.String"; case esriFieldType.esriFieldTypeGUID: case esriFieldType.esriFieldTypeInteger: return "System.Int32"; case esriFieldType.esriFieldTypeOID: return "System.String"; case esriFieldType.esriFieldTypeRaster: return "System.String"; case esriFieldType.esriFieldTypeSingle: return "System.Single"; case esriFieldType.esriFieldTypeSmallInteger: return "System.Int32"; case esriFieldType.esriFieldTypeString: return "System.String"; case esriFieldType.esriFieldTypeXML: return "System.String"; default : return "System.String"; } } private string getShape(ILayer pLayer) { IFeatureLayer pFeatLyr = pLayer as IFeatureLayer; switch (pFeatLyr.FeatureClass.ShapeType) { case esriGeometryType.esriGeometryPoint: return "Point"; case esriGeometryType.esriGeometryPolyline: return "Polyline"; case esriGeometryType.esriGeometryPolygon: return "Polygon"; default: return ""; } } private ILayer getSelectedLayer(IMap pMap,int index) { IFeatureLayer pnewfeat; IFeatureLayer pFeatLyr; pFeatLyr = pMap.get_Layer(index) as IFeatureLayer; IFeatureSelection pFeatSel = pMap.FeatureSelection as IFeatureSelection; IFeatureLayerDefinition pFeatLyrDef = pFeatLyr as IFeatureLayerDefinition; pnewfeat = pFeatLyrDef.CreateSelectionLayer("new" + pFeatLyr.Name, true, "", ""); ILayer rLayer = pnewfeat as ILayer; return rLayer; } } }
用法:使用public void setBuddy(AxMapControl axMapControl)绑定对象即可。
效果图片:
相关文章推荐
- Microsoft Communications Control组件解决方法
- Class vs. Component vs. Control 类、组件和控件
- 多页控制组件PageControl
- openlayers control及相关控件
- 有关TransitioningContentControl组件的研究——Silverlight学习笔记[28]
- cocos2d-x 源码分析 : control 源码分析 ( 控制类组件 controlButton)
- 使用msscript.ocx组件的ScriptControl调用VBS脚本
- cocos2d-x 源码分析 : control 源码分析 ( 控制类组件 controlButton)
- 关于Android界面组件重用 A Simple Control Flow Facility For Android Activities --Submitted by Fabrizio Giudici
- C# Tabcontrol组件怎么(切换)显示Form窗体
- OpenLayers.Control.SelectFeature
- C# Tabcontrol组件怎么(切换)显示Form窗体
- Creating a Pager Control for ASP.NET以及Dino Esposito 分页组件的一个 Bug
- ios分页组件-MDPageControl
- BackgroundWorker .net 2.0 里微软的多线程组件 学习 Cross-thread operation not valid: Control 'RichTextBox1' accessed from a thread other than the thread it was created on.
- C# Tabcontrol组件怎么(切换)显示Form窗体
- C# tabcontrol组件(无标签页)
- qml中Control组件以及Style组件解析
- 【Cocos2dx】使用CCControlButton创建按钮、按钮点击事件,点击事件中的组件获取,setPosition的坐标问题
- WIP - 离散任务点击组件-错误:LOCATOR.CONTROL 的变元无效:ORG_LOCATOR_CONTROL=''