Проблемы после удаления Feature

0 голосов
спросил 18 Дек, 07 от nigR0NYX (280 баллов) в категории Программные продукты Esri
После программного удаления Feature, с картой начинают происходить не понятные вещи: тормозит получение выделенных объектов (

ISelection selection = basicMap.FeatureSelection;
IEnumFeature enumFeature = selection as IEnumFeature;
enumFeature.Reset();
IFeature feature = enumFeature.Next(); // <---- здесь
),

 после чего пачками исчезают объекты(Feature). Но исчезают не совсем, просто теряют цвет. При выделении контур отрисовывается, но сам объект прозрачный.
Удаляю следующим образом:

IDataset pDataset = (IDataset)destClass;
            if (pDataset == null) return -1;
            IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)pDataset.Workspace;

if (!workspaceEdit.IsBeingEdited())
{
workspaceEdit.StartEditing(false);
}
workspaceEdit.StartEditOperation();

IFeature feature = findEniOnMap();
feature.Delete();

workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);


Пробовал после feature.Delete() вызывать feature.Store(), в результате вышеописанных проблем не возникает, но и объект не удаляется.


Заранее благодарен!

8 Ответы

0 голосов
ответил 18 Дек, 07 от new_sergei (2,660 баллов)
оНЯКЕ ОПНЦПЮЛЛМНЦН СДЮКЕМХЪ Feature, Я ЙЮПРНИ МЮВХМЮЧР ОПНХЯУНДХРЭ МЕ ОНМЪРМШЕ БЕЫХ: РНПЛНГХР ОНКСВЕМХЕ БШДЕКЕММШУ НАЗЕЙРНБ (

ISelection selection = basicMap.FeatureSelection;
IEnumFeature enumFeature = selection as IEnumFeature;
enumFeature.Reset();
IFeature feature = enumFeature.Next(); // <---- ГДЕЯЭ
),

 ОНЯКЕ ВЕЦН ОЮВЙЮЛХ ХЯВЕГЮЧР НАЗЕЙРШ(Feature). мН ХЯВЕГЮЧР МЕ ЯНБЯЕЛ, ОПНЯРН РЕПЪЧР ЖБЕР. оПХ БШДЕКЕМХХ ЙНМРСП НРПХЯНБШБЮЕРЯЪ, МН ЯЮЛ НАЗЕЙР ОПНГПЮВМШИ.
сДЮКЪЧ ЯКЕДСЧЫХЛ НАПЮГНЛ:

IDataset pDataset = (IDataset)destClass;
            if (pDataset == null) return -1;
            IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)pDataset.Workspace;

if (!workspaceEdit.IsBeingEdited())
{
workspaceEdit.StartEditing(false);
}
workspaceEdit.StartEditOperation();

IFeature feature = findEniOnMap();
feature.Delete();

workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);


оПНАНБЮК ОНЯКЕ feature.Delete() БШГШБЮРЭ feature.Store(), Б ПЕГСКЭРЮРЕ БШЬЕНОХЯЮММШУ ОПНАКЕЛ МЕ БНГМХЙЮЕР, МН Х НАЗЕЙР МЕ СДЮКЪЕРЯЪ.


гЮПЮМЕЕ АКЮЦНДЮПЕМ!
 
Попробуйте обновить карту после проделанных манипуляций.
0 голосов
ответил 18 Дек, 07 от nigR0NYX (280 баллов)
 Попробуйте обновить карту после проделанных манипуляций.


Если Вы имеете ввиду это:

(basicMap as IActiveView).Refresh();

то не помогает :(

PS: Спасибо за реакцию.
0 голосов
ответил 18 Дек, 07 от Alexander1 (32,520 баллов)
Хорошо бы посмотреть, как выглядит  findEniOnMap().
0 голосов
ответил 20 Дек, 07 от nigR0NYX (280 баллов)
Хорошо бы посмотреть, как выглядит findEniOnMap().



private IFeature findEniOnMap(string propCode)
        {
            ESRI.ArcGIS.Carto.IActiveView activeView = (ESRI.ArcGIS.Carto.IActiveView)axMapControl.Map;

            IQueryFilter filter = new QueryFilterClass();

            filter.WhereClause = string.Format("Идент_Код = '{0}'", propCode.ToUpper());

            IFeatureLayer fLayer = this.featureLayer;

            IFeatureCursor featureCursor = fLayer.Search(filter, true);
            IFeature feature = null;

            if ((feature = featureCursor.NextFeature()) == null) return null;

            return feature;
        }

0 голосов
ответил 20 Дек, 07 от Alexander1 (32,520 баллов)
Нельзя удалять Feature используя "Search Сursor". Надо использовать "Update Сursor":

IFeatureCursor featureCursor = fLayer.Update(filter, false);


Плюс, я бы удалял Feature внутри цикла (текущее положение курсора):

public void DeleteFeature(IFeatureClass featureClass, string propCode)
{       
     IQueryFilter queryFilter = new QueryFilterClass();
        queryFilter.WhereClause = string.Format("Идент_Код = '{0}'", propCode.ToUpper());

     IFeatureCursor updateCursor = featureClass.Update(queryFilter, false);
        IFeature feature = updateCursor.NextFeature();
       
     while (feature != null)       
     {            
          updateCursor.UpdateFeature(feature);
          updateCursor.DeleteFeature();

             feature = updateCursor.NextFeature();
        }       
     System.Runtime.InteropServices.Marshal.ReleaseComObject(updateCursor);    
}

0 голосов
ответил 21 Дек, 07 от nigR0NYX (280 баллов)
Alexander

Попробовал ваш код, но с сожалению безрезультатно.
Feature не удаляются.

Убрав строку
updateCursor.UpdateFeature(feature) удаление произошло, но и вышеописанные баги так же никуда не делись :(

Ещё интересный момент. Если отредактировать хотя бы один объект при помощи стандартных возможностей(например в ArcMap-e изменить значение к-либо поля), глюки исчезают!
0 голосов
ответил 22 Дек, 07 от Alexander1 (32,520 баллов)
Вы, случаем, не делаете всё по прежнему? Я имею ввиду:

IFeature feature = findEniOnMap();
feature.Delete();
0 голосов
ответил 24 Дек, 07 от nigR0NYX (280 баллов)
Alexander
Нет, вставил в точности преведённый вами код.
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...