テーブル結合時の参照先付け替え – 2 –


良く考えてみたが
汎用的に作ろうとするとカラム数変化なしとしてカラムの対応表作って旧名称が含まれそうなパラメータを片っ端から置換すれば良さそう。

IUniqueValueRendererのFiled
ILabelEngineLayerPropertiesのExpression
やらフィルタ関連のカラム指定名の含まれそうな所をかたっぱしから置換

理論上は…面倒だから取り敢えず対応表を作るところで止めとこ。

using (ComReleaser com = new ComReleaser())
{
  UID uid = new UIDClass();
  com.ManageLifetime(uid);
  uid.Value = "{" + typeof(IGeoFeatureLayer).GUID.ToString() + "}";

  IEnumLayer srcEnumLayer = src.get_Layers(uid, true);
  com.ManageLifetime(srcEnumLayer);
  srcEnumLayer.Reset();

  IEnumLayer dstEnumLayer = dst.get_Layers(uid, true);
  com.ManageLifetime(dstEnumLayer);
  dstEnumLayer.Reset();

  ILayer srcLayer = null;
  ILayer dstLayer = null;

  while ((srcLayer = srcEnumLayer.Next()) != null &&
          (dstLayer = dstEnumLayer.Next()) != null)
  {
    if (srcLayer.Name != dstLayer.Name)
    {
      var msg = string.Format("入力:{0} 対象:{1} 順列ずれ", srcLayer.Name, dstLayer.Name);
      throw new ArgumentException(msg);
    }//end if
    var srcGeo = (IGeoFeatureLayer)srcLayer;
    var dstGeo = (IGeoFeatureLayer)dstLayer;

    var srcFields = srcGeo.DisplayFeatureClass.Fields;
    var dstFields = dstGeo.DisplayFeatureClass.Fields;

    Dictionary<string, string> fieldReplaceMap = new Dictionary<string, string>();
    for (int i = 0; i < srcFields.FieldCount; i++)
    {
      var srcF = srcFields.get_Field(i);
      var dstF = dstFields.get_Field(i);

      Debug.Print("{0}⇒{1}", srcF.Name, dstF.Name);
      fieldReplaceMap.Add(srcF.Name, dstF.Name);

    }
  }//end loop layer
}//end com
カテゴリー: 開発 タグ: パーマリンク