在Arcgis二次开发中经常用到对feature属性的编辑等工作,而对于从IFeaturelayer中QI得到的Itable填充C#中的datagridview,在修改数据后如何保存数据?网上的示例多数讲的是打开一个Iworkspace后进行编辑工作,而这对上面这种情况来说没多大关联性。因此,应该寻找一个直接的方法,保存在datagridview的数据修改。现将本人编写的'属性-修改-保存'代码公布如下:
思路:
1.用一个数组list<int> array 记录修改过的行索引号。
2.QI当前层的Itable接口获得pTable对象。
3.遍历array中记录的行,比较datagridview当前表和2中pTable对应的行各列是否相等。不等则修改pTable对应的值,保存当前修改值。
保存按钮:
private void btnSave_Click(object sender, EventArgs e)
{
if (array.Count < 1)
{
MessageBox.Show("未修改任何数据!");
return;
}
array.Sort();
ILayer player = application.CurrentLayer;
operateData.UpdateFTOnDV(player, dataSet.Tables[tablename], array.ToArray());
dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
dataGridView1.Refresh();
}
//核心代码:
public void UpdateFTOnDV(ILayer player, DataTable pdatatable, int [] array)
{
IFeatureLayer pFTClass = player as IFeatureLayer;
ITable pTable = pFTClass as ITable;
ICursor pCursor;
IRow pRow;
pCursor =pTable .GetRows (array,false);
for (int i = 0; i < array.Length; i++)
{
pRow = pCursor.NextRow();
int k = array[i];
for (int j = 2; j < pdatatable.Columns.Count; j++)
{
object pgridview=pdatatable .Rows [k][j];
object prow=pRow .get_Value (j);
if (prow.ToString ()!=pgridview.ToString ())
{
pRow.set_Value(j, pgridview);
pRow.Store();
}
}
}
MessageBox.Show("数据保存成功!");
}