Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# и ObservableCollection / 6 сообщений из 6, страница 1 из 1
17.06.2018, 12:07
    #39661660
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# и ObservableCollection
Коллеги, подскажите, фишка то в чём …
Суть:
1. Выборку из базы данных храню в ObservableCollection (сущности).
2. Сиё просматриваю в DataGrid, здесь же и редактирую
3. Код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
      //-- Контроль данных среза
      for (int i = 0; i < oc_Entity.Count-1; i++) {
        for (int j = i+1; j < oc_Entity.Count; j++) {
          if (oc_Entity[i].pk == oc_Entity[j].pk) {
            MessageBox.Show("Ошибка данных среза ТБ", caption_Entity);
            //xrow = new row_Entity() {
            //  chb_Entity = oc_Entity[i].chb_Entity,
            //  pk = oc_Entity[i].pk,
            //  namvrr = oc_Entity[i].namvrr,
            //  numdoc = oc_Entity[i].numdoc,
            //  mesto = oc_Entity[i].mesto,
            //  lat = oc_Entity[i].lat,
            //  lng = oc_Entity[i].lng,
            //  dateizm = oc_Entity[i].dateizm,
            //  rn = oc_Entity[i].rn
            //};
            xrow = oc_Entity[i];
            dgv_Entity.ItemsSource = null;
            oc_Entity = new ObservableCollection<row_Entity>(oc_Entity.OrderBy(x => x.pk).ToList());
            dgv_Entity.ItemsSource = oc_Entity;

            iRow = oc_Entity.IndexOf(xrow);
            dgv_Entity.SelectedIndex = iRow;
            xrow = (row_Entity)dgv_Entity.SelectedItem;
            dgv_Entity.ScrollIntoView(xrow);
            return;
          }
        }
      }



Так как написано, работает штатно.
Но если снять комментарии и закомментировать строку xrow = oc_Entity[i];, то
iRow = oc_Entity.IndexOf(xrow);
получает значение -1. Почему?
...
Рейтинг: 0 / 0
17.06.2018, 12:23
    #39661662
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# и ObservableCollection
ВМоисеев,

документацию почитайте, там рассказано:
https://msdn.microsoft.com/ru-ru/library/ms132410(v=vs.110).aspx

Используется компаратор по умолчанию, что не в курсе о том, что надо сравнивать так как Вы ожидаете.
По pk?
...
Рейтинг: 0 / 0
17.06.2018, 12:59
    #39661664
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# и ObservableCollection
>skyANA, сегодня, 12:23 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1296213&msg=21497317][21497317]

>Используется компаратор по умолчанию…

Не понял.
Думал, что при поиске сравниваются все поля сущностей по значениям, а похоже по ссылкам. Но тогда это не правильно.
...
Рейтинг: 0 / 0
17.06.2018, 14:41
    #39661678
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# и ObservableCollection
ВМоисеев,

что Вы не поняли? Как работает метод IndexOf? Там же всё расписано.

Последовательно перебираются элементы коллекции и сравниваются с переданным объектом до первого совпадения.
Для проверки используется компаратор по умолчанию.

Вообщем в Вашем случае в итоге вызовется метод Object.Equals , что для ссылочных типов проверяет равенство ссылок.

Если хотите иначе, то переопределите его в своём классе и сравнивайте "все поля сущностей по значениям".
...
Рейтинг: 0 / 0
17.06.2018, 15:37
    #39661690
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# и ObservableCollection
>skyANA, сегодня, 14:41 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1296213&msg=21497496][21497496]

>… что для ссылочных типов проверяет равенство ссылок.
Спасибо.
...
Рейтинг: 0 / 0
18.06.2018, 06:01
    #39661770
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# и ObservableCollection
ВМоисеевДумал, что при поиске сравниваются все поля сущностей по значениям, а похоже по ссылкам. Но тогда это не правильно.
Сравнение по значениям полей делается только в случае структур. У ссылочных типов по умолчанию проверка на равенство делается через сравнение ссылок.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# и ObservableCollection / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]