记录错误
在编写地图事件mapControl_OnMouseUp时,实现选中要素功能发生错误:“未将对象IFeatureLayer
引用到实例”
错误代码
private void mapControl_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
{
if (e.button == 1)
{
for (int i = 0; i < mapControl.Map.LayerCount; i++)
{
if (geometry == null)
continue;
spatialFilter.Geometry = geometry;
featureLayer = mapControl.Map.get_Layer(i) as IFeatureLayer;
featureCursorBuffer = featureLayer.Search(spatialFilter, false);
feature = featureCursorBuffer.NextFeature();
}
}
else if (e.button == 2)
{
}
}
错误出现在这里:
featureCursorBuffer = featureLayer.Search(spatialFilter, false);
问题原因
未将对象 featureLayer
引用到实例。
换句话说,featureLayer
是一个null,没有完成实例化。
那么我们现在知道问题出在对featureLayer
实例化的地方,我们向上寻找,可以发现在上一句:
featureLayer = mapControl.Map.get_Layer(i) as IFeatureLayer;
就是实例化部分,通过as
,将mapControl.Map.get_Layer(i)
转换类型。
解决问题
方法1
通过检查mapControl.Map.get_Layer(i)
类型是否可以转换,来限制部分语句发生:
private void mapControl_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
{
if (e.button == 1)
{
for (int i = 0; i < mapControl.Map.LayerCount; i++)
{
if (mapControl.Map.get_Layer(i) is IFeatureLayer)
{
if (geometry == null)
continue;
spatialFilter.Geometry = geometry;
featureLayer = mapControl.Map.get_Layer(i) as IFeatureLayer;
featureCursorBuffer = featureLayer.Search(spatialFilter, false);
feature = featureCursorBuffer.NextFeature();
}
}
}
else if (e.button == 2)
{
}
}
方法2
修改为强制类型转换(不推荐,可能会出现无法转换"System.__ComObject"的 COM 对象报错):
private void mapControl_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
{
if (e.button == 1)
{
for (int i = 0; i < mapControl.Map.LayerCount; i++)
{
if (geometry == null)
continue;
spatialFilter.Geometry = geometry;
featureLayer = (IFeatureLayer)mapControl.Map.get_Layer(i);
featureCursorBuffer = featureLayer.Search(spatialFilter, false);
feature = featureCursorBuffer.NextFeature();
}
}
else if (e.button == 2)
{
}
}