Newer
Older
GHFX_REFACTOR / NewFunction / FrmEditShapeFile.cs
wxn on 2 Nov 2016 14 KB 提交
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GeoScene.Globe;
using GeoScene.Data;
using GeoScene.Engine;
using System.IO;
using DevComponents.DotNetBar;

namespace Cyberpipe
{
    public partial class FrmEditShapeFile : Office2007Form
    {
        private static GSOGlobeControl globeControl1;
        GSOLayer geoLayer = null;
        private static DataTable dt = null;

        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);
                    this.编辑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 = (GSOFieldDefn)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 = (GSOFieldDefn)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 (System.Exception ex)
            {
                labelX1.Text = " 共有 " + 0 + " 条记录";
            }
        }

        int countLog = 0;
        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;
            }
            this.编辑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 = (GSOFieldDefn)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 = (GSOFieldDefn)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;
            }
        }

    }
}