要求:
编写程序,显示Map坐标、工具条命令提示信息,并移除图层。
1、在状态栏显示Map中鼠标当前位置的坐标信息(MapControl的OnMouseMove)。
2、在状态栏显示工具条命令的提示信息(ToolbarControl的OnMouseMove、HitTest)。
3、在TOCControl的图层上按鼠标右键,移除该图层(TOCControl的OnMouseDown、HitTest)
作答:
1.在状态栏显示Map中鼠标当前位置的坐标信息
private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
//Map中X坐标e.mapX,Y坐标e.mapY,坐标单位 axMapControl1.MapUnits
toolStripStatusLabel4.Text = "当前坐标 X =" + Math.Round(e.mapX, 2).ToString() + ",Y ="
+ Math.Round(e.mapY, 2).ToString() +" "
+ this.axMapControl1.MapUnits.ToString().Substring(4);
//显示当前比例尺
//toolStripStatusLabel3.Text = "比例尺 1:" + ((long)this.axMapControl1.MapScale).ToString();
/* C#保留两位小数,四舍五入
1. Math.Round(str,2)
2. str.ToString("#0.00")
*/
/* C#去掉字符串的前i个字符
1. str.Remove(0,i)
2. str.SubString(i)
*/
}
2.在状态栏显示工具条命令的提示信息
private void axToolbarControl1_OnMouseMove(object sender, IToolbarControlEvents_OnMouseMoveEvent e)
{
//获得鼠标所在工具的索引号 初始索引为-1
int index = axToolbarControl1.HitTest(e.x,e.y,false)
if (index != -1)
{
//取得鼠标所在工具的ToolbarItem
IToolbarItem toolbarItem = axToolbarControl1.GetItem(index);
//设置状态栏信息
toolStripStatusLabel1.Text = toolbarItem.Command.Message;
}
else
{
toolStripStatusLabel1.Text = "就绪";
}
}
3.在TOCControl的图层上按鼠标右键,移除该图层
①右键菜单的实现(控件是contextMenuStrip1,事件是axTOCControl1_OnMouseUp)
public ILayer pLayer; //☆**定义一个全局变量pLayer 选中的图层
private void axTOCControl1_OnMouseUp(object sender, ITOCControlEvents_OnMouseUpEvent e)
{
//实例化函数中的五个参数
esriTOCControlItem Item = esriTOCControlItem.esriTOCControlItemNone;
IBasicMap map = null; //Map object,if selected
ILayer layer = null; //Layer object,if selected
object group = null; //Group Layer,if selected
object groupIndex = null; //Layer index,if group Layer selected
//根据鼠标所在的位置测试判断其所指向的对象
//HitTest()函数
axTOCControl1.HitTest(e.x,e.y,ref Item,ref map,ref layer,ref group,ref groupIndex);
if (e.button == 2 && Item == esriTOCControlItem.esriTOCControlItemLayer) //点击对象是图层的话,就显示右键菜单 e.button=2代表鼠标右击,=1是单击左键
{
pLayer = layer;
//显示右键菜单,并定义其相对控件的位置
contextMenuStrip1.Show(axTOCControl1,e.x,e.y);
}
}
②移除图层功能的实现
private void 移除ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (pLayer != null) //选中图层
{
axMapControl1.Map.DeleteLayer(pLayer); //调用DeleteLayer方法删除图层
pLayer = null;
}
}
③程序响应图层移除事件(*)
private IActiveViewEvents_Event ave;
private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
ave = axMapControl1.Map as IActiveViewEvents_Event;
ave.ItemDeleted += new IActiveViewEvents_ItemDeletedEventHandler(ave_ItemDeleted);
}
void ave_ItemDeleted(object Item)
{
if (Item is ILayer)
{
ILayer pLayer = Item as ILayer;
MessageBox.Show("图层"+pLayer.Name+"已被移除!");
}
}
4.右键打开属性表(主要在于父子窗体间"传值")
在项目中新建一个窗体(AttributeTable.cs)
右键项目名称 → 添加 → 新建项 → 选择Windows窗体,并给窗体命名 → 添加
AttributeTable窗体内添加dataGridView控件,Dock属性设置为Fill
☆法1(推荐):
Form1.cs:
private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
{
AttributeTable pAttributeTable = new AttributeTable(pLayer); //**
pAttributeTable.Show();
pAttributeTable.Text = "属性表:" + pLayer.Name;
}
AttributeTable.cs:
public partial class AttributeTable : Form
{
ILayer mLayer; //**
public AttributeTable(ILayer pLayer) //**
{
InitializeComponent();
mLayer = pLayer; //**
}
}
private void AttributeTable_Load(object sender, EventArgs e)
{
OpenAttributeTable(); //自定义方法
}
public void OpenAttributeTable()
{
IFeatureLayer pFeatureLayer = mLayer as IFeatureLayer; //**
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; //** using ESRI.ArcGIS.Geodatabase;
DataTable dt = new DataTable();
if (pFeatureClass != null)
{
DataColumn dc;
for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
{
dc = new DataColumn(pFeatureClass.Fields.get_Field(i).Name);
dt.Columns.Add(dc);//获取所有列的属性值
}
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
DataRow dr;
while (pFeature != null)
{
dr = dt.NewRow();
for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
{
//判断feature的形状
if (pFeature.Fields.get_Field(j).Name == "Shape")
{
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
{
dr[j] = "点";
}
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
{
dr[j] = "线";
}
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
{
dr[j] = "面";
}
}
else
{
dr[j] = pFeature.get_Value(j).ToString();//增加行
}
}
dt.Rows.Add(dr);
pFeature = pFeatureCursor.NextFeature();
}
}
this.dataGridView1.DataSource = dt;
}
法2:
Form1.cs:
private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
{
AttributeTable pAttributeTable = new AttributeTable();
pAttributeTable.Show(this); //*
pAttributeTable.Text = "属性表:" + pLayer.Name;
}
AttributeTable.cs:
private void AttributeTable_Load(object sender, EventArgs e)
{
OpenAttributeTable(); //自定义方法
}
public void OpenAttributeTable()
{
Form1 pForm1 = (Form1)this.Owner; //*
ILayer mLayer = pForm1.pLayer; //*
IFeatureLayer pFeatureLayer = mLayer as IFeatureLayer; //*
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; //* using ESRI.ArcGIS.Geodatabase;
DataTable dt = new DataTable();
if (pFeatureClass != null)
{
DataColumn dc;
for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
{
dc = new DataColumn(pFeatureClass.Fields.get_Field(i).Name);
dt.Columns.Add(dc);//获取所有列的属性值
}
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
DataRow dr;
while (pFeature != null)
{
dr = dt.NewRow();
for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
{
//判断feature的形状
if (pFeature.Fields.get_Field(j).Name == "Shape")
{
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
{
dr[j] = "点";
}
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
{
dr[j] = "线";
}
if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
{
dr[j] = "面";
}
}
else
{
dr[j] = pFeature.get_Value(j).ToString();//增加行
}
}
dt.Rows.Add(dr);
pFeature = pFeatureCursor.NextFeature();
}
}
this.dataGridView1.DataSource = dt;
}