using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.Utils;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Platform.Helper;
using System.IO;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using KGIS.Framework.Maps;
using System.ComponentModel;
using KGIS.Framework.OpenData.Control;
using KGIS.Framework.OpenData.Filter;
using Kingo.OpenData.Filter;
using KGIS.Framework.OpenData.InterFace;
using ESRI.ArcGIS.DataSourcesFile;
using KGIS.Framework.AE;
using KGIS.Framework.AE.Enum;
using System.Windows.Forms;
using Kingo.PluginServiceInterface;
using System.Runtime.InteropServices;
using Kingo.Plugin.DataLoad.Model;
using System.Xml;
using UIShell.OSGi;
using Kingo.PluginServiceInterface.Helper.VCT;
using Kingo.PluginServiceInterface.Model;
using System.Windows.Documents;
namespace Kingo.Plugin.DataLoad.View
{
    /// 
    /// FrmLoadDDTC.xaml 的交互逻辑
    /// 
    public partial class FrmLoadDDTCData : BaseWindow
    {
        public event EventHandler Set_BtnLoad_Activated;
        public event EventHandler Set_BtnLoad_UnActivated;
        public event EventHandler Close_FrmBaseDataLoad;
        public bool shutDown = false;
        private string ImportDataType { get; set; }
        private List pSourceFeatureClasses = null;
        private string SourceMDBPath = null;
        private string pTargetGDBPath = string.Empty;
        public IMap pMap { get; set; }
        private IDataCatalogService _DataCatalog = null;
        private DDTCDataMapping _selectedDDTCData;
        /// 
        /// 选择的变更数据
        /// 
        public DDTCDataMapping SelectedDDTCData
        {
            get { return _selectedDDTCData; }
            set
            {
                _selectedDDTCData = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedDDTCData"));
            }
        }
        protected internal virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public FrmLoadDDTCData()
        {
            InitializeComponent();
            if (MapsManager.Instance.MapService.GetProjectInfo() is ProjectInfo prj)
            {
                pTargetGDBPath = prj.ZLDatabase;
            }
            pMap = MapsManager.Instance.MapService.getAxMapControl().ActiveView.FocusMap;
            if (_DataCatalog == null)
                _DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService();
        }
        /// 
        /// 选择单独图层数据
        /// 
        /// 
        /// 
        private void BtnSelectedDDTCData_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                using (ComReleaser com = new ComReleaser())
                {
                    IWorkspaceFactory pWorkspaceFactory = null;
                    IWorkspace pWorkspace = null;
                    IFeatureWorkspace pFeatureWorkspace = null;
                    List otherDataPathList = new List();
                    string FinalLocation = "";
                    pSourceFeatureClasses = new List();
                    List TempSelection = new List();
                    PluginServiceInterface.Helper.OpenDataDialogHelper.OpenDataDialog("选择单独图层数据", ref FinalLocation, ref TempSelection, ref otherDataPathList, ref pSourceFeatureClasses);
                    {
                        if (string.IsNullOrWhiteSpace(FinalLocation)) return;
                        ImportDataType = Path.GetExtension(FinalLocation).ToUpper().Replace('.', ' ').TrimStart();
                        if (ImportDataType == "SHP")
                            ImportDataType = "Shape";
                        string fileName = string.Empty;
                        if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape"))
                        {
                            for (int i = 0; i < TempSelection.Count; i++)
                            {
                                fileName += TempSelection[i].Name + ";";
                            }
                            btnImportDataPath.EditValue = fileName;
                            SetShapeTableMapping();
                        }
                        else if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("VCT"))
                        {
                            btnImportDataPath.EditValue = FinalLocation;
                            string TempMDBFolderPath = Path.GetTempPath();
                            string TempMDBPath = Path.Combine(TempMDBFolderPath, string.Format("{0}.mdb", Path.GetFileNameWithoutExtension(FinalLocation)));
                            if (File.Exists(TempMDBPath))
                            {
                                File.Delete(TempMDBPath);
                            }
                            VCTToMDBHelper3 vcttomdb = new VCTToMDBHelper3
                            {
                                RootPath = TempMDBFolderPath
                            };
                            vcttomdb.VCTToMDB(FinalLocation);
                            if (!File.Exists(TempMDBPath))
                            {
                                MessageHelper.ShowError("VCT文件解析失败");
                                return;
                            }
                            SourceMDBPath = TempMDBPath;
                            SetTableMapping();
                        }
                        else
                        {
                            btnImportDataPath.EditValue = FinalLocation;
                            SetTableMapping();
                        }
                    }
                    com.ManageLifetime(pWorkspaceFactory);
                    com.ManageLifetime(pWorkspace);
                    com.ManageLifetime(pFeatureWorkspace);
                }
            }
            catch (Exception ex)
            {
                PluginServiceInterface.CommonHelper.RecordsErrLog("选择单独图层数据异常", ex);
                MessageHelper.ShowTips("选择单独图层数据失败:" + ex);
            }
        }
        private void SetShapeTableMapping()
        {
            IWorkspaceAPI t_WsAPI = null;
            IFeatureClassAPI t_FCAPI = null;
            try
            {
                dgTableMapping.ItemsSource = null;
                string t_GdbPath = pTargetGDBPath;
                if (t_GdbPath == string.Empty)
                {
                    MessageHelper.ShowTips("未找到工程数据文件,请检查工程数据文件是否与工程文件处于同一目录下!");
                    return;
                }
                if (t_GdbPath.ToLower().EndsWith(".gdb"))
                {
                    t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                }
                else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                {
                    t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                }
                Dictionary t_TbList = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset);
                Dictionary t_TbList2 = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureClass);
                #region 将目标图层作为字典项可进行下拉选择
                List dicTable = new List();
                dicTable.Add(new DataDicTionary() { NAME = "Null", CODE = "null" });
                dicTable.Add(new DataDicTionary() { NAME = "追加图层", CODE = "Add" });
                foreach (string item in t_TbList.Keys)
                {
                    t_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList[item]);
                    dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList[item], REMARK = t_FCAPI.FeatureClass.ShapeType.ToString() });
                    t_FCAPI.CloseFeatureClass();
                }
                foreach (string item in t_TbList2.Keys)
                {
                    t_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList2[item]);
                    dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList2[item], REMARK = t_FCAPI.FeatureClass.ShapeType.ToString() });
                    t_FCAPI.CloseFeatureClass();
                }
                #endregion
                List MappingList = new List();
                foreach (IFeatureClass pSourceFeatureClass in pSourceFeatureClasses)
                {
                    // pSourceFeatureClass.CheckArea();
                    DDTCDataMapping mapping = new DDTCDataMapping();
                    mapping.State = TBState.Waiting;
                    mapping.S_TableName = (pSourceFeatureClass as FeatureClass).Name;
                    mapping.S_TableAliasName = pSourceFeatureClass.AliasName;
                    mapping.PropertyChanged2 += mapping_PropertyShapeChanged2;
                    mapping.S_Spatial = (pSourceFeatureClass as IGeoDataset).SpatialReference.Name;
                    mapping.S_TableType = pSourceFeatureClass.ShapeType.ToString();
                    DataDicTionary dic = dicTable.FirstOrDefault(f => f.NAME == (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName) || f.CODE == (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName));
                    if (dic != null)
                    {
                        mapping.T_TableAliasName = dic.NAME;
                        mapping.T_TableName = dic.CODE;
                        mapping.T_TableType = dic.REMARK;
                    }
                    else
                    {
                        dic = dicTable.Find(f => f.NAME == string.Format("基础_{0}", (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName)) ||
                            f.CODE == string.Format("JC_{0}", (string.IsNullOrWhiteSpace(pSourceFeatureClass.AliasName) ? (pSourceFeatureClass as FeatureClass).Name : pSourceFeatureClass.AliasName)));
                        if (dic != null)
                        {
                            mapping.T_TableAliasName = dic.NAME;
                            mapping.T_TableName = dic.CODE;
                            mapping.T_TableType = dic.REMARK;
                        }
                    }
                    mapping.T_TableList = dicTable.Where(w => w.REMARK == mapping.S_TableType || w.CODE == "null" || w.CODE == "Add").ToList();
                    SetShapeDefaultFieldMapping(mapping, t_WsAPI);
                    MappingList.Add(mapping);
                }
                dgTableMapping.ItemsSource = MappingList;
                JudgeIsTheSameSpatialReference();
            }
            catch (Exception ex)
            {
                LogAPI.Debug("获取单独图层列表数据失败:" + ex);
                MessageHelper.Show("获取单独图层列表数据失败:" + ex);
            }
            finally
            {
                if (t_WsAPI != null)
                    t_WsAPI.CloseWorkspace();
            }
        }
        private void SetTableMapping()
        {
            IWorkspaceAPI t_WsAPI = null;
            IWorkspaceAPI s_WsAPI = null;
            IFeatureClassAPI s_FCAPI = null;
            try
            {
                dgTableMapping.ItemsSource = null;
                string s_MdbPath = null;
                if (ImportDataType == "VCT")
                {
                    s_MdbPath = SourceMDBPath;
                }
                else
                {
                    s_MdbPath = btnImportDataPath.EditValue.ToString();
                }
                if ((ImportDataType == "MDB" || ImportDataType == "VCT") && !File.Exists(s_MdbPath))
                {
                    MessageHelper.ShowTips("请确保文件存在,并且为mdb文件!");
                    return;
                }
                else if (ImportDataType == "GDB" && !Directory.Exists(s_MdbPath))
                {
                    MessageHelper.ShowTips("请确保GDB文件夹存在!");
                    return;
                }
                if (ImportDataType == "MDB" || ImportDataType == "VCT")
                {
                    FileInfo s_MdbPathInfo = new FileInfo(s_MdbPath);
                    if (!s_MdbPathInfo.Extension.Equals(".mdb"))
                    {
                        MessageHelper.ShowTips("必须为mdb文件才能进行导入!");
                        return;
                    }
                }
                string t_GdbPath = pTargetGDBPath;
                if (ImportDataType == "MDB" || ImportDataType == "VCT")
                {
                    s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile);
                }
                else
                {
                    s_WsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile);
                }
                if (t_GdbPath.ToLower().EndsWith(".gdb"))
                {
                    t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                }
                else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                {
                    t_WsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                }
                Dictionary t_TbList = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset).Where(X => !X.Value.StartsWith("TDQSQ") && !X.Value.StartsWith("JC_CZCDYD")).ToDictionary(X => X.Key, Y => Y.Value);//周旺华 0424 排除TDQSQ导致的导入问题
                Dictionary t_TbList2 = t_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureClass);
                List dicTable = new List();
                dicTable.Add(new DataDicTionary() { NAME = "Null", CODE = "null" });
                dicTable.Add(new DataDicTionary() { NAME = "追加图层", CODE = "Add" });
                List excludeList = new List() { "地类图斑更新", "DLTBGX", "地类图斑更新过程", "DLTBGXGC", "行政区更新", "XZQGX", "行政区更新过程", "XZQGXGC", "村级调查区更新", "CJDCQGX", "村级调查区更新过程", "CJDCQGXGC", "行政区界线更新", "XZQJXGX", "村级调查区界线更新", "CJDCQJXGX", "城镇村等用地更新", "CZCDYDGX", "城镇村等用地更新过程", "CZCDYDGXGC" };
                List OnlyLoadList = new List() { "工厂化种植更新", "GCHZZGX", "坡度图更新", "PDTGX", "拆除未尽区更新", "CCWJQGX", "耕地等别更新", "GDDBGX", "光伏板区更新", "GFBQGX", "路面范围更新", "LMFWGX", "推土区更新", "TTQGX" };
                foreach (string item in t_TbList.Keys)
                {
                    if (!OnlyLoadList.Contains(item)) continue;
                    s_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList[item]);
                    dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList[item], REMARK = s_FCAPI.FeatureClass.ShapeType.ToString() });
                }
                foreach (string item in t_TbList2.Keys)
                {
                    s_FCAPI = t_WsAPI.OpenFeatureClass(t_TbList2[item]);
                    dicTable.Add(new DataDicTionary() { NAME = item, CODE = t_TbList2[item], REMARK = s_FCAPI.FeatureClass.ShapeType.ToString() });
                }
                List s_TbList = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureDataset).Where(x => !x.Value.StartsWith("TDQSQ")).Select(x => new KeyAndValue() { S_Key = x.Key, S_Value = x.Value }).ToList();//周旺华 0424 排除TDQSQ导致的导入问题
                Dictionary s_TbList2 = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTFeatureClass);
                Dictionary s_TbList3 = s_WsAPI.GetFeatureClassName(esriDatasetType.esriDTTable);
                foreach (string item in s_TbList2.Keys)
                {
                    if (!s_TbList.Select(x => x.S_Value).Contains(item))
                        s_TbList.Add(new KeyAndValue() { S_Key = item, S_Value = s_TbList2[item] });
                }
                bool appzj = false;
                if (t_TbList != null && s_TbList != null)
                {
                    List MappingList = new List();
                    var zjlist = s_TbList.Where(x => x.S_Value.EndsWith("ZJ")).ToList();
                    var zjcount = zjlist.Count();
                    if (zjcount == 1)//补充不足的注记图层
                    {
                        appzj = true;
                        var appzjcount = t_TbList.Values.Where(x => x.EndsWith("ZJ")).Count() - 1;
                        var ofindex = s_TbList.IndexOf(s_TbList.SingleOrDefault(x => x.S_Value == "ZJ"));
                        var templist = new List();
                        for (var i = 0; i < appzjcount; i++)
                        {
                            templist.Add(new KeyAndValue() { S_Key = zjlist[0].S_Key, S_Value = zjlist[0].S_Value });
                        }
                        s_TbList.InsertRange(ofindex, templist);
                    }
                    var zjindex = 0;
                    var tzjlist = dicTable.Where(x => x.CODE.EndsWith("ZJ")).ToList();
                    foreach (string key in s_TbList.Select(x => x.S_Key))
                    {
                        var keyvalue = s_TbList.FirstOrDefault(x => x.S_Key == key).S_Value;
                        //if (excludeList.Contains(key)) continue;
                        if (!OnlyLoadList.Contains(key)) continue;
                        DDTCDataMapping mapping = new DDTCDataMapping();
                        mapping.PropertyChanged2 += mapping_PropertyChanged2;
                        mapping.State = TBState.Waiting;
                        mapping.S_TableName = keyvalue;
                        mapping.S_TableAliasName = key;
                        if (s_TbList3.Values.Contains(mapping.S_TableName))
                        {
                            mapping.S_TableType = "Table";
                        }
                        else
                        {
                            s_FCAPI = s_WsAPI.OpenFeatureClass(keyvalue);
                            mapping.S_Spatial = (s_FCAPI.FeatureClass as IGeoDataset).SpatialReference.Name;
                            mapping.S_TableType = s_FCAPI.FeatureClass.ShapeType.ToString();
                            s_FCAPI.CloseFeatureClass();
                        }
                        DataDicTionary dic = dicTable.Find(f => f.NAME == key || f.CODE == keyvalue);
                        if (appzj && keyvalue == "ZJ" && tzjlist.Count > 0)
                        {
                            dic = tzjlist[zjindex];
                            mapping.S_YSDM_SQL = "YSDM='" + GetRuleTableEntityByTableName(dic.CODE).YSDM + "'";
                            zjindex++;
                        }
                        if (dic != null)
                        {
                            mapping.T_TableAliasName = dic.NAME;
                            mapping.T_TableName = dic.CODE;
                            mapping.T_TableType = dic.REMARK;
                        }
                        mapping.T_TableList = dicTable.Where(w => w.REMARK == mapping.S_TableType || w.CODE == "null" || w.CODE == "Add").ToList();
                        SetDefaultFieldMapping(mapping, s_WsAPI, t_WsAPI);
                        MappingList.Add(mapping);
                    }
                    dgTableMapping.ItemsSource = MappingList;
                }
                JudgeIsTheSameSpatialReference();
            }
            catch (Exception ex)
            {
                LogAPI.Debug("获取单独图层列表数据失败:" + ex);
                MessageHelper.Show("获取单独图层列表数据失败:" + ex);
            }
            finally
            {
                if (s_WsAPI != null)
                    s_WsAPI.CloseWorkspace();
                if (t_WsAPI != null)
                    t_WsAPI.CloseWorkspace();
                if (s_FCAPI != null)
                {
                    s_FCAPI.CloseFeatureClass();
                    s_FCAPI = null;
                }
            }
        }
        private void mapping_PropertyChanged2(object sender, PropertyChangedEventArgs e)
        {
            DDTCDataMapping maping = dgTableMapping.SelectedItem as DDTCDataMapping;
            if (maping != null)
            {
                maping.T_TableType = maping.S_TableType;
                SetDefaultFieldMapping(maping, null, null);
                dgFieldMapping.ItemsSource = maping.FieldMapping;
            }
        }
        private void mapping_PropertyShapeChanged2(object sender, PropertyChangedEventArgs e)
        {
            DDTCDataMapping maping = dgTableMapping.SelectedItem as DDTCDataMapping;
            if (maping != null)
            {
                maping.T_TableType = maping.S_TableType;
                SetShapeDefaultFieldMapping(maping, null);
                dgFieldMapping.ItemsSource = maping.FieldMapping;
            }
        }
        public void SetShapeDefaultFieldMapping(DDTCDataMapping tbMapping, IWorkspaceAPI pTargetWsAPI)
        {
            if (tbMapping.T_TableName == "Add")
            {
                return;
            }
            if (pTargetWsAPI == null)
            {
                string t_GdbPath = pTargetGDBPath;
                if (t_GdbPath.ToLower().EndsWith(".gdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                }
                else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                }
                else
                {
                    pTargetWsAPI = null;
                    MessageHelper.ShowTips("无法识别的工程数据类型");
                    return;
                }
            }
            IFeatureClassAPI t_FcAPI = null;
            ITableAPI t_TBAPI = null;
            IFeatureClassAPI s_FcAPI = null;
            ITableAPI s_TBAPI = null;
            try
            {
                if (!string.IsNullOrWhiteSpace(tbMapping.S_TableName) && !string.IsNullOrWhiteSpace(tbMapping.T_TableName) && !tbMapping.T_TableName.Equals("NULL", StringComparison.OrdinalIgnoreCase))
                {
                    if (tbMapping.T_TableType.Equals("TABLE", StringComparison.OrdinalIgnoreCase))
                    {
                        t_TBAPI = pTargetWsAPI.OpenTable(tbMapping.T_TableName);
                    }
                    else
                    {
                        t_FcAPI = pTargetWsAPI.OpenFeatureClass(tbMapping.T_TableName);
                    }
                    s_FcAPI = new FeatureClassAPI(pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(tbMapping.S_TableName) || p.AliasName.Equals(tbMapping.S_TableName)).Single());
                    List dicData = new List();
                    dicData.Add(new DataDicTionary() { DisplayName = "Null", NAME = "Null", CODE = "-1", REMARK = "" });
                    dicData.Add(new DataDicTionary() { DisplayName = "追加字段", NAME = "Add", CODE = "-2", REMARK = "" });
                    if (t_FcAPI != null)
                    {
                        for (int i = 0; i < t_FcAPI.FeatureClass.Fields.FieldCount; i++)
                        {
                            IField field = t_FcAPI.FeatureClass.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() });
                        }
                    }
                    else if (t_TBAPI != null)
                    {
                        for (int i = 0; i < t_TBAPI.ITable.Fields.FieldCount; i++)
                        {
                            IField field = t_TBAPI.ITable.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() });
                        }
                    }
                    if (s_FcAPI != null && s_FcAPI.FeatureClass != null)
                    {
                        List data = new List();
                        for (int i = 0; i < s_FcAPI.FeatureClass.Fields.FieldCount; i++)
                        {
                            IField field = s_FcAPI.FeatureClass.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            FieldMapping item = new FieldMapping();
                            item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName;
                            item.S_FieldIndex = i;
                            DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName));
                            if (dic != null)
                            {
                                item.T_FieldName = dic.DisplayName;
                                item.T_FieldIndex = Convert.ToInt16(dic.CODE);
                            }
                            else
                            {
                                item.T_FieldIndex = -1;
                            }
                            item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.REMARK.Contains("Double") || f.REMARK.Contains("Integer") || f.CODE == "-1" || f.CODE == "-2");
                            data.Add(item);
                        }
                        tbMapping.FieldMapping = data;
                    }
                    else if (s_TBAPI != null && s_TBAPI.ITable != null)
                    {
                        List data = new List();
                        for (int i = 0; i < s_TBAPI.ITable.Fields.FieldCount; i++)
                        {
                            IField field = s_TBAPI.ITable.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            FieldMapping item = new FieldMapping();
                            item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName;
                            item.S_FieldIndex = i;
                            DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName));
                            if (dic != null)
                            {
                                item.T_FieldName = dic.DisplayName;
                                item.T_FieldIndex = Convert.ToInt16(dic.CODE);
                            }
                            else
                            {
                                item.T_FieldIndex = -1;
                            }
                            item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.CODE == "-1" || f.CODE == "-2");
                            data.Add(item);
                        }
                        tbMapping.FieldMapping = data;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageHelper.ShowTips("操作异常!" + ex.Message);
                LogAPI.Debug(ex);
            }
        }
        #region 判断是否是一样的坐标参考系
        /// 
        /// 判断选中的数据参考坐标系是否和目标数据库一致
        /// 
        public void JudgeIsTheSameSpatialReference()
        {
            try
            {
                #region 判断参考坐标系是否一致
                int iIsShape = 0;
                if (ImportDataType == "VCT")
                {
                    iIsShape = 0;
                }
                else
                {
                    if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape"))
                    {
                        iIsShape = 1;
                    }
                    else
                    {
                        if (ImportDataType == "GDB")
                        {
                            iIsShape = 0;
                        }
                        else
                        {
                            iIsShape = 0;
                        }
                    }
                }
                if (iIsShape == 0)
                {
                    JudgeIsTheSameSpatialReference_UnShape();
                }
                else
                {
                    JudgeIsTheSameSpatialReference_Shape();
                }
                string s_MdbPath_T = null;
                if (ImportDataType == "VCT")
                {
                    s_MdbPath_T = SourceMDBPath;
                }
                else
                {
                    s_MdbPath_T = btnImportDataPath.EditValue.ToString();
                }
                if (string.IsNullOrWhiteSpace(s_MdbPath_T) == false)
                {
                    if (this.Set_BtnLoad_Activated != null)
                    {
                        this.Set_BtnLoad_Activated(null, null);
                    }
                }
                else
                {
                    if (this.Set_BtnLoad_UnActivated != null)
                    {
                        this.Set_BtnLoad_UnActivated(null, null);
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
                LogAPI.Debug("判断选中的数据参考坐标系是否和目标数据库一致 时失败,异常原因: " + ex + " ; ");
            }
        }
        /// 
        /// 判断选中的数据参考坐标系是否和目标数据库一致-非Shape时
        /// 
        public void JudgeIsTheSameSpatialReference_UnShape()
        {
            List mapping = dgTableMapping.ItemsSource as List;
            IWorkspaceAPI pSourceWsAPI = null;
            IWorkspaceAPI pTargetWsAPI = null;
            try
            {
                if (shutDown)
                {
                    MessageHelper.Show("当前状态是 shutDown,故无法导入!");
                    ResetImport();
                    return;
                }
                string s_MdbPath = null;
                if (ImportDataType == "VCT")
                {
                    s_MdbPath = SourceMDBPath;
                }
                else
                {
                    s_MdbPath = btnImportDataPath.EditValue.ToString();
                }
                string t_GdbPath = pTargetGDBPath;
                if (string.IsNullOrWhiteSpace(s_MdbPath) || string.IsNullOrWhiteSpace(t_GdbPath))
                {
                    MessageHelper.Show("导入数据或工程数据获取失败,故无法导入!");
                    ResetImport();
                    return;
                }
                if (ImportDataType == "MDB" || ImportDataType == "VCT" || ImportDataType == "DCSJ")
                {
                    if (!File.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath))
                    {
                        MessageHelper.Show("导入数据或工程数据获取失败,故无法导入!");
                        ResetImport();
                        return;
                    }
                    pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile);
                }
                else
                {
                    if (!Directory.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath))
                    {
                        MessageHelper.Show("导入数据或工程数据获取失败,故无法导入!");
                        ResetImport();
                        return;
                    }
                    pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile);
                }
                if (t_GdbPath.ToLower().EndsWith(".gdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                }
                else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                }
                if (mapping != null)
                {
                    //循环导入要素类
                    string message = string.Empty;
                    string errorMessage = string.Empty;
                    //设置图层验证成功,失败变量
                    int SuccessJudgeLayerCount = 0;
                    int FailJudgeLayerCount = 0;
                    foreach (DDTCDataMapping table in mapping)
                    {
                        if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null")
                        {
                            //LogAPI.Debug("为空的不处理的 表源名称: " + table.S_TableName + " ; ");
                            //LogAPI.Debug("为空的不处理的 表源类型: " + table.S_TableType + " ; ");
                            continue;
                        }
                        if (JudgeData_UnShape(table, pSourceWsAPI, pTargetWsAPI, ref message, ref errorMessage, ref FailJudgeLayerCount) == true)
                        {
                            SuccessJudgeLayerCount += 1;
                        }
                    }
                    string sErrorShowMsg = "";
                    if (string.IsNullOrWhiteSpace(message) == false)
                    {
                        message = message.Substring(0, message.Length - 1);
                        sErrorShowMsg += "表名为: " + message + "的数据 坐标系与工程坐标系不一致,故无法导入!";
                    }
                    if (FailJudgeLayerCount > 0 || string.IsNullOrWhiteSpace(errorMessage) == false)
                    {
                        sErrorShowMsg += "验证失败的表数量: " + FailJudgeLayerCount + " 个; ";
                        sErrorShowMsg += "失败原因如下: " + errorMessage + " ; ";
                    }
                    if (!string.IsNullOrWhiteSpace(sErrorShowMsg))
                    {
                        MessageHelper.Show(sErrorShowMsg, false);
                        ResetImport();
                    }
                }
                return;
            }
            catch (Exception ex)
            {
                LogAPI.Debug("验证 " + ImportDataType + " 数据时失败,异常原因: " + ex + " ; ");
                throw ex;
            }
            finally
            {
                if (pSourceWsAPI != null)
                {
                    pSourceWsAPI.CloseWorkspace();
                }
                if (pTargetWsAPI != null)
                {
                    pTargetWsAPI.CloseWorkspace();
                }
                if (mapping != null && mapping.Count() > 0)
                {
                    mapping = null;
                }
            }
        }
        /// 
        /// 判断选中的数据参考坐标系是否和目标数据库一致-非Shape时---主方法
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        private bool JudgeData_UnShape(
            DDTCDataMapping pTbMaping, IWorkspaceAPI pSourceWsAPI, IWorkspaceAPI pTargetWsAPI,
            ref string message, ref string errorMessage, ref int FailJudgeLayerCount)
        {
            if (pSourceWsAPI == null || pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null)
            {
                FailJudgeLayerCount++;
                errorMessage += (pTbMaping.S_TableName + "表失败原因: 导入数据或工程数据 工作空间获取失败 ; ");
                return false;
            }
            IFeatureClassAPI t_FcAPI = null;
            IFeatureClassAPI s_FcAPI = null;
            try
            {
                if (pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI.CurrentWorkspace == null)
                {
                    FailJudgeLayerCount++;
                    errorMessage += (pTbMaping.S_TableName + "表失败原因: 导入数据或工程数据 工作空间获取失败 ; ");
                    return false;
                }
                if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName))
                {
                    if (pTbMaping.S_TableType.ToUpper() != "TABLE")
                    {
                        s_FcAPI = pSourceWsAPI.OpenFeatureClass(pTbMaping.S_TableName);
                    }
                    if (pTbMaping.T_TableName != "Add")
                    {
                        if (pTbMaping.T_TableType.ToUpper() != "TABLE")
                        {
                            t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName);
                        }
                    }
                    //判断坐标参考是否一致
                    if (t_FcAPI != null && s_FcAPI != null &&
                       (t_FcAPI.FeatureClass as IGeoDataset) != null &&
                       (s_FcAPI.FeatureClass as IGeoDataset) != null)
                    {
                        bool isEqual = KGIS.Framework.AE.GeoDBAPI.SpatialReferenceCompare(
                                             (t_FcAPI.FeatureClass as IGeoDataset).SpatialReference,
                                             (s_FcAPI.FeatureClass as IGeoDataset).SpatialReference
                                       );
                        if (!isEqual)
                        {
                            message += pTbMaping.S_TableAliasName + ",";
                            return false;
                        }
                    }
                    return true;
                }
                else
                {
                    FailJudgeLayerCount++;
                    errorMessage += (pTbMaping.S_TableName + "表失败原因:此导入数据表表名或者工程目标数据表表名 获取失败 ; ");
                    return false;
                }
            }
            catch (Exception ex)
            {
                FailJudgeLayerCount++;
                errorMessage += (pTbMaping.S_TableName + "表验证是否坐标参考系一致 时失败,异常原因: " + ex + " ; ");
                return false;
            }
            finally
            {
                if (t_FcAPI != null)
                    t_FcAPI.CloseFeatureClass();
                if (s_FcAPI != null)
                    s_FcAPI.CloseFeatureClass();
            }
        }
        /// 
        /// 判断选中的数据参考坐标系是否和目标数据库一致-Shape时
        /// 
        public void JudgeIsTheSameSpatialReference_Shape()
        {
            IWorkspaceAPI pTargetWsAPI = null;
            try
            {
                if (shutDown)
                {
                    MessageHelper.Show("当前状态是 shutDown,故无法导入!");
                    ResetImport();
                    return;
                }
                string t_GdbPath = pTargetGDBPath;
                if (string.IsNullOrWhiteSpace(t_GdbPath) || !Directory.Exists(t_GdbPath))
                {
                    //MessageHelper.ShowTips("未找到当前工程数据库");
                    MessageHelper.Show("未找到当前工程数据库,故无法导入!");
                    ResetImport();
                    return;
                }
                if (t_GdbPath.ToLower().EndsWith(".gdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                }
                else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                }
                List mapping = dgTableMapping.ItemsSource as List;
                if (mapping != null)
                {
                    //循环判断要素类
                    string message = string.Empty;
                    string erroeMessage = string.Empty;
                    //设置图层验证成功,失败变量
                    int SuccessJudgeLayerCount = 0;
                    int FailJudgeLayerCount = 0;
                    foreach (DDTCDataMapping table in mapping)
                    {
                        if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null")
                        {
                            continue;
                        }
                        if (JudgeData_Shape(table, pTargetWsAPI, ref message, ref erroeMessage, ref FailJudgeLayerCount) == true)
                        {
                            SuccessJudgeLayerCount += 1;
                        }
                    }
                    string sErrorShowMsg = "";
                    if (string.IsNullOrWhiteSpace(message) == false)
                    {
                        message = message.Substring(0, message.Length - 1);
                        sErrorShowMsg += "表名为: " + message + "的数据 坐标系与工程坐标系不一致,故无法导入!";
                    }
                    if (FailJudgeLayerCount > 0 || string.IsNullOrWhiteSpace(erroeMessage) == false)
                    {
                        sErrorShowMsg += "验证失败的表数量: " + FailJudgeLayerCount + " 个; ";
                        sErrorShowMsg += "失败原因如下: " + erroeMessage + " ; ";
                    }
                    if (!string.IsNullOrWhiteSpace(sErrorShowMsg))
                    {
                        MessageHelper.Show(sErrorShowMsg, false);
                        ResetImport();
                    }
                }
                return;
            }
            catch (Exception ex)
            {
                LogAPI.Debug("验证 " + ImportDataType + " 数据时失败,异常原因: " + ex + " ; ");
                throw ex;
            }
            finally
            {
                if (pTargetWsAPI != null)
                {
                    pTargetWsAPI.CloseWorkspace();
                }
            }
        }
        /// 
        /// 判断选中的数据参考坐标系是否和目标数据库一致-Shape时---主方法
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        private bool JudgeData_Shape(
            DDTCDataMapping pTbMaping, IWorkspaceAPI pTargetWsAPI,
            ref string message, ref string erroeMessage, ref int FailJudgeLayerCount)
        {
            if (pSourceFeatureClasses == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null)
            {
                FailJudgeLayerCount++;
                erroeMessage += (pTbMaping.S_TableName + "表失败原因:此导入数据表表名或者工程目标数据表表名 获取失败 ; ");
                return false;
            }
            IFeatureClassAPI t_FcAPI = null;
            IFeatureClass pSourceFeatureClass = null;
            string currentFiled = string.Empty;
            try
            {
                if (pTargetWsAPI.CurrentWorkspace == null)
                {
                    FailJudgeLayerCount++;
                    erroeMessage += (pTbMaping.S_TableName + "表失败原因:当前工程工作空间 获取失败 ; ");
                    return false;
                }
                if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName))
                {
                    pSourceFeatureClass = pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(pTbMaping.S_TableName) || p.AliasName.Equals(pTbMaping.S_TableName)).Single();
                    if (pSourceFeatureClass == null)
                    {
                        FailJudgeLayerCount++;
                        erroeMessage += (pTbMaping.S_TableName + "表失败原因:表元素 获取失败 ; ");
                        return false;
                    }
                    if (pTbMaping.T_TableName != "Add")
                    {
                        t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName);
                    }
                    //判断坐标参考是否一致
                    if (t_FcAPI != null &&
                       (t_FcAPI.FeatureClass as IGeoDataset) != null &&
                       (pSourceFeatureClass as IGeoDataset) != null)
                    {
                        bool isEqual = KGIS.Framework.AE.GeoDBAPI.SpatialReferenceCompare(
                                       (t_FcAPI.FeatureClass as IGeoDataset).SpatialReference,
                                       (pSourceFeatureClass as IGeoDataset).SpatialReference
                             );
                        if (!isEqual)
                        {
                            message += pTbMaping.S_TableAliasName + ",";
                            return false;
                        }
                    }
                    return true;
                }
                else
                {
                    FailJudgeLayerCount++;
                    erroeMessage += (pTbMaping.S_TableName + "表失败原因:此导入数据表表名或者工程目标数据表表名 获取失败 ; ");
                    return false;
                }
            }
            catch (Exception ex)
            {
                FailJudgeLayerCount++;
                erroeMessage += (pTbMaping.S_TableName + "表验证是否坐标参考系一致 时失败,异常原因: " + ex + " ; ");
                return false;
            }
            finally
            {
                if (t_FcAPI != null)
                    t_FcAPI.CloseFeatureClass();
            }
        }
        /// 
        /// 重置导入
        /// 
        public void ResetImport()
        {
            try
            {
                //将选中的数据源地址清空
                btnImportDataPath.EditValue = "";
                //将映射关系置空
                if (dgTableMapping != null)
                {
                    if (dgTableMapping.ItemsSource != null)
                    {
                        dgTableMapping.ItemsSource = null;
                    }
                    dgTableMapping.UnselectAll();
                    dgTableMapping.RefreshData();
                }
                if (dgFieldMapping != null)
                {
                    if (dgFieldMapping.ItemsSource != null)
                    {
                        dgFieldMapping.ItemsSource = null;
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("重置 " + ImportDataType + " 的导入失败,异常原因: " + ex + " ; ");
            }
        }
        #endregion
        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(ImportDataType) && ImportDataType.Equals("Shape"))
                {
                    ExeSHP();
                }
                else
                {
                    Exe();
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("单独图层加载失败:" + ex);
                MessageHelper.Show("单独图层加载失败:" + ex);
            }
        }
        #region 导入GDB、MDB、Vct格式的数据
        public void Exe()
        {
            List mapping = dgTableMapping.ItemsSource as List;
            this.btnOK.IsEnabled = false;
            IWorkspaceAPI pSourceWsAPI = null;
            IWorkspaceAPI pTargetWsAPI = null;
            try
            {
                if (btnImportDataPath.EditValue == null)
                {
                    MessageHelper.ShowTips("请先选择要导入的 " + ImportDataType + " 数据");
                    return;
                }
                else
                {
                    if (ImportDataType == "GDB")
                    {
                        if (Directory.Exists(btnImportDataPath.EditValue.ToString()) == false)
                        {
                            MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源");
                            btnImportDataPath.EditValue = "";
                            return;
                        }
                        else
                        {
                            if (btnImportDataPath.EditValue.ToString().ToLower().EndsWith(".gdb") == false)
                            {
                                MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源");
                                btnImportDataPath.EditValue = "";
                                return;
                            }
                        }
                    }
                    else//MDB/VCT/DCSJ
                    {
                        if (File.Exists(btnImportDataPath.EditValue.ToString()) == false)
                        {
                            MessageHelper.ShowTips("无效的 " + ImportDataType + " 数据源");
                            btnImportDataPath.EditValue = "";
                            return;
                        }
                    }
                }
                string s_MdbPath = null;
                if (ImportDataType == "VCT")
                {
                    s_MdbPath = SourceMDBPath;
                }
                else
                {
                    s_MdbPath = btnImportDataPath.EditValue.ToString();
                }
                string t_GdbPath = pTargetGDBPath;
                if (string.IsNullOrWhiteSpace(s_MdbPath) || string.IsNullOrWhiteSpace(t_GdbPath))
                {
                    return;
                }
                if (ImportDataType == "MDB" || ImportDataType == "VCT" || ImportDataType == "DCSJ")
                {
                    if (!File.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath))
                    {
                        return;
                    }
                    pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile);
                }
                else
                {
                    if (!Directory.Exists(s_MdbPath) || !Directory.Exists(t_GdbPath))
                    {
                        return;
                    }
                    pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile);
                }
                if (t_GdbPath.ToLower().EndsWith(".gdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                }
                else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                }
                if (mapping != null)
                {
                    //ILayer zltcGroup = MapsManager.Instance.MapService.GetGroupLayer("ZLTC");//获取增量图层组
                    //ILayer zltcGroup = MapsManager.Instance.MapService.GetGroupLayer("ZLCG");//获取增量图层组
                    //循环导入要素类
                    string message = string.Empty;
                    string errorMessage = string.Empty;
                    int SuccessImportLayerCount = 0;
                    int DeletedImportLayerCount = 0;
                    int FailImportLayerCount = 0;
                    foreach (DDTCDataMapping table in mapping)
                    {
                        if (shutDown)
                        {
                            return;
                        }
                        if (table.State == TBState.Delete)
                            continue;
                        if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null")
                            continue;
                        dgTableMapping.SelectedItem = table;
                        dgTableMapping.View.ScrollIntoView(dgTableMapping.SelectedItem);
                        System.Windows.Forms.Application.DoEvents();
                        table.State = TBState.BeingImport;
                        if (ImportData(table, pSourceWsAPI, pTargetWsAPI, ref message, ref errorMessage, ref FailImportLayerCount))
                        {
                            table.State = TBState.EndImport;
                            SuccessImportLayerCount++;
                            //已存在图层,仅仅加入数据即可;
                            //AddLayerToMap(pSourceWsAPI, zltcGroup, table);
                        }
                        else
                        {
                            table.State = TBState.Delete;
                            DeletedImportLayerCount++;
                        }
                    }
                    MapsManager.Instance.MapService.getAxMapControl().ActiveView.ContentsChanged();
                    MapsManager.Instance.MapService.getAxMapControl().ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground | esriViewDrawPhase.esriViewForeground |
        esriViewDrawPhase.esriViewGeography | esriViewDrawPhase.esriViewGeoSelection |
        esriViewDrawPhase.esriViewGraphics | esriViewDrawPhase.esriViewGraphicSelection, null, MapsManager.Instance.MapService.getAxMapControl().ActiveView.Extent);
                    MapsManager.Instance.MapService.getAxMapControl().Refresh();
                    Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "RefreshLayer" });
                    try
                    {
                        SaveProject();
                    }
                    catch (Exception ex)
                    {
                        LogAPI.Debug("添加图层到地图时发生异常:" + ex);
                    }
                    this.btnOK.IsEnabled = true;
                    if (!string.IsNullOrWhiteSpace(message))
                    {
                        message = message.Substring(0, message.Length - 1);
                        MessageHelper.ShowTips(message + "坐标系与工程坐标系不一致,无法导入!");
                    }
                    if (!string.IsNullOrWhiteSpace(errorMessage))
                    {
                        int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount;
                        errorMessage = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount,
                            DeletedImportLayerCount, FailImportLayerCount) + errorMessage;
                        MessageHelper.Show(errorMessage, true);
                    }
                    else
                    {
                        int TotalImportLayerCount = SuccessImportLayerCount + DeletedImportLayerCount + FailImportLayerCount;
                        message = string.Format("共导入{0}个图层,成功{1}个,删除{2}个,失败{3}个。", TotalImportLayerCount, SuccessImportLayerCount,
                            DeletedImportLayerCount, FailImportLayerCount) + message;
                        MessageHelper.Show(message, true);
                    }
                    //这里设置关闭
                    if (this.Close_FrmBaseDataLoad != null)
                    {
                        this.Close_FrmBaseDataLoad(null, null);
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex));
                MessageHelper.Show(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex));
            }
            finally
            {
                this.btnOK.IsEnabled = true;
                if (pSourceWsAPI != null)
                {
                    pSourceWsAPI.CloseWorkspace();
                }
                if (pTargetWsAPI != null)
                {
                    pTargetWsAPI.CloseWorkspace();
                }
                if (mapping != null && mapping.Count() > 0)
                {
                    mapping = null;
                }
            }
        }
        private bool ImportData(DDTCDataMapping pTbMaping, IWorkspaceAPI pSourceWsAPI, IWorkspaceAPI pTargetWsAPI, ref string message, ref string errorMessage, ref int FailImportLayerCount)
        {
            if (pSourceWsAPI == null || pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null)
                return false;
            IFeatureClassAPI t_FcAPI = null;
            ITableAPI t_TbAPI = null;
            IFeatureClassAPI s_FcAPI = null;
            ITableAPI s_TbAPI = null;
            EngineEditor editor = null;
            string currentFiled = string.Empty;
            try
            {
                if (pSourceWsAPI.CurrentWorkspace == null || pTargetWsAPI.CurrentWorkspace == null)
                    return false;
                if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName))
                {
                    if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                    {
                        editor = new EngineEditorClass();
                        if (editor.EditState != esriEngineEditState.esriEngineStateEditing)
                        {
                            editor.StartEditing(pTargetWsAPI.CurrentWorkspace, pMap);
                        }
                    }
                    if (pTbMaping.S_TableType.ToUpper() == "TABLE")
                    {
                        s_TbAPI = pSourceWsAPI.OpenTable(pTbMaping.S_TableName);
                    }
                    else
                    {
                        s_FcAPI = pSourceWsAPI.OpenFeatureClass(pTbMaping.S_TableName);
                    }
                    if (pTbMaping.T_TableName == "Add")
                    {
                        if (s_FcAPI != null)
                        {
                            IFields fields = null;
                            GeoDBAPI.CreateFields(s_FcAPI.FeatureClass.Fields, out fields);
                            IGeoDataset ds = s_FcAPI.FeatureClass as IGeoDataset;
                            if (fields != null && ds != null)
                            {
                                t_FcAPI = pTargetWsAPI.CreateFeatureClass(pTbMaping.S_TableName, ds.SpatialReference, fields);
                                pTbMaping.T_TableName = pTbMaping.S_TableName;
                                pTbMaping.T_TableType = pTbMaping.S_TableType;
                                SetDefaultFieldMapping(pTbMaping, pSourceWsAPI, pTargetWsAPI);
                            }
                        }
                        else if (s_TbAPI != null)
                        {
                            IFields fields = null;
                            GeoDBAPI.CreateFields(s_TbAPI.ITable.Fields, out fields);
                            IGeoDataset ds = s_FcAPI.FeatureClass as IGeoDataset;
                            if (fields != null && ds != null)
                            {
                                t_TbAPI = pTargetWsAPI.CreateTable(pTbMaping.S_TableName, fields);
                                pTbMaping.T_TableType = pTbMaping.S_TableType;
                                SetDefaultFieldMapping(pTbMaping, pSourceWsAPI, pTargetWsAPI);
                            }
                        }
                    }
                    else
                    {
                        if (pTbMaping.T_TableType.ToUpper() == "TABLE")
                        {
                            t_TbAPI = pTargetWsAPI.OpenTable(pTbMaping.T_TableName);
                        }
                        else
                        {
                            t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName);
                        }
                    }
                    //判断坐标参考是否一致
                    if (t_FcAPI != null && s_FcAPI != null &&
                       (t_FcAPI.FeatureClass as IGeoDataset) != null &&
                       (s_FcAPI.FeatureClass as IGeoDataset) != null)
                    {
                        bool isEqual = KGIS.Framework.AE.GeoDBAPI.SpatialReferenceCompare((t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (s_FcAPI.FeatureClass as IGeoDataset).SpatialReference);
                        if (!isEqual)
                        {
                            message += pTbMaping.S_TableAliasName + ",";
                            return false;
                        }
                    }
                    #region 如果替换已有数据,则将已有数据删除
                    if (cbReplace.IsChecked == true)
                    {
                        if (t_FcAPI != null && t_FcAPI.FeatureClass != null)
                        {
                            //优化代码,提高效率29s左右  王欢 2019-03-25
                            //(t_FcAPI.FeatureClass as ITable).DeleteSearchedRows(null);
                            IDataset pDataset = t_FcAPI.FeatureClass as IDataset;
                            pDataset.Workspace.ExecuteSQL("delete from " + pDataset.BrowseName);
                        }
                        else if (t_TbAPI != null && t_TbAPI.ITable != null)
                        {
                            t_TbAPI.ITable.DeleteSearchedRows(null);
                        }
                    }
                    #endregion
                    ICursor s_Cursor = null;
                    IQueryFilter queryFilter = new QueryFilterClass();
                    var counstwhere = false;
                    if (string.IsNullOrWhiteSpace(pTbMaping.S_YSDM_SQL) == false)
                    {
                        counstwhere = true;
                        queryFilter.WhereClause = pTbMaping.S_YSDM_SQL;
                    }
                    if (s_FcAPI != null)
                    {
                        s_Cursor = (ICursor)s_FcAPI.FeatureClass.Search(counstwhere ? queryFilter : null, true);//判断条件查询
                        int DataCount = s_FcAPI.FeatureClass.FeatureCount(null);
                        pTbMaping.Count = DataCount;
                    }
                    else
                    {
                        s_Cursor = s_TbAPI.ITable.Search(counstwhere ? queryFilter : null, true);//判断条件查询
                        int DataCount = s_TbAPI.ITable.RowCount(null);
                        pTbMaping.Count = DataCount;
                    }
                    int i = 0;
                    if (t_FcAPI != null && t_FcAPI.FeatureClass != null)
                    {
                        IFeature feature = null;
                        #region IFeatureClass
                        #region 新增字段
                        List addFieldIndexs = new List();
                        if (pTbMaping.FieldMapping != null)
                        {
                            List addFields = pTbMaping.FieldMapping.FindAll(f => f.T_FieldIndex == -2);
                            foreach (FieldMapping item in addFields)
                            {
                                IField f = s_FcAPI.FeatureClass.Fields.get_Field(item.S_FieldIndex);
                                if (t_FcAPI.FeatureClass.FindField(f.Name) > -1)
                                {
                                    t_FcAPI.AddField(f.Name + "_a", f.Type, f.AliasName);
                                    item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name + "_a");
                                }
                                else
                                {
                                    t_FcAPI.AddField(f.Name, f.Type, f.AliasName);
                                    item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name);
                                }
                                addFieldIndexs.Add(item.T_FieldIndex);
                            }
                        }
                        #endregion
                        IFeatureClass t_FC = t_FcAPI.FeatureClass;
                        IDataset pDataset = t_FC as IDataset;
                        IWorkspace pWs = pDataset.Workspace;
                        IWorkspaceEdit pWsEdit = pWs as IWorkspaceEdit;
                        //pWsEdit.StartEditing(true);
                        pWsEdit.StartEditOperation();
                        IFeatureCursor t_FeatureCursor = t_FC.Insert(true);
                        IFeatureBuffer newFeature = null;
                        while ((feature = (s_Cursor as IFeatureCursor).NextFeature()) != null)
                        {
                            using (ComReleaser comReleaser = new ComReleaser())
                            {
                                //if (newFeature == null)
                                newFeature = t_FC.CreateFeatureBuffer();
                                newFeature.Shape = feature.ShapeCopy;
                                if (pTbMaping.FieldMapping != null)
                                {
                                    foreach (FieldMapping item in pTbMaping.FieldMapping)
                                    {
                                        if (item.S_FieldIndex < 0 || item.T_FieldIndex < 0)
                                            continue;
                                        object val = feature.get_Value(item.S_FieldIndex);
                                        currentFiled = item.S_FieldName;
                                        bool canSetValue = false;
                                        switch (newFeature.Fields.get_Field(item.T_FieldIndex).Type)
                                        {
                                            case esriFieldType.esriFieldTypeSmallInteger:
                                                int intValue = 0;
                                                if (int.TryParse(val.ToString(), out intValue))
                                                {
                                                    canSetValue = true;
                                                    //修改人:高山  修改时间:2018.12.4   修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度
                                                    val = intValue;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeDouble:
                                                double doubleValue = 0;
                                                if (double.TryParse(val.ToString(), out doubleValue))
                                                {
                                                    canSetValue = true;
                                                    //修改人:高山  修改时间:2018.12.4   修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度
                                                    val = doubleValue;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeInteger:
                                                int integerValue = 0;
                                                if (int.TryParse(val.ToString(), out integerValue))
                                                {
                                                    canSetValue = true;
                                                    //修改人:高山  修改时间:2018.12.4   修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度
                                                    val = integerValue;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeDate:
                                                DateTime dateTimeValue;
                                                if (DateTime.TryParse(val.ToString(), out dateTimeValue))
                                                {
                                                    canSetValue = true;
                                                    //修改人:高山  修改时间:2018.12.4   修改原因:如果val不重新赋值,在入库后数据小数位数会变化,影响数据精度
                                                    val = dateTimeValue;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeString:
                                                canSetValue = true;
                                                if (string.IsNullOrWhiteSpace(val.ToString()))
                                                {
                                                    val = DBNull.Value;
                                                }
                                                break;
                                            default:
                                                canSetValue = true;
                                                break;
                                        }
                                        if (canSetValue)
                                        {
                                            if (val is int)
                                            {
                                                if ((int)val == 0)
                                                    continue;
                                            }
                                            if (val is double)
                                            {
                                                if ((currentFiled == "扣除地类系数" || currentFiled == "扣除地类面积") && (double)val == 0)//解决禅道问题 25839 扣除地类系数与扣除地类面积字段为0,导入表中也要为0
                                                {
                                                    newFeature.set_Value(item.T_FieldIndex, val);
                                                }
                                                else if ((double)val == 0)
                                                    continue;
                                            }
                                            newFeature.set_Value(item.T_FieldIndex, val);
                                        }
                                        else //20190123 周旺华 未处理数据直接赋为DBNull.Value
                                        {
                                            newFeature.set_Value(item.T_FieldIndex, DBNull.Value);
                                        }
                                    }
                                }
                                t_FeatureCursor.InsertFeature(newFeature);
                                comReleaser.ManageLifetime(feature);
                            }
                            i++;
                            if (i % 1000 == 0 || i == pTbMaping.Count)
                            {
                                pTbMaping.Progress = i;
                                System.Windows.Forms.Application.DoEvents();
                            }
                        }
                        if (newFeature != null)
                        {
                            t_FeatureCursor.Flush();
                            Marshal.ReleaseComObject(newFeature);
                        }
                        Marshal.ReleaseComObject(t_FeatureCursor);
                        pWsEdit.StopEditOperation();
                        #endregion
                    }
                    else if (t_TbAPI != null && t_TbAPI.ITable != null)
                    {
                        #region ITable
                        IRow s_Row = null;
                        ICursor t_Cursor = t_TbAPI.ITable.Insert(true);
                        IRowBuffer t_RowBuffer = null;
                        while ((s_Row = s_Cursor.NextRow()) != null)
                        {
                            using (ComReleaser comReleaser = new ComReleaser())
                            {
                                if (t_RowBuffer == null)
                                    t_RowBuffer = t_TbAPI.ITable.CreateRowBuffer();
                                foreach (FieldMapping item in pTbMaping.FieldMapping)
                                {
                                    if (item.S_FieldIndex < 0 || item.T_FieldIndex < 0)
                                    {
                                        continue;
                                    }
                                    t_RowBuffer.set_Value(item.T_FieldIndex, s_Row.get_Value(item.S_FieldIndex));
                                }
                                t_Cursor.InsertRow(t_RowBuffer);
                                ComReleaser.ReleaseCOMObject(s_Row);
                            }
                            i++;
                            if (i % 100 == 0 || i == pTbMaping.Count)
                            {
                                pTbMaping.Progress = i;
                                System.Windows.Forms.Application.DoEvents();
                            }
                        }
                        if (t_RowBuffer != null)
                        {
                            t_Cursor.Flush();
                            Marshal.ReleaseComObject(t_RowBuffer);
                        }
                        Marshal.ReleaseComObject(t_Cursor);
                        #endregion
                    }
                    Marshal.ReleaseComObject(s_Cursor);
                    return true;
                }
                return false;
            }
            catch (Exception ex)
            {
                if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                {
                    editor.AbortOperation();
                }
                FailImportLayerCount++;
                errorMessage += (pTbMaping.S_TableName + "表,字段" + currentFiled + "数据导入异常!" + ex.Message);
                return false;
            }
            finally
            {
                if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                {
                    editor.StopEditing(true);
                }
                if (t_TbAPI != null)
                    t_TbAPI.CloseTable();
                if (t_FcAPI != null)
                    t_FcAPI.CloseFeatureClass();
                if (s_TbAPI != null)
                    s_TbAPI.CloseTable();
                if (s_FcAPI != null)
                    s_FcAPI.CloseFeatureClass();
            }
        }
        private void AddLayerToMap(IWorkspaceAPI pSourceWsAPI, ILayer zltcGroup, DDTCDataMapping table)
        {
            try
            {
                if (pSourceWsAPI != null)
                {
                    bool displayLayer = true;
                    if (zltcGroup != null)
                    {
                        ICompositeLayer pComLayer = zltcGroup as ICompositeLayer;
                        for (int i = 0; i < pComLayer.Count; i++)
                        {
                            ILayer layer = pComLayer.Layer[i];
                            if ((layer as IDataset).BrowseName == table.S_TableName)
                            {
                                displayLayer = false;
                                continue;
                            }
                        }
                    }
                    IFeatureClassAPI s_FcAPI = pSourceWsAPI.OpenFeatureClass(table.S_TableName);
                    if (s_FcAPI != null && s_FcAPI.FeatureClass != null && displayLayer == true)
                    {
                        IFeatureLayer pTargetLayer = new FeatureLayer();
                        pTargetLayer.FeatureClass = s_FcAPI.FeatureClass;
                        pTargetLayer.Name = table.T_TableAliasName;
                        ILegendInfo pLegendInfo = pTargetLayer as ILegendInfo;
                        int legendGroupCount = pLegendInfo.LegendGroupCount;
                        ILegendGroup pLGroup;
                        for (int i = 0; i < legendGroupCount; i++)
                        {
                            pLGroup = pLegendInfo.get_LegendGroup(i);
                            pLGroup.Visible = false;
                        }
                        (zltcGroup as IGroupLayer).Add(pTargetLayer);
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("图层添加至mxd失败" + ex);
            }
        }
        #endregion
        #region 导入shp格式的数据
        public void ExeSHP()
        {
            IWorkspaceAPI pTargetWsAPI = null;
            this.btnOK.IsEnabled = false;
            try
            {
                string str = "1234567890";
                string t_GdbPath = pTargetGDBPath;
                if (string.IsNullOrWhiteSpace(t_GdbPath) || !Directory.Exists(t_GdbPath))
                {
                    MessageHelper.ShowTips("未找到当前工程数据库");
                    return;
                }
                if (t_GdbPath.ToLower().EndsWith(".gdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                }
                else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                {
                    pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                }
                List mapping = dgTableMapping.ItemsSource as List;
                if (mapping != null)
                {
                    //ILayer zltcGroups = MapsManager.Instance.MapService.GetGroupLayer("ZLCG");//获取增量图层组
                    //LayerCfg GroupLayerInfo = null;
                    //if (_DataCatalog != null)
                    //{
                    //    _DataCatalog.GetNodeByLayer(zltcGroups);
                    //    LayerCfg rootLayer = _DataCatalog.CurrentLayers as LayerCfg;
                    //    List AllLayers = rootLayer.GetAllItem();
                    //    GroupLayerInfo = AllLayers.FirstOrDefault(f => f.LayerName == "增量图层");
                    //}
                    //循环导入要素类
                    string message = string.Empty;
                    string erroeMessage = string.Empty;
                    foreach (DDTCDataMapping table in mapping)
                    {
                        //增加控制,以数字开头的图层不能追加到当前工程。对应bug11125
                        if (str.Contains(table.S_TableName.Substring(0, 1)) && table.T_TableName == "Add")
                        {
                            MessageHelper.ShowTips("以数字开头的图层不能追加到当前工程!");
                            return;
                        }
                        if (shutDown)
                        {
                            break;
                        }
                        if (table.State == TBState.Delete)
                            continue;
                        if (string.IsNullOrWhiteSpace(table.T_TableName) || table.T_TableName == "null")
                            continue;
                        dgTableMapping.SelectedItem = table;
                        dgTableMapping.View.ScrollIntoView(dgTableMapping.SelectedItem);
                        System.Windows.Forms.Application.DoEvents();
                        table.State = TBState.BeingImport;
                        if (ImportData(table, pTargetWsAPI, ref message, ref erroeMessage))
                        {
                            table.State = TBState.EndImport;
                            //当前的变更/增量数据中的单独图层都已经存在的,不需要重新添加,导入数据即可;
                            //AddShpLayerToMap(GroupLayerInfo, table, pTargetWsAPI);
                        }
                        else
                        {
                            table.State = TBState.Delete;
                        }
                    }
                    //目录刷新 展开 试图刷新 
                    //if (_DataCatalog != null)
                    //{
                    //    if (GroupLayerInfo.Layers.Count > 0)
                    //        GroupLayerInfo.Expanded = true;
                    //    _DataCatalog.UpdateTree();
                    //}
                    MapsManager.Instance.MapService.getAxMapControl().Refresh();
                    try
                    {
                        SaveProject();//保存加载的图斑
                    }
                    catch (Exception ex)
                    {
                        LogAPI.Debug("添加图层到地图时发生异常:" + ex);
                    }
                    this.btnOK.IsEnabled = true;
                    if (!string.IsNullOrWhiteSpace(message))
                    {
                        message = message.Substring(0, message.Length - 1);
                        MessageHelper.ShowTips(message + "坐标系与工程坐标系不一致,无法导入!");
                    }
                    if (!string.IsNullOrWhiteSpace(erroeMessage))
                    {
                        MessageHelper.ShowTips(erroeMessage);
                    }
                    if (string.IsNullOrWhiteSpace(message) && string.IsNullOrWhiteSpace(erroeMessage))
                    {
                        MessageHelper.ShowTips("导入完成!");
                    }
                    //这里设置关闭
                    this.Close_FrmBaseDataLoad?.Invoke(null, null);
                }
                else
                {
                    if (btnImportDataPath.EditValue == null)
                    {
                        MessageHelper.ShowTips("请先选择 Shape 数据源");
                    }
                    else
                    {
                        string s_MdbPath_T2 = btnImportDataPath.EditValue.ToString();
                        if (string.IsNullOrWhiteSpace(s_MdbPath_T2) == true)
                        {
                            MessageHelper.ShowTips("请先选择 Shape 数据源");
                        }
                        else
                        {
                            if (Directory.Exists(s_MdbPath_T2) == false)
                            {
                                MessageHelper.ShowTips("选择的 Shape 数据源不存在");
                                btnImportDataPath.EditValue = "";
                            }
                            else
                            {
                                //判断目录下有没有shape文件
                                string[] strFiles = Directory.GetFiles(s_MdbPath_T2);
                                int iFileDirs = strFiles.Count();
                                List ShapeFileNameList = strFiles.ToList();
                                if (ShapeFileNameList == null || ShapeFileNameList.Count <= 0)
                                {
                                    MessageHelper.ShowTips("Shape 数据源不能为空");
                                    btnImportDataPath.EditValue = "";
                                }
                                else
                                {
                                    bool bHaveShp = false;
                                    foreach (string strFile in strFiles)
                                    {
                                        if (strFile.ToLower().EndsWith(".shp") == true)
                                        {
                                            bHaveShp = true;
                                            break;
                                        }
                                    }
                                    if (bHaveShp == false)
                                    {
                                        MessageHelper.ShowTips("Shape 数据源不能为空");
                                        btnImportDataPath.EditValue = "";
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex));
                MessageHelper.Show(string.Format("导入{0}数据时失败,异常原因:{1}; ", ImportDataType, ex));
            }
            finally
            {
                this.btnOK.IsEnabled = true;
                if (pSourceFeatureClasses != null && pSourceFeatureClasses.Count > 0)
                {
                    using (ComReleaser com = new ComReleaser())
                    {
                        foreach (IFeatureClass item in pSourceFeatureClasses)
                        {
                            com.ManageLifetime(item);
                        }
                    }
                }
                if (pTargetWsAPI != null)
                {
                    pTargetWsAPI.CloseWorkspace();
                }
            }
        }
        private bool ImportData(DDTCDataMapping pTbMaping, IWorkspaceAPI pTargetWsAPI, ref string message, ref string erroeMessage)
        {
            if (pSourceFeatureClasses == null || pTargetWsAPI == null || pTargetWsAPI.CurrentWorkspace == null)
                return false;
            IFeatureClassAPI t_FcAPI = null;
            IFeatureClass pSourceFeatureClass = null;
            EngineEditor editor = null;
            string currentFiled = string.Empty;
            try
            {
                if (pTargetWsAPI.CurrentWorkspace == null)
                    return false;
                if (!string.IsNullOrWhiteSpace(pTbMaping.S_TableName) && !string.IsNullOrWhiteSpace(pTbMaping.T_TableName))
                {
                    if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                    {
                        editor = new EngineEditorClass();
                        if (editor.EditState != esriEngineEditState.esriEngineStateEditing)
                        {
                            editor.StartEditing(pTargetWsAPI.CurrentWorkspace, pMap);
                        }
                    }
                    pSourceFeatureClass = pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(pTbMaping.S_TableName) || p.AliasName.Equals(pTbMaping.S_TableName)).Single();
                    if (pSourceFeatureClass == null)
                    {
                        return false;
                    }
                    if (pTbMaping.T_TableName == "Add")
                    {
                        IFields fields = null;
                        GeoDBAPI.CreateFields(pSourceFeatureClass.Fields, out fields);
                        IGeoDataset ds = pSourceFeatureClass as IGeoDataset;
                        if (fields != null && ds != null)
                        {
                            t_FcAPI = pTargetWsAPI.CreateFeatureClass(pTbMaping.S_TableName, ds.SpatialReference, fields);
                            pTbMaping.T_TableName = pTbMaping.S_TableName;
                            pTbMaping.T_TableType = pTbMaping.S_TableType;
                            SetShapeDefaultFieldMapping(pTbMaping, pTargetWsAPI);
                        }
                    }
                    else
                    {
                        t_FcAPI = pTargetWsAPI.OpenFeatureClass(pTbMaping.T_TableName);
                    }
                    //判断坐标参考是否一致
                    if (t_FcAPI != null && (t_FcAPI.FeatureClass as IGeoDataset) != null && (pSourceFeatureClass as IGeoDataset) != null)
                    {
                        //bool isEqual = GeoDBAPI.SpatialReferenceCompare((t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (pSourceFeatureClass as IGeoDataset).SpatialReference);
                        if (!GeoDBAPI.SpatialReferenceCompare((t_FcAPI.FeatureClass as IGeoDataset).SpatialReference, (pSourceFeatureClass as IGeoDataset).SpatialReference))
                        {
                            message += pTbMaping.S_TableAliasName + ",";
                            return false;
                        }
                    }
                    #region 如果替换已有数据,则将已有数据删除
                    if (cbReplace.IsChecked == true && t_FcAPI != null && t_FcAPI.FeatureClass != null)
                    {
                        (t_FcAPI.FeatureClass as ITable).DeleteSearchedRows(null);
                    }
                    #endregion
                    ICursor s_Cursor = null;
                    s_Cursor = (ICursor)pSourceFeatureClass.Search(null, true);
                    int DataCount = pSourceFeatureClass.FeatureCount(null);
                    pTbMaping.Count = DataCount;
                    int i = 0;
                    if (t_FcAPI != null && t_FcAPI.FeatureClass != null)
                    {
                        IFeature feature = null;
                        #region IFeatureClass
                        #region 新增字段
                        List addFieldIndexs = new List();
                        if (pTbMaping.FieldMapping != null)
                        {
                            List addFields = pTbMaping.FieldMapping.FindAll(f => f.T_FieldIndex == -2);
                            foreach (FieldMapping item in addFields)
                            {
                                IField f = pSourceFeatureClass.Fields.get_Field(item.S_FieldIndex);
                                if (t_FcAPI.FeatureClass.FindField(f.Name) > -1)
                                {
                                    t_FcAPI.AddField(f.Name + "_a", f.Type, f.AliasName);
                                    item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name + "_a");
                                }
                                else
                                {
                                    t_FcAPI.AddField(f.Name, f.Type, f.AliasName);
                                    item.T_FieldIndex = t_FcAPI.FeatureClass.Fields.FindField(f.Name);
                                }
                                addFieldIndexs.Add(item.T_FieldIndex);
                            }
                        }
                        #endregion
                        IFeatureClass t_FC = t_FcAPI.FeatureClass;
                        IFeatureCursor t_FeatureCursor = t_FC.Insert(true);
                        IFeatureBuffer newFeature = null;
                        while ((feature = (s_Cursor as IFeatureCursor).NextFeature()) != null)
                        {
                            using (ComReleaser comReleaser = new ComReleaser())
                            {
                                if (newFeature == null)
                                    newFeature = t_FC.CreateFeatureBuffer();
                                newFeature.Shape = feature.ShapeCopy;
                                if (pTbMaping.FieldMapping != null)
                                {
                                    foreach (FieldMapping item in pTbMaping.FieldMapping)
                                    {
                                        if (item.S_FieldIndex < 0 || item.T_FieldIndex < 0)
                                            continue;
                                        object val = feature.get_Value(item.S_FieldIndex);
                                        currentFiled = item.S_FieldName;
                                        bool canSetValue = false;
                                        switch (newFeature.Fields.get_Field(item.T_FieldIndex).Type)
                                        {
                                            case esriFieldType.esriFieldTypeSmallInteger:
                                                int intValue = 0;
                                                if (int.TryParse(val.ToString(), out intValue))
                                                {
                                                    canSetValue = true;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeDouble:
                                                double doubleValue = 0;
                                                if (double.TryParse(val.ToString(), out doubleValue))
                                                {
                                                    canSetValue = true;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeInteger:
                                                int integerValue = 0;
                                                if (int.TryParse(val.ToString(), out integerValue))
                                                {
                                                    canSetValue = true;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeDate:
                                                DateTime dateTimeValue;
                                                if (DateTime.TryParse(val.ToString(), out dateTimeValue))
                                                {
                                                    canSetValue = true;
                                                }
                                                break;
                                            case esriFieldType.esriFieldTypeString:
                                                canSetValue = true;
                                                if (string.IsNullOrWhiteSpace(val.ToString()))
                                                {
                                                    val = DBNull.Value;
                                                }
                                                break;
                                            default:
                                                canSetValue = true;
                                                break;
                                        }
                                        if (canSetValue)
                                        {
                                            newFeature.set_Value(item.T_FieldIndex, val);
                                        }
                                        else
                                        {
                                            newFeature.set_Value(item.T_FieldIndex, null);
                                        }
                                    }
                                }
                                t_FeatureCursor.InsertFeature(newFeature);
                                comReleaser.ManageLifetime(feature);
                            }
                            i++;
                            if (i % 100 == 0 || i == pTbMaping.Count)
                            {
                                pTbMaping.Progress = i;
                                System.Windows.Forms.Application.DoEvents();
                            }
                        }
                        if (newFeature != null)
                        {
                            t_FeatureCursor.Flush();
                            Marshal.ReleaseComObject(newFeature);
                        }
                        Marshal.ReleaseComObject(t_FeatureCursor);
                        #endregion
                    }
                    Marshal.ReleaseComObject(s_Cursor);
                    if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                    {
                        editor.StopEditing(true);
                    }
                    return true;
                }
                return false;
            }
            catch (Exception ex)
            {
                if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                {
                    editor.AbortOperation();
                }
                erroeMessage += (pTbMaping.S_TableName + "表,字段" + currentFiled + "数据导入异常!" + ex.Message);
                return false;
            }
            finally
            {
                if (pTargetWsAPI.CurrentWorkspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
                {
                    editor.StopEditing(true);
                }
                if (t_FcAPI != null)
                    t_FcAPI.CloseFeatureClass();
            }
        }
        private void AddShpLayerToMap(LayerCfg zltcGroup, DDTCDataMapping table, IWorkspaceAPI pTargetWsAPI)
        {
            try
            {
                if (pSourceFeatureClasses != null && pSourceFeatureClasses.Count != 0)
                {
                    bool displayLayer = true;
                    if (zltcGroup != null)
                    {
                        foreach (LayerCfg item in zltcGroup.Layers)
                        {
                            if (item.FcName == table.S_TableName)
                            {
                                displayLayer = false;//已存在不添加;
                                break;
                            }
                        }
                    }
                    //
                    IFeatureClass pSourceFeatureClass = pSourceFeatureClasses.Where(p => (p as FeatureClass).Name.Equals(table.S_TableName) || p.AliasName.Equals(table.S_TableName)).Single();
                    //IFeatureClassAPI pSourceFeatureClass = pTargetWsAPI.OpenFeatureClass(table.T_TableName);
                    if (pSourceFeatureClass != null && displayLayer == true)
                    {
                        IFeatureLayer pTargetLayer = new FeatureLayer
                        {
                            FeatureClass = pSourceFeatureClass,
                            Name = table.T_TableAliasName
                        };
                        ILegendInfo pLegendInfo = pTargetLayer as ILegendInfo;
                        int legendGroupCount = pLegendInfo.LegendGroupCount;
                        ILegendGroup pLGroup;
                        for (int i = 0; i < legendGroupCount; i++)
                        {
                            pLGroup = pLegendInfo.get_LegendGroup(i);
                            pLGroup.Visible = false;
                        }
                        _DataCatalog.AddLayer(pTargetLayer, zltcGroup);
                    }
                }
            }
            catch (Exception ex)
            {
                LogAPI.Debug("图层添加至图层目录失败" + ex.Message);
            }
        }
        #endregion
        private void SaveProject()
        {
            try
            {
                Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProject" });
            }
            catch (Exception ex)
            {
                LogAPI.Debug("添加图层到地图时发生异常,异常信息如下:");
                LogAPI.Debug(ex);
            }
        }
        public void SetDefaultFieldMapping(DDTCDataMapping tbMapping, IWorkspaceAPI pSourceWsAPI, IWorkspaceAPI pTargetWsAPI)
        {
            if (tbMapping.T_TableName == "Add")
            {
                return;
            }
            if (pSourceWsAPI == null)
            {
                string s_MdbPath = null;
                if (ImportDataType == "VCT")
                {
                    s_MdbPath = SourceMDBPath;
                }
                else
                {
                    s_MdbPath = btnImportDataPath.EditValue.ToString();
                }
                if (ImportDataType == "MDB" || ImportDataType == "VCT")
                {
                    pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.MDBFile);
                }
                else
                {
                    pSourceWsAPI = new WorkspaceAPI(s_MdbPath, WorkspaceTypeEnum.GDBFile);
                }
            }
            if (pTargetWsAPI == null)
            {
                IFeatureClass pFeatureClass = null;
                if (pFeatureClass == null)
                {
                    string t_GdbPath = pTargetGDBPath;
                    if (t_GdbPath.ToLower().EndsWith(".gdb"))
                    {
                        pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.GDBFile);
                    }
                    else if (t_GdbPath.ToLower().EndsWith(".mdb"))
                    {
                        pTargetWsAPI = new WorkspaceAPI(t_GdbPath, WorkspaceTypeEnum.MDBFile);
                    }
                }
                else
                {
                    pTargetWsAPI = new WorkspaceAPI((pFeatureClass as FeatureClass).Workspace);
                }
            }
            IFeatureClassAPI t_FcAPI = null;
            ITableAPI t_TBAPI = null;
            IFeatureClassAPI s_FcAPI = null;
            ITableAPI s_TBAPI = null;
            try
            {
                if (!string.IsNullOrWhiteSpace(tbMapping.S_TableName) && !string.IsNullOrWhiteSpace(tbMapping.T_TableName) && !tbMapping.T_TableName.ToUpper().Equals("NULL"))
                {
                    if (tbMapping.T_TableType.ToUpper() == "TABLE")
                    {
                        t_TBAPI = pTargetWsAPI.OpenTable(tbMapping.T_TableName);
                    }
                    else
                    {
                        t_FcAPI = pTargetWsAPI.OpenFeatureClass(tbMapping.T_TableName);
                    }
                    if (tbMapping.S_TableType.ToUpper() == "TABLE")
                    {
                        s_TBAPI = pTargetWsAPI.OpenTable(tbMapping.S_TableName);
                    }
                    else
                    {
                        s_FcAPI = pSourceWsAPI.OpenFeatureClass(tbMapping.S_TableName);
                    }
                    List dicData = new List();
                    dicData.Add(new DataDicTionary() { DisplayName = "Null", NAME = "Null", CODE = "-1", REMARK = "" });
                    dicData.Add(new DataDicTionary() { DisplayName = "追加字段", NAME = "Add", CODE = "-2", REMARK = "" });
                    if (t_FcAPI != null)
                    {
                        for (int i = 0; i < t_FcAPI.FeatureClass.Fields.FieldCount; i++)
                        {
                            IField field = t_FcAPI.FeatureClass.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() });
                        }
                    }
                    else if (t_TBAPI != null)
                    {
                        for (int i = 0; i < t_TBAPI.ITable.Fields.FieldCount; i++)
                        {
                            IField field = t_TBAPI.ITable.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            dicData.Add(new DataDicTionary() { DisplayName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName, NAME = field.Name, CODE = i.ToString(), REMARK = field.Type.ToString() });
                        }
                    }
                    if (s_FcAPI != null && s_FcAPI.FeatureClass != null)
                    {
                        List data = new List();
                        for (int i = 0; i < s_FcAPI.FeatureClass.Fields.FieldCount; i++)
                        {
                            IField field = s_FcAPI.FeatureClass.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            FieldMapping item = new FieldMapping();
                            item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName;
                            item.S_FieldIndex = i;
                            DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName));//&& f.REMARK == field.Type.ToString()
                            if (dic != null)
                            {
                                item.T_FieldName = dic.DisplayName;
                                item.T_FieldIndex = Convert.ToInt16(dic.CODE);
                            }
                            else
                            {
                                item.T_FieldIndex = -1;
                            }
                            //item.PropertyType = enumPropertyType.ComboBox;
                            item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.REMARK.Contains("Double") || f.REMARK.Contains("Integer") || f.CODE == "-1" || f.CODE == "-2");
                            data.Add(item);
                        }
                        tbMapping.FieldMapping = data;
                    }
                    else if (s_TBAPI != null && s_TBAPI.ITable != null)
                    {
                        List data = new List();
                        for (int i = 0; i < s_TBAPI.ITable.Fields.FieldCount; i++)
                        {
                            IField field = s_TBAPI.ITable.Fields.get_Field(i);
                            if (!field.Editable || field.Name.ToUpper() == "SHAPE")
                                continue;
                            FieldMapping item = new FieldMapping();
                            item.S_FieldName = string.IsNullOrWhiteSpace(field.AliasName) ? field.Name : field.AliasName;
                            item.S_FieldIndex = i;
                            DataDicTionary dic = dicData.FirstOrDefault(f => (f.NAME == field.Name || f.DisplayName == field.Name || f.NAME == field.AliasName || f.DisplayName == field.AliasName));//&& f.REMARK == field.Type.ToString()
                            if (dic != null)
                            {
                                item.T_FieldName = dic.DisplayName;
                                item.T_FieldIndex = Convert.ToInt16(dic.CODE);
                            }
                            else
                            {
                                item.T_FieldIndex = -1;
                            }
                            //item.PropertyType = enumPropertyType.ComboBox;
                            item.FieldList = dicData.FindAll(f => f.REMARK == field.Type.ToString() || f.CODE == "-1" || f.CODE == "-2");
                            data.Add(item);
                        }
                        tbMapping.FieldMapping = data;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageHelper.ShowTips("操作异常!" + ex.Message);
                LogAPI.Debug(ex);
            }
        }
        private void DgTableMapping_SelectedItemChanged(object sender, DevExpress.Xpf.Grid.SelectedItemChangedEventArgs e)
        {
            if (e.NewItem is TableMapping)
            {
                if ((e.NewItem as TableMapping).T_TableName == null || (e.NewItem as TableMapping).T_TableName.ToUpper().Equals("NULL"))
                {
                    dgFieldMapping.ItemsSource = null;
                }
                else
                {
                    dgFieldMapping.ItemsSource = (e.NewItem as TableMapping).FieldMapping;
                }
            }
        }
        /// 
        /// 取消
        /// 
        /// 
        /// 
        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        private void chkSelectedAll_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
        {
            try
            {
                if (this.dgTableMapping == null || (dgTableMapping.ItemsSource as List) == null)
                {
                    return;
                }
                List listTableMapping = (dgTableMapping.ItemsSource as List);
                bool check = (sender as DevExpress.Xpf.Editors.CheckEdit).IsChecked == null ? false : bool.Parse((sender as DevExpress.Xpf.Editors.CheckEdit).IsChecked.Value.ToString());
                if (check)
                {
                    listTableMapping.ForEach(x => x.State = TBState.Waiting);
                }
                else
                {
                    listTableMapping.ForEach(x => x.State = TBState.Delete);
                }
                dgTableMapping.RefreshData();
            }
            catch (Exception ex)
            {
                MessageHelper.ShowTips("全选发生异常:" + ex.Message);
            }
        }
        private void CheckBox_Click(object sender, RoutedEventArgs e)
        {
            DDTCDataMapping tbm = dgTableMapping.SelectedItem as DDTCDataMapping;
            if (tbm != null)
            {
                switch (tbm.State)
                {
                    case TBState.Waiting:
                        tbm.State = TBState.Delete;
                        break;
                    case TBState.Delete:
                        tbm.State = TBState.Waiting;
                        break;
                    case TBState.BeingImport:
                        break;
                    case TBState.EndImport:
                        break;
                    default:
                        break;
                }
                dgTableMapping.RefreshData();
            }
        }
        /// 
        /// 根据TableName获取表
        /// 
        /// 
        public static RuleTableEntity GetRuleTableEntityByTableName(string tableName)
        {
            RuleTableEntity ruleTableEntity = null;
            try
            {
                XmlDocument doc = new XmlDocument();
                string strPath = KGIS.Framework.Utils.SysAppPath.GetDataCheckTableMappingConfigPath();
                doc.Load(strPath);
                if (doc != null)
                {
                    #region 获取规则检查TableMapping
                    XmlNodeList nodeTableMappingList = doc.SelectNodes("CheckTableMapping");
                    if (nodeTableMappingList != null && nodeTableMappingList.Count > 0)
                    {
                        foreach (XmlNode checkTableNode in nodeTableMappingList)
                        {
                            foreach (XmlNode tableNode in checkTableNode.ChildNodes)
                            {
                                if (tableNode.Attributes["TableName"] != null && tableNode.Attributes["TableName"].Value.Trim().Replace(" ", "") != tableName)
                                {
                                    continue;
                                }
                                RuleTableEntity pRuleTableEntity = new RuleTableEntity();
                                pRuleTableEntity.Columns = new List();
                                pRuleTableEntity.TableName = tableNode.Attributes["TableName"].Value;
                                if (tableNode.Attributes["Name"] != null)
                                {
                                    pRuleTableEntity.TableAliasName = tableNode.Attributes["Name"].Value.Trim().Replace(" ", "");
                                }
                                if (tableNode.Attributes["Type"] != null)
                                {
                                    pRuleTableEntity.Type = tableNode.Attributes["Type"].Value.Trim().Replace(" ", "");
                                }
                                if (tableNode.Attributes["YSDM"] != null)
                                {
                                    pRuleTableEntity.YSDM = tableNode.Attributes["YSDM"].Value.Trim().Replace(" ", "");
                                }
                                if (tableNode.Attributes["CDM"] != null)
                                {
                                    pRuleTableEntity.CDM = tableNode.Attributes["CDM"].Value;
                                }
                                if (tableNode.Attributes["IsNecessary"] != null)
                                {
                                    bool b = false;
                                    if (bool.TryParse(tableNode.Attributes["IsNecessary"].Value, out b))
                                    {
                                    }
                                    pRuleTableEntity.IsNecessary = b;
                                }
                                foreach (XmlNode columnNode in tableNode.ChildNodes)
                                {
                                    RuleColumnEntity pRuleColumnEntity = new RuleColumnEntity();
                                    if (columnNode.Attributes["Name"] != null)
                                    {
                                        pRuleColumnEntity.ColumnName = columnNode.Attributes["Name"].Value.Trim().Replace(" ", "");
                                    }
                                    if (columnNode.Attributes["AliasName"] != null)
                                    {
                                        pRuleColumnEntity.AliasName = columnNode.Attributes["AliasName"].Value.Trim().Replace(" ", "");
                                    }
                                    if (columnNode.Attributes["Range"] != null)
                                    {
                                        pRuleColumnEntity.Range = columnNode.Attributes["Range"].Value.Trim().Replace(" ", "");
                                    }
                                    if (columnNode.Attributes["ToolTip"] != null)
                                    {
                                        pRuleColumnEntity.ToolTip = columnNode.Attributes["ToolTip"].Value.Trim().Replace(" ", "");
                                    }
                                    if (columnNode.Attributes["Pic"] != null)
                                    {
                                        pRuleColumnEntity.Pic = columnNode.Attributes["Pic"].Value.Trim().Replace(" ", "");
                                    }
                                    pRuleColumnEntity.AllowDBNull = false;
                                    //字段是否可为空:如果未配置则默认为false:标识当前字段为必填项,不可为空
                                    if (columnNode.Attributes["AllowDBNull"] != null)
                                    {
                                        bool b = false;
                                        if (bool.TryParse(columnNode.Attributes["AllowDBNull"].Value, out b))
                                        {
                                        }
                                        pRuleColumnEntity.AllowDBNull = b;
                                    }
                                    pRuleColumnEntity.IsUnique = false;
                                    //字段值是否必须唯一:如果未配置则默认为false:表示当前字段不是必须唯一,可重复
                                    if (columnNode.Attributes["IsUnique"] != null)
                                    {
                                        bool b = false;
                                        if (bool.TryParse(columnNode.Attributes["IsUnique"].Value, out b))
                                        {
                                        }
                                        pRuleColumnEntity.IsUnique = b;
                                    }
                                    if (columnNode.Attributes["DataType"] != null)
                                    {
                                        pRuleColumnEntity.DataType = columnNode.Attributes["DataType"].Value.Trim().Replace(" ", "").ToLower();
                                    }
                                    pRuleColumnEntity.IllegalityCheck = true;
                                    //如果不是字符串类型的字段则不检查
                                    //字段值非法字符检查:如果未配置则默认为false:表示需要检查非法字符
                                    if (pRuleColumnEntity.DataType != "esriFieldTypeString")
                                    {
                                        pRuleColumnEntity.IllegalityCheck = false;
                                    }
                                    else
                                    {
                                        pRuleColumnEntity.IllegalityCheck = true;
                                    }
                                    if (columnNode.Attributes["IllegalityNotCheck"] != null)
                                    {
                                        bool b = false;
                                        if (bool.TryParse(columnNode.Attributes["IllegalityNotCheck"].Value, out b))
                                        {
                                        }
                                        pRuleColumnEntity.IllegalityCheck = b;
                                    }
                                    int max = 0;
                                    if (columnNode.Attributes["MaxLength"] != null && int.TryParse(columnNode.Attributes["MaxLength"].Value, out max))
                                    {
                                    }
                                    pRuleColumnEntity.MaxLength = max;
                                    if (columnNode.Attributes["Precision"] != null)
                                    {
                                        int precision = 0;
                                        if (int.TryParse(columnNode.Attributes["Precision"].Value, out precision))
                                        {
                                        }
                                        pRuleColumnEntity.Precision = precision;
                                    }
                                    if (columnNode.Attributes["Dic"] != null)
                                    {
                                        pRuleColumnEntity.DIC = columnNode.Attributes["Dic"].Value.Trim().Replace(" ", "");
                                    }
                                    pRuleColumnEntity.IsEllipsoidArea = false;
                                    if (columnNode.Attributes["IsEllipsoidArea"] != null)
                                    {
                                        bool b = false;
                                        if (bool.TryParse(columnNode.Attributes["IsEllipsoidArea"].Value, out b))
                                        {
                                        }
                                        pRuleColumnEntity.IsEllipsoidArea = b;
                                    }
                                    pRuleColumnEntity.ExtendField = false;
                                    if (columnNode.Attributes["ExtendField"] != null)
                                    {
                                        bool b = false;
                                        if (bool.TryParse(columnNode.Attributes["ExtendField"].Value, out b))
                                        {
                                        }
                                        pRuleColumnEntity.ExtendField = b;
                                    }
                                    pRuleTableEntity.Columns.Add(pRuleColumnEntity);
                                }
                                ruleTableEntity = pRuleTableEntity;
                            }
                        }
                    }
                    #endregion
                }
                if (ruleTableEntity == null)
                {
                    throw new Exception("未找到" + tableName + "表配置");
                }
                return ruleTableEntity;
            }
            catch (Exception ex)
            {
                LogAPI.Debug("根据TableName获取表 时异常,异常信息如下:");
                LogAPI.Debug(ex);
                LogAPI.Debug("根据TableName获取表 时异常信息结束");
                throw new Exception("获取表结构异常:" + ex.Message);
            }
        }
        /// 
        /// 表映射关系
        /// 
        public class DDTCDataMapping : INotifyPropertyChanged
        {
            /// 
            /// 源数据表名
            /// 
            public string S_TableName { get; set; }
            /// 
            /// 源数据表名
            /// 
            public string S_TableAliasName { get; set; }
            /// 
            /// 数据源表类型
            /// 
            public string S_TableType { get; set; }
            /// 
            /// 坐标系
            /// 
            public string S_Spatial { get; set; }
            ///// 
            ///// 数据源要素类型
            ///// 
            //public string S_ShapeType { get; set; }
            ///// 
            ///// 目标要素类型
            ///// 
            //public string T_ShapeType { get; set; }
            private string _T_TableName;
            /// 
            /// 目标数据表名
            /// 
            public string T_TableName
            {
                get { return _T_TableName; }
                set
                {
                    _T_TableName = value;
                    if (PropertyChanged2 != null)
                    {
                        PropertyChanged2(this, new PropertyChangedEventArgs("T_TableName"));
                    }
                }
            }
            /// 
            /// 目标数据表名
            /// 
            public string T_TableAliasName { get; set; }
            /// 
            /// 目标表类型
            /// 
            public string T_TableType { get; set; }
            /// 
            /// 条件sql语句
            /// 
            private string _S_YSDM_SQL;
            public string S_YSDM_SQL
            {
                get
                {
                    return _S_YSDM_SQL;
                }
                set
                {
                    _S_YSDM_SQL = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("S_YSDM_SQL"));
                    }
                }
            }
            private List _FieldMapping;
            /// 
            /// 字段映射信息
            /// 
            public List FieldMapping
            {
                get { return _FieldMapping; }
                set
                {
                    _FieldMapping = value;
                    int count = _FieldMapping.FindAll(f => f.S_FieldIndex == -1).Count;
                    if (count == 0)
                    {
                        FieldMappingMsg = "所有字段已匹配";
                    }
                    else
                    {
                        FieldMappingMsg = string.Format("{0} 个字段未匹配", count);
                    }
                }
            }
            /// 
            /// 目标数据表值域
            /// 
            public List T_TableList { get; set; }
            private string _FieldMappingMsg;
            public string FieldMappingMsg
            {
                get
                {
                    return _FieldMappingMsg;
                }
                set
                {
                    _FieldMappingMsg = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("FieldMappingMsg"));
                    }
                }
            }
            #region
            private TBState _State;
            public TBState State
            {
                get { return _State; }
                set
                {
                    _State = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("State"));
                    }
                }
            }
            private int _Count;
            /// 
            /// 总进度
            /// 
            public int Count
            {
                get
                {
                    return _Count;
                }
                set
                {
                    _Count = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Count"));
                    }
                }
            }
            private int _Progress;
            /// 
            /// 当前进度
            /// 
            public int Progress
            {
                get
                {
                    return _Progress;
                }
                set
                {
                    _Progress = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Progress"));
                    }
                }
            }
            #endregion
            public event PropertyChangedEventHandler PropertyChanged;
            public event PropertyChangedEventHandler PropertyChanged2;
        }
    }
}