А вон у того погоняло «Конюхов».
А почему?
Долго объяснять, но за водкой его лучше не посылать.
На днях
столкнулся с чудесным.
Сижу, делаю
очередную кнопку для ArcGIS
Viewer for Silverlight, никого не трогаю. И вдруг,
внезапно и без обьявления войны,
отладка показывает, что в атрибутивной
таблице рабочего слоя у выбранной записи
нет ключа (ID)! В смысле, ключевое поле
есть, стандартное для ArcGIS поле OBJECTID, а
вот значения в нем нету. И ладно бы, если
бы это был самопальный «левый» слой —
нет, это вполне себе общедоступный,
можно сказать эталонный слой с серверов
ESRI
(http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Petroleum/KSPetro/MapServer/1).
Для тех кто не
в теме, отсутствие ключа в таблице это
смертный грех, карается незамедлительно
расстрелом без суда и следствия. Да и
работать ничего не будет, ибо это уже
не таблица а просто кучка мусора.
Поскольку
расстрелять владельцев таблицы у меня
бы не получилось, я занялся следствием.
Ибо мало ли, что показывает отладка,
может сама таблица в порядке? И точно,
в таблице все на месте, есть только
маленькая неувязочка — ключевое поле,
традиционно названное OBJECTID имеет
нетрадиционный алиас «Object ID». Да, с
пробелом. Какая фигня, скажете вы. И
будете 100% правы. Кому какое дело, какой
у поля алиас? Все равно эти алиасы
используются только для подписей. И вот
тут мы подходим к развязке сюжета.
В программе
использовался код (написанный
инженером ESRI, между прочим) наподобие
такого
objectIDFieldName = selectedFeatureLayer.LayerInfo.ObjectIdField; keyValue = selectedObj.Attributes[objectIDFieldName];
вполне себе
тривиальный код, по имени поля из таблицы
берется значение из выбранной записи.
Все так делают.
Все да не все.
Кто-то решил иначе. Кто-то (в рот ему
ноги) решил, что в этом гребаном
Аркгиссильверлайтвьювер алиас это
не просто ценный мех значение из
поля надо брать не по имени поля а по
алиасу. И поскольку обычно у поля OBJECTID
алиас тоже «OBJECTID», никто этой лажи не
замечал. А тут вылезло — встретились
два креативщика, один вписал необычный
алиас к атрибуту, другой доступ к данным
сделал через алиасы а не имена полей.
Короче, теперь
код получения ID у выбранного обьекта
выглядит приблизительно так
string objectIDFieldName = selectedFeatureLayer.LayerInfo.ObjectIdField; string objectIDAlias = ""; var fields = selectedFeatureLayer.LayerInfo.Fields; foreach(var f in fields) { if(f.Name == objectIDFieldName) { objectIDAlias = f.Alias; break; } } if(objectIDAlias != "") objectIDFieldName = objectIDAlias; keyValue = selectedObj.Attributes[objectIDFieldName]; |
И вот в таком
виде оно работает. Ужоснах.
Не забыть
переделать все взад, когда ESRI исправит
багу. Хотя, с их скоростями, к тому времени
я точно забуду.
Комментариев нет:
Отправить комментарий