using System; using System.Collections.Generic; using System.Data; using System.Windows.Forms; using DevComponents.DotNetBar; using GeoScene.Data; using GeoScene.Globe; namespace Cyberpipe { public partial class FrmEditShapeFile : Office2007Form { private static GSOGlobeControl globeControl1; GSOLayer geoLayer; private static DataTable dt; public FrmEditShapeFile(GSOGlobeControl globeControl) { InitializeComponent(); globeControl1 = globeControl; } private void FrmEditShapeFile_Load(object sender, EventArgs e) { labelX1.Text = ""; if (globeControl1 != null) { for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer != null && layer.Name.ToLower().EndsWith(".shp")) { 选择shape文件toolStripMenuItem1.Items.Add(layer.Caption); } } } if (选择shape文件toolStripMenuItem1.Items.Count>0) { 编辑ToolStripMenuItem.Enabled = true; 添加字段ToolStripMenuItem.Enabled = true; 删除字段ToolStripMenuItem.Enabled = true; 保存ToolStripMenuItem.Enabled = true; } } private void 选择shape文件toolStripMenuItem1_SelectedIndexChanged(object sender, EventArgs e) { if (选择shape文件toolStripMenuItem1.SelectedIndex != -1) { string layerCaption = 选择shape文件toolStripMenuItem1.SelectedItem.ToString().Trim(); geoLayer = globeControl1.Globe.Layers.GetLayerByCaption(layerCaption); if (geoLayer != null) { SetDataTable(geoLayer); 编辑ToolStripMenuItem.Checked = geoLayer.Editable; } } } public void SetDataTable(GSOLayer layer) { GSOFeatureLayer pFeatureLayer = layer as GSOFeatureLayer; if (pFeatureLayer == null) { MessageBox.Show("该数据不是属性数据,属性表为空!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } GSOFeatures feats = pFeatureLayer.GetAllFeatures(); GSOFeature feat = feats[0]; countLog = 0; GetReallyFeature(feats); try { dt = new DataTable(pFeatureLayer.Name); DataColumn dc = null; for (int j = 0; j < feat.GetFieldCount(); j++) { GSOFieldDefn field = feat.GetFieldDefn(j); dc = new DataColumn(field.Name); dt.Columns.Add(dc); } for (int i = 0; i < feats.Length; i++) { feat = feats[i]; DataRow dr = dt.NewRow(); for (int j = 0; j < feat.GetFieldCount(); j++) { GSOFieldDefn field = feat.GetFieldDefn(j); object o = feat.GetValue(j); if (o != null) dr[field.Name] = o.ToString(); } dt.Rows.Add(dr); } dataGridView1.ReadOnly = !layer.Editable; dataGridView1.DataSource = dt; if (dt.Rows.Count >= countLog) { labelX1.Text = " 共有 " + dt.Rows.Count + " 条记录"; } else { labelX1.Text = " 共有 " + countLog + " 条记录"; } } catch (Exception ex) { labelX1.Text = " 共有 " + 0 + " 条记录"; } } int countLog; private void GetReallyFeature(GSOFeatures features) { if (features != null && features.Length > 0) { for (int i = 0; i < features.Length; i++) { if (features[i].Type == EnumFeatureType.FeatureFolder) { GetReallyFeature(((GSOFeatureFolder)features[i]).Features); } else { countLog++; } } } } private void dataGridView1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { DataGridView.HitTestInfo hittestinfo = dataGridView1.HitTest(e.X, e.Y); if (hittestinfo.RowIndex > -1) { GSOFeatureLayer pFeatureLayer = geoLayer as GSOFeatureLayer; if (pFeatureLayer != null) { contextMenuStrip1.Show(dataGridView1, e.X, e.Y); globeControl1.Globe.Refresh(); } } } } private void 添加字段ToolStripMenuItem_Click(object sender, EventArgs e) { FrmEditShapeFile_AddField frm = new FrmEditShapeFile_AddField(geoLayer, dataGridView1); frm.Show(this); } private void 删除字段ToolStripMenuItem_Click(object sender, EventArgs e) { FrmEditShapeFile_DeleteField frm = new FrmEditShapeFile_DeleteField(geoLayer, dataGridView1); frm.Show(this); } private void 保存ToolStripMenuItem_Click(object sender, EventArgs e) { dataGridView1.EndEdit(); if (geoLayer != null) { geoLayer.Save(); } } private void 编辑ToolStripMenuItem_Click(object sender, EventArgs e) { dataGridView1.ReadOnly = !dataGridView1.ReadOnly; if (geoLayer != null) { geoLayer.Editable = !geoLayer.Editable; } 编辑ToolStripMenuItem.Checked = !dataGridView1.ReadOnly; } //判断用户输入数据的类型 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (geoLayer != null && geoLayer.GetAllFeatures().Length >= e.RowIndex) { int rowIndex = e.RowIndex; int columnIndex = e.ColumnIndex; string cellValue = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString().Trim(); GSOFeature featureEdit = geoLayer.GetAt(rowIndex); string fieldName = dataGridView1.Columns[columnIndex].Name.Trim(); GSOFieldDefn field = featureEdit.GetFieldDefn(fieldName); switch (field.Type) { case EnumFieldType.INT32: int intValue = 0; if (!Int32.TryParse(cellValue, out intValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = cellValueBeginCellEdit; return; } featureEdit.SetFieldValue(fieldName, intValue); break; case EnumFieldType.Double: double doubleValue = 0; if (!double.TryParse(cellValue, out doubleValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = cellValueBeginCellEdit; return; } featureEdit.SetFieldValue(fieldName, doubleValue); break; case EnumFieldType.Date: DateTime dateTimeValue = DateTime.Now.Date; if (!DateTime.TryParse(cellValue, out dateTimeValue)) { MessageBox.Show("输入的数据格式不正确,请重新输入!", "提示"); dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = cellValueBeginCellEdit; return; } featureEdit.SetFieldValue(fieldName, dateTimeValue); break; case EnumFieldType.Text: featureEdit.SetFieldValue(fieldName, cellValue); break; } } } string cellValueBeginCellEdit = ""; private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { if (e.RowIndex > -1 && e.ColumnIndex > -1) { if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null) { cellValueBeginCellEdit = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString().Trim(); } } } private List<DataGridViewCell> sortAllSelectCells(DataGridView dataGridView) { List<DataGridViewCell> listSelectCells = new List<DataGridViewCell>(); for (int i = 0; i < dataGridView.SelectedCells.Count; i++) { listSelectCells.Add(dataGridView.SelectedCells[i]); } for (int i = 0; i < listSelectCells.Count - 1; i++) { for (int j = i + 1; j < listSelectCells.Count; j++) { if (listSelectCells[i].ColumnIndex > listSelectCells[j].ColumnIndex) { DataGridViewCell cell = null; cell = listSelectCells[i]; listSelectCells[i] = listSelectCells[j]; listSelectCells[j] = cell; } } } for (int i = 0; i < listSelectCells.Count - 1; i++) { for (int j = i + 1; j < listSelectCells.Count; j++) { if (listSelectCells[i].RowIndex > listSelectCells[j].RowIndex) { DataGridViewCell cell = null; cell = listSelectCells[i]; listSelectCells[i] = listSelectCells[j]; listSelectCells[j] = cell; } } } return listSelectCells; } private void 复制ToolStripMenuItem_Click(object sender, EventArgs e) { List<DataGridViewCell> listSelectCells = sortAllSelectCells(dataGridView1); string strCellValue = ""; for (int i = 0; i < listSelectCells.Count; i++) { string cellValue = listSelectCells[i].Value.ToString().Trim(); strCellValue += cellValue + "\r\n"; } Clipboard.SetData(DataFormats.Text, strCellValue); } private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e) { if (dataGridView1.ReadOnly) { MessageBox.Show("表格当前为不可编辑状态!","提示"); return; } if (Clipboard.GetData(DataFormats.Text) == null) { return; } string strCellValue = Clipboard.GetData(DataFormats.Text).ToString(); string[] separator = {"\r\n"}; if(strCellValue.EndsWith(separator[0])) { strCellValue = strCellValue.Remove(strCellValue.LastIndexOf(separator[0])); } string[] arrayCells = strCellValue.Split(separator,StringSplitOptions.None); if (arrayCells.Length <= 0 || dataGridView1.SelectedCells.Count <= 0) { return; } int count = arrayCells.Length > dataGridView1.SelectedCells.Count ? dataGridView1.SelectedCells.Count : arrayCells.Length; List<DataGridViewCell> listSelectCells = sortAllSelectCells(dataGridView1); for (int i = 0; i < count; i++) { string cellValue = arrayCells[i].Trim(); GSOFeature featureEdit = geoLayer.GetAt(listSelectCells[i].RowIndex); string fieldName = dataGridView1.Columns[listSelectCells[i].ColumnIndex].Name.Trim(); GSOFieldDefn field = featureEdit.GetFieldDefn(fieldName); switch (field.Type) { case EnumFieldType.INT32: int intValue = 0; if (!Int32.TryParse(cellValue, out intValue)) { MessageBox.Show("数据格式不正确!", "提示"); return; } featureEdit.SetFieldValue(fieldName, intValue); break; case EnumFieldType.Double: double doubleValue = 0; if (!double.TryParse(cellValue, out doubleValue)) { MessageBox.Show("数据格式不正确!", "提示"); return; } featureEdit.SetFieldValue(fieldName, doubleValue); break; case EnumFieldType.Date: DateTime dateTimeValue = DateTime.Now.Date; if (!DateTime.TryParse(cellValue, out dateTimeValue)) { MessageBox.Show("数据格式不正确!", "提示"); return; } featureEdit.SetFieldValue(fieldName, dateTimeValue); break; case EnumFieldType.Text: featureEdit.SetFieldValue(fieldName, cellValue); break; } dataGridView1.Rows[listSelectCells[i].RowIndex].Cells[listSelectCells[i].ColumnIndex].Value = cellValue; } } } }