添加右键菜单
添加右键菜单的原理很简单,通过TOCControl控件的OnMouseDown事件获取鼠标的点击位置,然后在该位置上显示右键菜单即可
具体操作如下
private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
try
{
if (e.button == 2) // 判断是不是右键点击; 1是左键,2是右键
{
// 存储所点击的要素类型
esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;
// 地图对象
IBasicMap pMap = null;
// 图层对象
ILayer pLayer = null;
object unk = null;
object data = null;
// 以引用的方式传递参数,方便将值带出来
axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pMap, ref pLayer, ref unk, ref data);
// 点击的要素图层;只是为了让读者知道该变量的类型,所以定义为局部变量,本来不应该在这里定义的,建议定义为全局变量,否则的话右键菜单的选项无法使用该图层的有关信息
IFeatureLayer pTocFeatureLayer = pLayer as IFeatureLayer;
// 判断是否是图层要素
if (pItem == esriTOCControlItem.esriTOCControlItemLayer && pTocFeatureLayer != null)
{
// 打开右键菜单,参数为当前鼠标的位置
contextMenuStrip1.Show(Control.MousePosition);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
总结一下这一步的作用:
首先在鼠标右键点击的地方显示出了右键菜单,其次,获取到了所选图层的实例对象,便于在右键菜单中对图层进行查询或者编辑。
打开属性表
打开属性表的思路也很简单,下面详细阐述一下:
1.其实属性表本质上也是一个窗体,所以打开属性表其实就是打开一个新的窗体。所以我们要创建一个新的窗体
- 向窗体中添加一个DataGridView控件
- 初始化窗体(InitUI()函数 )
下面说一下如何代码实现:
public partial class Attribute_Form : Form
{
public Attribute_Form()
{
InitializeComponent();
}
//要查询的属性图层
private IFeatureLayer _curFeatureLayer;
public IFeatureLayer CurFeatureLayer
{
get { return _curFeatureLayer; }
set { _curFeatureLayer = value; }
}
public void InitUI()
{
if (_curFeatureLayer == null) return;
IFeature pFeature = null;
DataTable pFeatDT = new DataTable(); //创建数据表
DataRow pDataRow = null; //数据表行变量
DataColumn pDataCol = null; //数据表列变量
IField pField = null;
for (int i = 0; i < _curFeatureLayer.FeatureClass.Fields.FieldCount; i++)
{
pDataCol = new DataColumn();
pField = _curFeatureLayer.FeatureClass.Fields.get_Field(i);
pDataCol.ColumnName = pField.AliasName; //获取字段名作为列标题
pDataCol.DataType = Type.GetType("System.Object");//定义列字段类型
pFeatDT.Columns.Add(pDataCol); //在数据表中添加字段信息
}
// 获取游标,遍历数据并填充至数据表
IFeatureCursor pFeatureCursor = _curFeatureLayer.Search(null, true);
while ((pFeature = pFeatureCursor.NextFeature()) != null)
{
// 创建新行
pDataRow = pFeatDT.NewRow();
//获取每一行字段属性
for (int k = 0; k < pFeatDT.Columns.Count; k++)
{
pDataRow[k] = pFeature.get_Value(k);
}
pFeatDT.Rows.Add(pDataRow); //在数据表中添加字段属性信息
}
//释放指针
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
//dataGridAttribute.BeginInit();
dataGridView_attr.DataSource = pFeatDT;
//dataGridAttribute.EndInit();
}
}
2.定义好了属性表窗体之后就很简单了,只需要在用户点击“打开属性表”菜单的时候显示该窗体即可(记得将图层对象传递给属性表窗体,否则没法显示)
代码很简单:
private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
{
// frmAttribute是类里面定义的全局变量,也就是属性表窗体
if (frmAttribute == null || frmAttribute.IsDisposed)
{
frmAttribute = new Attribute_Form();
}
// 一定要记得将要素图层赋值给属性表窗体
frmAttribute.CurFeatureLayer = pTocFeatureLayer;
// 初始化窗体
frmAttribute.InitUI();
// 显示窗体
frmAttribute.ShowDialog();
}