C#AE练习 (2)状态栏显示提示信息,右击菜单实现:移除图层、打开属性表

要求:

编写程序,显示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;
}
  • 12
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值