上面写了空间查询的小结,属性查询也少不了,已比较复杂的属性查询为示例总结下。
涉及的思路根据选择矢量数据的比例尺,列出一定比例尺下数据集中的图层列表(图层名、图层别名)--->根据选择的图层,列出该图层的字段列表(考虑到查询语句的通用性,只筛选出string类型的字段名和字段别名)--->输入关键字,进行查询---->列出满足条件的记录结果。
(1)选择数据集图层
public List<string> GetLayerByDatasetName (AxMapControl axMapControl,string datasetName)
{
IActiveView pActiveView = null;
ILayer pLayer = null;
IFeatureLayer pFeatureLayer = null;
IFeatureClass pFeatureClass = null;
ICompositeLayer pCompositeLayer = null;
List<string> lstLayer = null;
try
{
lstLayer = new List<string>();
pActiveView = axMapControl.ActiveView;
int LayerCount = pActiveView.FocusMap.LayerCount;
for (int i = 0; i < LayerCount; i++)
{
pLayer = pActiveView.FocusMap.get_Layer(i);
if (pLayer is IGroupLayer)
{
if (pLayer.Name == datasetName)
{
pCompositeLayer = pLayer as ICompositeLayer;
for (int j = 0; j < pCompositeLayer.Count; j++)
{
if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
{
pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
pFeatureClass = pFeatureLayer.FeatureClass;
if (pFeatureLayer.Visible)//&& !pFeatureLayer.Name.Contains("DLG")
lstLayer.Add(pFeatureClass.AliasName);
}
}
}
}
}
}
catch (System.Exception ex)
{
lstLayer = new List<string>();
lstLayer.Add("err:" + ex.Message);
}
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return lstLayer;
}
(2)根据图层别名,先获取IFeatureLayer然后列出字段
public IFeatureLayer GetFeatureLayerByName (AxMapControl axMapControl,string layerAliasName)
{
IActiveView pActiveView = null;
ILayer pLayer=null;
ICompositeLayer pCompositeLayer = null;
IFeatureLayer pFeatureLayer=null;
IFeatureClass pFeatureClass = null;
IFeatureLayer pFeatureLayer_Return = null;
try
{
pActiveView=axMapControl.ActiveView;
int LayerCount = pActiveView.FocusMap.LayerCount;
for (int i = 0; i < LayerCount; i++)
{
pLayer = pActiveView.FocusMap.get_Layer(i);
if (pLayer is IGroupLayer)
{
pCompositeLayer = pLayer as ICompositeLayer;
for (int j = 0; j < pCompositeLayer.Count; j++)
{
if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
{
pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
pFeatureClass = pFeatureLayer.FeatureClass;
if (pFeatureClass.AliasName == layerAliasName)
{
pFeatureLayer_Return = pFeatureLayer;
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return pFeatureLayer_Return;
}
}
}
}
else if (pLayer is IFeatureLayer)
{
pFeatureClass = (pLayer as IFeatureLayer).FeatureClass;
if (pFeatureClass.AliasName == layerAliasName)
{
pFeatureLayer_Return= pLayer as IFeatureLayer;
break;
}
}
}
return pFeatureLayer_Return;
}
catch (System.Exception ex)
{
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return null;
}
}
public List<ClsComboxItem> QueryFields (IFeatureLayer pFeatureLayer)
{
IFeatureClass pFeatureClass = null;
IFields pFields = null;
IField pField = null;
List<ClsComboxItem> lstFields = null;
ClsComboxItem comboxItem = null;
try
{
lstFields = new List<ClsComboxItem>();
pFeatureClass = pFeatureLayer.FeatureClass;
pFields = pFeatureClass.Fields;
for (int i = 0; i < pFields.FieldCount; i++)
{
pField = pFields.get_Field(i);
if(pField.Type==esriFieldType.esriFieldTypeString)
{
comboxItem = new ClsComboxItem(pField.AliasName, pField.Name);
lstFields.Add(comboxItem);
}
}
}
catch (System.Exception ex)
{
lstFields = new List<ClsComboxItem>();
comboxItem = new ClsComboxItem("err:" + ex.Message, "");
lstFields.Add(comboxItem);
}
if (pField != null)
Marshal.ReleaseComObject(pField);
if (pFields != null)
Marshal.ReleaseComObject(pFields);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
return lstFields;
}
特别要提到的是 ,如何实现将图层名、图层别名,字段名、字段别名,显示别名但与名称相联动呢?自定义了一个类,同时与ComboBox的DisplayMember以及ValueMember结合使用。
自定义的类,类名: ClsComboxItem
class ClsComboxItem
{
private string strDisplay;
private string strValue;
public ClsComboxItem(string m_display,string m_value)
{
strDisplay = m_display;
strValue = m_value;
}
public string Display
{
get{ return strDisplay;}
}
public string Value
{
get { return strValue; }
}
}
补充二: 由字段列出数据表中唯一值。
public List<string> GetAllValues(IFeatureLayer pFeatureLayer,string fieldName)
{
List<string> lstUniqueValue = new List<string>();
IFeatureClass pFeatureClass = null;
IFeatureCursor pFeatureCursor = null;
IDataStatistics pDataStatistics = null;
IEnumerator pEnumerator = null;
try
{
pFeatureClass = pFeatureLayer.FeatureClass;
pFeatureCursor = pFeatureClass.Search(null, false);
pDataStatistics = new DataStatisticsClass();
pDataStatistics.Field = fieldName;
pDataStatistics.Cursor = pFeatureCursor as ICursor;
pEnumerator = pDataStatistics.UniqueValues;
pEnumerator.Reset();
pEnumerator.MoveNext();
for (int i = 0; i < pDataStatistics.UniqueValueCount;i++ )
{
lstUniqueValue.Add(pEnumerator.Current.ToString());
pEnumerator.MoveNext();
}
if (pEnumerator != null)
Marshal.ReleaseComObject(pEnumerator);
if (pDataStatistics != null)
Marshal.ReleaseComObject(pDataStatistics);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
return lstUniqueValue;
}
catch (System.Exception ex)
{
if (pEnumerator != null)
Marshal.ReleaseComObject(pEnumerator);
if (pDataStatistics != null)
Marshal.ReleaseComObject(pDataStatistics);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
return null;
}
}
(3)输入关键字查询
if (this.txtKey.Text == "")
strKey = "OBJECTID>0";
else
strKey = strFieldName+" LIKE '%" + txtKey.Text + "%'";
this.lstResult.Items.Clear();
pFC=ClsTFManage.OpenFCbyName(axMapControl, strLayerName);
lstMatchedResult = layerInfo.GetMatchedValues(pFC, strKey, strFieldName);
if (lstMatchedResult!=null && lstMatchedResult.Count>0)
{
for (int i = 0; i < lstMatchedResult.Count;i++ )
{
lstResult.Items.Add(lstMatchedResult[i][0]);
lstResult.Items[i].SubItems.Add(lstMatchedResult[i][1]);
lstResult.Items[i].Checked = true;
}
}else
{
MessageBox.Show("没有匹配的记录,请重新输入关键字.", "提示");
this.txtKey.Text = "";
txtKey.Select();
}
根据图层别名获取IFeatureClass:
public static IFeatureClass OpenFCbyName(AxMapControl axMapControl, string layerName)
{
IActiveView pActiveView = null;
ILayer pLayer = null;
ICompositeLayer pCompositeLayer = null;
IFeatureLayer pFeatureLayer = null;
IFeatureClass pFeatureClass = null;
try
{
pActiveView = axMapControl.ActiveView;
int LayerCount = pActiveView.FocusMap.LayerCount;
for (int i = 0; i < LayerCount; i++)
{
pLayer = pActiveView.FocusMap.get_Layer(i);
if (pLayer is IGroupLayer)
{
pCompositeLayer = pLayer as ICompositeLayer;
for (int j = 0; j < pCompositeLayer.Count; j++)
{
if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
{
pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
if (pFeatureLayer.Name == layerName)
{
pFeatureClass = pFeatureLayer.FeatureClass;
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return pFeatureClass;
}
}
}
}
else if (pLayer is IFeatureLayer)
{
if (pLayer.Name == layerName)
{
pFeatureClass = (pLayer as IFeatureLayer).FeatureClass;
break;
}
}
}
return pFeatureClass;
}
catch (System.Exception ex)
{
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return null;
}
}
模糊查询结果:
public List<string[]> GetMatchedValues(IFeatureClass pFeatureClass, string strQuery,string strFieldName)
{
List<string[]> lstValue = null;
string[] temp = null;
IQueryFilter pQueryFilter = null;
IFeatureCursor pFeatureCursor = null;
IFeature pFeature = null;
try
{
pQueryFilter = new QueryFilterClass();
pQueryFilter.WhereClause = strQuery;
pFeatureCursor = pFeatureClass.Search(pQueryFilter, false);
pFeature = pFeatureCursor.NextFeature();
lstValue = new List<string[]>();
while (pFeature != null)
{
temp = new string[2];
temp[0] = pFeature.get_Value(pFeature.Fields.FindField("OBJECTID")).ToString();
temp[1]=pFeature.get_Value(pFeature.Fields.FindField(strFieldName)).ToString();
lstValue.Add(temp);
pFeature = pFeatureCursor.NextFeature();
}
if (pFeature != null)
Marshal.ReleaseComObject(pFeature);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pQueryFilter != null)
Marshal.ReleaseComObject(pQueryFilter);
return lstValue;
}
catch (System.Exception ex)
{
if (pFeature != null)
Marshal.ReleaseComObject(pFeature);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pQueryFilter != null)
Marshal.ReleaseComObject(pQueryFilter);
return null;
}
}
(4)查询结果单击高亮定位
补充一下:
查询中用到IFeatureCursor,要及时释放,因为其设定了最大限定数。
Marshal.ReleaseComObject(pFeatureCursor);
(1)选择数据集图层
public List<string> GetLayerByDatasetName (AxMapControl axMapControl,string datasetName)
{
IActiveView pActiveView = null;
ILayer pLayer = null;
IFeatureLayer pFeatureLayer = null;
IFeatureClass pFeatureClass = null;
ICompositeLayer pCompositeLayer = null;
List<string> lstLayer = null;
try
{
lstLayer = new List<string>();
pActiveView = axMapControl.ActiveView;
int LayerCount = pActiveView.FocusMap.LayerCount;
for (int i = 0; i < LayerCount; i++)
{
pLayer = pActiveView.FocusMap.get_Layer(i);
if (pLayer is IGroupLayer)
{
if (pLayer.Name == datasetName)
{
pCompositeLayer = pLayer as ICompositeLayer;
for (int j = 0; j < pCompositeLayer.Count; j++)
{
if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
{
pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
pFeatureClass = pFeatureLayer.FeatureClass;
if (pFeatureLayer.Visible)//&& !pFeatureLayer.Name.Contains("DLG")
lstLayer.Add(pFeatureClass.AliasName);
}
}
}
}
}
}
catch (System.Exception ex)
{
lstLayer = new List<string>();
lstLayer.Add("err:" + ex.Message);
}
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return lstLayer;
}
(2)根据图层别名,先获取IFeatureLayer然后列出字段
public IFeatureLayer GetFeatureLayerByName (AxMapControl axMapControl,string layerAliasName)
{
IActiveView pActiveView = null;
ILayer pLayer=null;
ICompositeLayer pCompositeLayer = null;
IFeatureLayer pFeatureLayer=null;
IFeatureClass pFeatureClass = null;
IFeatureLayer pFeatureLayer_Return = null;
try
{
pActiveView=axMapControl.ActiveView;
int LayerCount = pActiveView.FocusMap.LayerCount;
for (int i = 0; i < LayerCount; i++)
{
pLayer = pActiveView.FocusMap.get_Layer(i);
if (pLayer is IGroupLayer)
{
pCompositeLayer = pLayer as ICompositeLayer;
for (int j = 0; j < pCompositeLayer.Count; j++)
{
if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
{
pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
pFeatureClass = pFeatureLayer.FeatureClass;
if (pFeatureClass.AliasName == layerAliasName)
{
pFeatureLayer_Return = pFeatureLayer;
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return pFeatureLayer_Return;
}
}
}
}
else if (pLayer is IFeatureLayer)
{
pFeatureClass = (pLayer as IFeatureLayer).FeatureClass;
if (pFeatureClass.AliasName == layerAliasName)
{
pFeatureLayer_Return= pLayer as IFeatureLayer;
break;
}
}
}
return pFeatureLayer_Return;
}
catch (System.Exception ex)
{
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return null;
}
}
public List<ClsComboxItem> QueryFields (IFeatureLayer pFeatureLayer)
{
IFeatureClass pFeatureClass = null;
IFields pFields = null;
IField pField = null;
List<ClsComboxItem> lstFields = null;
ClsComboxItem comboxItem = null;
try
{
lstFields = new List<ClsComboxItem>();
pFeatureClass = pFeatureLayer.FeatureClass;
pFields = pFeatureClass.Fields;
for (int i = 0; i < pFields.FieldCount; i++)
{
pField = pFields.get_Field(i);
if(pField.Type==esriFieldType.esriFieldTypeString)
{
comboxItem = new ClsComboxItem(pField.AliasName, pField.Name);
lstFields.Add(comboxItem);
}
}
}
catch (System.Exception ex)
{
lstFields = new List<ClsComboxItem>();
comboxItem = new ClsComboxItem("err:" + ex.Message, "");
lstFields.Add(comboxItem);
}
if (pField != null)
Marshal.ReleaseComObject(pField);
if (pFields != null)
Marshal.ReleaseComObject(pFields);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
return lstFields;
}
特别要提到的是 ,如何实现将图层名、图层别名,字段名、字段别名,显示别名但与名称相联动呢?自定义了一个类,同时与ComboBox的DisplayMember以及ValueMember结合使用。
自定义的类,类名: ClsComboxItem
class ClsComboxItem
{
private string strDisplay;
private string strValue;
public ClsComboxItem(string m_display,string m_value)
{
strDisplay = m_display;
strValue = m_value;
}
public string Display
{
get{ return strDisplay;}
}
public string Value
{
get { return strValue; }
}
}
补充二: 由字段列出数据表中唯一值。
public List<string> GetAllValues(IFeatureLayer pFeatureLayer,string fieldName)
{
List<string> lstUniqueValue = new List<string>();
IFeatureClass pFeatureClass = null;
IFeatureCursor pFeatureCursor = null;
IDataStatistics pDataStatistics = null;
IEnumerator pEnumerator = null;
try
{
pFeatureClass = pFeatureLayer.FeatureClass;
pFeatureCursor = pFeatureClass.Search(null, false);
pDataStatistics = new DataStatisticsClass();
pDataStatistics.Field = fieldName;
pDataStatistics.Cursor = pFeatureCursor as ICursor;
pEnumerator = pDataStatistics.UniqueValues;
pEnumerator.Reset();
pEnumerator.MoveNext();
for (int i = 0; i < pDataStatistics.UniqueValueCount;i++ )
{
lstUniqueValue.Add(pEnumerator.Current.ToString());
pEnumerator.MoveNext();
}
if (pEnumerator != null)
Marshal.ReleaseComObject(pEnumerator);
if (pDataStatistics != null)
Marshal.ReleaseComObject(pDataStatistics);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
return lstUniqueValue;
}
catch (System.Exception ex)
{
if (pEnumerator != null)
Marshal.ReleaseComObject(pEnumerator);
if (pDataStatistics != null)
Marshal.ReleaseComObject(pDataStatistics);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pFeatureClass != null)
Marshal.ReleaseComObject(pFeatureClass);
return null;
}
}
(3)输入关键字查询
if (this.txtKey.Text == "")
strKey = "OBJECTID>0";
else
strKey = strFieldName+" LIKE '%" + txtKey.Text + "%'";
this.lstResult.Items.Clear();
pFC=ClsTFManage.OpenFCbyName(axMapControl, strLayerName);
lstMatchedResult = layerInfo.GetMatchedValues(pFC, strKey, strFieldName);
if (lstMatchedResult!=null && lstMatchedResult.Count>0)
{
for (int i = 0; i < lstMatchedResult.Count;i++ )
{
lstResult.Items.Add(lstMatchedResult[i][0]);
lstResult.Items[i].SubItems.Add(lstMatchedResult[i][1]);
lstResult.Items[i].Checked = true;
}
}else
{
MessageBox.Show("没有匹配的记录,请重新输入关键字.", "提示");
this.txtKey.Text = "";
txtKey.Select();
}
根据图层别名获取IFeatureClass:
public static IFeatureClass OpenFCbyName(AxMapControl axMapControl, string layerName)
{
IActiveView pActiveView = null;
ILayer pLayer = null;
ICompositeLayer pCompositeLayer = null;
IFeatureLayer pFeatureLayer = null;
IFeatureClass pFeatureClass = null;
try
{
pActiveView = axMapControl.ActiveView;
int LayerCount = pActiveView.FocusMap.LayerCount;
for (int i = 0; i < LayerCount; i++)
{
pLayer = pActiveView.FocusMap.get_Layer(i);
if (pLayer is IGroupLayer)
{
pCompositeLayer = pLayer as ICompositeLayer;
for (int j = 0; j < pCompositeLayer.Count; j++)
{
if (pCompositeLayer.get_Layer(j) is IFeatureLayer)
{
pFeatureLayer = pCompositeLayer.get_Layer(j) as IFeatureLayer;
if (pFeatureLayer.Name == layerName)
{
pFeatureClass = pFeatureLayer.FeatureClass;
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return pFeatureClass;
}
}
}
}
else if (pLayer is IFeatureLayer)
{
if (pLayer.Name == layerName)
{
pFeatureClass = (pLayer as IFeatureLayer).FeatureClass;
break;
}
}
}
return pFeatureClass;
}
catch (System.Exception ex)
{
if (pLayer != null)
Marshal.ReleaseComObject(pLayer);
if (pFeatureLayer != null)
Marshal.ReleaseComObject(pFeatureLayer);
if (pCompositeLayer != null)
Marshal.ReleaseComObject(pCompositeLayer);
if (pActiveView != null)
Marshal.ReleaseComObject(pActiveView);
return null;
}
}
模糊查询结果:
public List<string[]> GetMatchedValues(IFeatureClass pFeatureClass, string strQuery,string strFieldName)
{
List<string[]> lstValue = null;
string[] temp = null;
IQueryFilter pQueryFilter = null;
IFeatureCursor pFeatureCursor = null;
IFeature pFeature = null;
try
{
pQueryFilter = new QueryFilterClass();
pQueryFilter.WhereClause = strQuery;
pFeatureCursor = pFeatureClass.Search(pQueryFilter, false);
pFeature = pFeatureCursor.NextFeature();
lstValue = new List<string[]>();
while (pFeature != null)
{
temp = new string[2];
temp[0] = pFeature.get_Value(pFeature.Fields.FindField("OBJECTID")).ToString();
temp[1]=pFeature.get_Value(pFeature.Fields.FindField(strFieldName)).ToString();
lstValue.Add(temp);
pFeature = pFeatureCursor.NextFeature();
}
if (pFeature != null)
Marshal.ReleaseComObject(pFeature);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pQueryFilter != null)
Marshal.ReleaseComObject(pQueryFilter);
return lstValue;
}
catch (System.Exception ex)
{
if (pFeature != null)
Marshal.ReleaseComObject(pFeature);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (pQueryFilter != null)
Marshal.ReleaseComObject(pQueryFilter);
return null;
}
}
(4)查询结果单击高亮定位
补充一下:
查询中用到IFeatureCursor,要及时释放,因为其设定了最大限定数。
Marshal.ReleaseComObject(pFeatureCursor);
博文地址:http://blog.163.com/liuyang1285@126/blog/static/128913086201082610282340/
转载请注明出处