您的位置:首页 > 其它

bingil 组件LayerSelectControl lanix

2012-06-01 21:11 211 查看
目标:定制一个组件,选择不用的Layer,从地图AxMapControl上选择对象,并用DataGridView显示显性。

关键代码:
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)绑定对象即可。

效果图片:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: