UpdateDomain.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using ESRI.ArcGIS.Geodatabase;
  6. using ForeStar.Core.Context;
  7. using ForeStar.Core.Context.Support;
  8. using ForeStar.DataUI;
  9. using ForeStar.Core.Stereotype;
  10. namespace ForeStar.GIS.ArcGIS.Util
  11. {
  12. /// <summary>
  13. /// 更新字典域
  14. /// </summary>
  15. [Component(IsSingleton = "false", Name = "IUpdateDomain")]
  16. public class UpdateDomain : IUpdateDomain
  17. {
  18. /// <summary>
  19. /// 从结构同步字典域
  20. /// </summary>
  21. /// <param name="pTable"></param>
  22. /// <returns></returns>
  23. public bool SynchorDomainFormStructure(ForeStar.Data.General.ITable pTable)
  24. {
  25. if (pTable == null) return false;
  26. if (pTable.MetadataTable == null) return false;
  27. ForeStar.GIS.SpatialDatabase.IFeatureClass pFsFeatureClass = pTable as ForeStar.GIS.SpatialDatabase.IFeatureClass;
  28. IWorkspace pEsriWorkspace = pFsFeatureClass.Workspace.InnerObject as IWorkspace;
  29. ForeStar.Data.Metadata.MetadataField pMetadataField = null;
  30. ESRI.ArcGIS.Geodatabase.IWorkspaceDomains2 pWorkspaceDomains = pEsriWorkspace as ESRI.ArcGIS.Geodatabase.IWorkspaceDomains2;
  31. ESRI.ArcGIS.Geodatabase.IFeatureClass pEsriFeatureClass = pFsFeatureClass.InnerObject as ESRI.ArcGIS.Geodatabase.IFeatureClass;
  32. IClassSchemaEdit pClassSchemaEdit = (IClassSchemaEdit)pEsriFeatureClass;
  33. foreach (ForeStar.Data.General.Field pField in pTable.Fields)
  34. {
  35. pMetadataField = pTable.MetadataTable.GetField(pField.FieldName);
  36. if (pMetadataField.IsCode)
  37. {
  38. string strCodeWhere = GetCodeWhere(pMetadataField.CodeTableWhere);
  39. //先删除字典域
  40. DeleteDomain(pEsriWorkspace, strCodeWhere);
  41. //添加
  42. Dictionary<string, string> pDicDomain = pMetadataField.Domain;
  43. ICodedValueDomain pCodeValueDomain = new CodedValueDomainClass();
  44. foreach (KeyValuePair<string, string> pTemp in pDicDomain)
  45. {
  46. IDomain pDomain = pWorkspaceDomains.get_DomainByName(strCodeWhere);
  47. pCodeValueDomain.AddCode(pTemp.Key, pTemp.Value);
  48. }
  49. IDomain pNewDomain = pCodeValueDomain as IDomain;
  50. pNewDomain.Name = strCodeWhere;
  51. pNewDomain.FieldType = esriFieldType.esriFieldTypeString;
  52. pNewDomain.SplitPolicy = esriSplitPolicyType.esriSPTDuplicate;
  53. pNewDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
  54. pWorkspaceDomains.AddDomain(pNewDomain);
  55. pClassSchemaEdit.AlterDomain(pField.FieldName, pNewDomain);
  56. }
  57. }
  58. return true;
  59. }
  60. /// <summary>
  61. /// 删除字典域名
  62. /// </summary>
  63. /// <param name="strDomainName"></param>
  64. private void DeleteDomain(IWorkspace pWorkspace, string strDomainName)
  65. {
  66. IWorkspaceDomains pWorkspaceDomains = pWorkspace as IWorkspaceDomains;
  67. if (pWorkspaceDomains.get_DomainByName(strDomainName) != null)
  68. {
  69. if (pWorkspaceDomains.get_CanDeleteDomain(strDomainName))
  70. {
  71. pWorkspaceDomains.DeleteDomain(strDomainName);
  72. }
  73. }
  74. }
  75. /// <summary>
  76. /// 获得字典域值
  77. /// </summary>
  78. /// <param name="strCodeTableWhere"></param>
  79. /// <returns></returns>
  80. private string GetCodeWhere(string strCodeTableWhere)
  81. {
  82. string strResult = null;
  83. if (strCodeTableWhere.Contains('\''))
  84. {
  85. int istartIndex = strCodeTableWhere.IndexOf('\'');
  86. int iFinishIndex = -1;
  87. for (int i = istartIndex + 1; i < strCodeTableWhere.Length; i++)
  88. {
  89. if (strCodeTableWhere.Substring(i, 1) == "'")
  90. {
  91. iFinishIndex = i;
  92. break;
  93. }
  94. }
  95. if (iFinishIndex < istartIndex)
  96. {
  97. strResult = strCodeTableWhere.Substring(istartIndex + 1);
  98. }
  99. else
  100. {
  101. strResult = strCodeTableWhere.Substring(istartIndex + 1, iFinishIndex - istartIndex - 1);
  102. }
  103. }
  104. return strResult;
  105. }
  106. }
  107. }