这是我设计的主窗体

新建一个窗体,拖入一个datagridview控件,用来展示图层属性,Dock属性设为Fill
在主窗体中设置一个OnMouseDown事件
private void axTOCControl1_OnMouseDown ( object sender, ITOCControlEvents_OnMouseDownEvent e )
{
//鼠标右键
if (e.button == 2)
{
esriTOCControlItem Item = new esriTOCControlItem();
IBasicMap pMap = new MapClass();
ILayer pLayer = new FeatureLayerClass();
object pOther = new object();
object pIndex = new object();
//获取鼠标点击的图层,通过ref参数返回点击位置所关联的图层
this.axTOCControl1.HitTest( e.x, e.y, ref Item, ref pMap, ref pLayer, ref pOther, ref pIndex );
IMapControl2 pMapControl = (IMapControl2)axMapControl1.Object;
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
FrmAttribute pFemAttribute = new FrmAttribute( pMapControl, pFeatureLayer.Name );
pFemAttribute.ShowDialog();
}
}
以下是属性展示窗体的源代码,其中包括了全屏显示属性、datagridview自适应form宽度、在表中点击字段名在主窗体中高亮显示等功能
namespace GIS3._6
{
public partial class FrmAttribute : Form
{
public FrmAttribute ( )
{
InitializeComponent();
}
int width = 0;
public IMapControl2 pMapControl;
public IMap pMap;
public int LayerIndex;
public string LayerName;
public FrmAttribute ( IMapControl2 pMapControl, string LyrName )
{
InitializeComponent();
this.pMapControl = pMapControl;
pMap = pMapControl.Map;
LayerName = LyrName;
}
private void FrmAttribute_Load ( object sender, EventArgs e )
{
GetValues();
#region datagridview自适应form
for (int i = 0 ; i < this.dataGridView1.Columns.Count ; i++)
{
//将每一列都调整为自动适应模式
//this.dataGridView1.AutoResizeColumn( DataGridViewAutoSizeColumnMode.AllCells);
//记录整个DataGridView的宽度
width += this.dataGridView1.Columns[i].Width;
}
if (width > this.dataGridView1.Size.Width)
{
this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
}
else
{
this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
//冻结某列 从左开始 0,1,2
dataGridView1.Columns[1].Frozen = true;
#endregion
}
#region 枚举
public enum DataGridViewAutoSizeColumnMode
{
NotSet = 0,
None = 1,
ColumnHeader = 2,
AllCellsExceptHeader = 4,
AllCells = 6,
DisplayedCellsExceptHeader = 8,
DisplayedCells = 10,
Fill = 16,
}
#endregion
public void GetValues ( )
{
for (int i = 0 ; i < pMap.LayerCount ; i++)
{
if (LayerName == pMap.get_Layer( i ).Name)
{
LayerIndex = i;
break;
}
}
IFeatureLayer pFeatureLayer = pMap.get_Layer( LayerIndex ) as IFeatureLayer;
IFields pFields = pFeatureLayer.FeatureClass.Fields;
dataGridView1.ColumnCount = pFields.FieldCount;
for (int i = 0 ; i < pFields.FieldCount ; i++)
{
string fieldname;
fieldname = pFields.get_Field( i ).Name;
dataGridView1.Columns[i].Name = fieldname;
}
IFeatureCursor pFeatureCursor = pFeatureLayer.FeatureClass.Search( null, false );
IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
//pFields.FieldCount 总字段数
string[] fldvalue = new string[pFields.FieldCount];
for (int i = 0 ; i < pFields.FieldCount ; i++)
{
if (pFields.get_Field( i ).Name == "Shape")
{
fldvalue[i] = Convert.ToString( pFeature.Shape.GeometryType );
}
else
{
fldvalue[i] = Convert.ToString( pFeature.get_Value( i ) );
}
}
dataGridView1.Rows.Add( fldvalue );
pFeature = pFeatureCursor.NextFeature();
}
}
private void dataGridView1_CellContentClick ( object sender, DataGridViewCellEventArgs e )
{
}
#region 双击表内容在屏幕居中展示所选要素
private void dataGridView1_CellDoubleClick ( object sender, DataGridViewCellEventArgs e )
{
string FID;
FID = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
if (FID == "")
return;
IActiveView pActiveView;
pActiveView = (IActiveView)pMap;
pMap.ClearSelection();
pActiveView.Refresh();
IQueryFilter pQueryFilter = new QueryFilterClass();
pQueryFilter.WhereClause = "FID=" + FID;
IFeatureLayer pFeatureLayer;
pFeatureLayer = (IFeatureLayer)pMap.get_Layer( LayerIndex );
IFeatureCursor pFeatureCursor;
pFeatureCursor = pFeatureLayer.Search( pQueryFilter, false );
IFeature pFeature;
pFeature = pFeatureCursor.NextFeature();
pMap.SelectFeature( pFeatureLayer, pFeature );
IPoint pPoint = new PointClass();
pPoint.X = ( pFeature.Extent.XMin + pFeature.Extent.XMax ) / 2;
pPoint.Y = ( pFeature.Extent.YMin + pFeature.Extent.YMax ) / 2;
pMapControl.CenterAt( pPoint );
pActiveView.PartialRefresh( esriViewDrawPhase.esriViewGeoSelection, null, null );
}
#endregion
}
}
以下是运行效果,通过鼠标右键TOC中的图层名直接弹出属性查看窗体
目前正在写一个只显示指定图层的指定属性的功能
转载于:https://www.cnblogs.com/liuliang1999/p/10634507.html