AO 字段属性表操作集合贴
- 插入新字段(也可GP实现)
- 字段赋值
- 删除字段
//定义新字段
IField pField = new FieldClass();
//字段编辑
IFieldEdit pFieldEdit = pField as IFieldEdit;
//新建字段名
pFieldEdit.Name_2 = "A";
//获取图层
IFeatureLayer pFeatureLayer = axMapControl1.Map.get_Layer(0) as IFeatureLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IClass pTable = pFeatureClass as IClass; //use ITable or IClass
pTable.AddField(pFieldEdit);
//set values of every feature's field-"name_cit" in the first layer
for (int i = 0; i < pFeatureClass.FeatureCount(null); i++)
{
IFeature pFeature = pFeatureClass.GetFeature(i);
pFeature.set_Value(pFeature.Fields.FindField("A"), "B"); //每个要素的“A”字段存储的都是“B”。
pFeature.Store();
}
//修改字段属性(重)
private void ChangeFieldValue(string pGetFieldName,string pGetFieldAliasName,int pGetFieldLength, esriFieldType FieldType, int FieldIndex,Form pForm)
{
try
{
pFeatureLayer = mlayer as IFeatureLayer;
if (pGetFieldName != null || pGetFieldAliasName != null && pGetFieldLength != 0)
{
ITable pTable = pFeatureLayer.FeatureClass as ITable;
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;//添加Temp字段
pFieldEdit.Name_2 = "temp";
pFieldEdit.AliasName_2 = pGetFieldAliasName;
pFieldEdit.Length_2 = pGetFieldLength;
pFieldEdit.Type_2 = FieldType;
pTable.AddField(pField);
VolFieldValue(pForm, FieldIndex);//为Temp字段传入修改字段值
ISchemaLock pSchemaLock = pTable as ISchemaLock;
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
pTable.DeleteField(pFeatureLayer.FeatureClass.Fields.get_Field(FieldIndex));//删除原修改字段
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
pFieldEdit.Name_2 = pGetFieldName;
pFieldEdit.AliasName_2 = pGetFieldAliasName;
pFieldEdit.Length_2 = pGetFieldLength;
pFieldEdit.Type_2 = FieldType;
pTable.AddField(pField);//添加原字段同名字段
int tempIndex = 0;//获取创建Temp字段位置
for (int i = 0; i < pFeatureLayer.FeatureClass.Fields.FieldCount; i++)
{
if (pFeatureLayer.FeatureClass.Fields.get_Field(i).Name == "temp")
{
tempIndex = i;
}
}
VolFieldValue(pForm, tempIndex);//为创建修改字段同名字段赋值
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
pTable.DeleteField(pFeatureLayer.FeatureClass.Fields.get_Field(tempIndex));//删除创建Temp 字段
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
else
return;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "提示信息");
}
}
// 字段集体赋值函数
private void VolFieldValue(int FiledIndex)
{
try
{
IFeatureCursor pFeatureCursor;
pFeatureCursor = pFeatureLayer.FeatureClass.Search(null, false);
IFeature pFeature;
pFeature = pFeatureCursor.NextFeature();
int pFieldCount = pFeatureLayer.FeatureClass.Fields.FieldCount;
while (pFeature != null)
{
if (pFeatureLayer.FeatureClass.Fields.get_Field(FiledIndex).ToString() == "Shape")
{
pFeature.set_Value(pFieldCount - 1, pFeature.Shape.GeometryType.ToString());
}
else
pFeature.set_Value(pFieldCount - 1, pFeature.get_Value(FiledIndex));
pFeature.Store();
pFeature = pFeatureCursor.NextFeature();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "提示信息");
}
}
// 删除字段函数
private void simpleButton4_Click(object sender, EventArgs e)
{
try
{
IFeatureLayer pDelFeaLay = axMapControl1.get_Layer(iLayerIndex) as IFeatureLayer;
ITable pDelTable = pDelFeaLay.FeatureClass as ITable;
ISchemaLock pSchemaLock = (ISchemaLock)pDelTable;
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
IField pDelField = pDelTable.Fields.get_Field(iFieldIndex);//实现数据独占,避免数据使用冲突,只对Geodatabase有效
pDelTable.DeleteField(pDelField);
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);//释放占有资源
if (comboBoxEdit1.SelectedIndex != -1)
{
ShowSelectField(sender, e);
}
else
{
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "提示信息");
}
}
/// <summary>
/// 删除字段值
/// </summary>
/// <param name="pCurrentLayer"></param>
/// <param name="fieldName"></param>
public static bool DeleteILayerField(ILayer pCurrentLayer, string fieldName)
{
try
{
IFeatureLayer pFeatureLayer = (IFeatureLayer)pCurrentLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
//
int pFieldIndex = pFeatureClass.FindField(fieldName);
IFields pFields = pFeatureClass.Fields;
IField pField = pFields.get_Field(pFieldIndex);
if (pField != null)
{
pFeatureClass.DeleteField(pField);
}
return true;
}
catch (Exception ex)
{
return false;
}
}