| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB .NET > DataGridView - одинаковые записи |
| Автор: BugZZ 21.10.2009, 22:42 | ||||
| Привет, Эксперты! Итак. Добрались руки до VS 2008 Sp1 и до парочки XML документов, которые надо прочитать Начну с задумки: Сделать тулзу которая читает n-е кол-во XML документов и из них всех вытаскивает только один определённый элемент и записывает его значение в DataGridView Что реализовано: - выбор неопребеделённого кол-ва файлов черех OpenFileDialog - чтение всех выбраных фалоф на предмет нужного эелемента - сохраниние содержания элемента в "таблицу" (ДатаГридВью) проблема: - после прочтение более чем однго файла, в DGV (DataGridView) появляюся одинаковые записи - что абсолютно нормально пояснение: - каждый xml файл - это результат онлайн воутинга к фотографиям. К каждому JPG был создан XML в котором написано с какого ИП какую оценку поставили. Чтоб небыло жульничество, в XML сохраняются ТОЛЬКО разные ИП - повторов нет. НО, с одного ИП было проголосовано за несколько фотографий - отсюда один ИП может быть записан сразу в нескольких xml-файлах. Отсюда и двойные, тройные ... n-e записи одного ИП в DGV после прочтения БОЛЕЕ ОДНОГО xml-файлов Цель: - Заставить XMLTextReader сохранять данные элемента только в том случае если запись НЕ присутвует в DGV моя логика, которая к сожалению не работает, точнее реализовать которую так и не получилось....: 1. Если DGv - пуст -> читаю первый xml-файл в DGv 2. Если DGV НЕ пуст -> проверяю, при добавлении новой записи, есть ли в DGV уже такая. НЕТ - добавляю. ДА - иду дальше... пример XML-файла:
в DGV должны сохранятся ТОЛЬКО ИП. Тобиш значение элемента <username> код, который добавляет все найденые username во всех выделенных файлах
Буду рад советам, подсказам ну или какой-либо другой инфе. http://pic.ipicture.ru/uploads/091021/g5IJmaULlx.png Как видно из картинки, некоторые ИП записаны все 8 раз ..... |
| Автор: diadiavova 22.10.2009, 01:40 | ||
Забей данные в промежуточную коллекцию, потом отфильтруй функцией Distinct с самописным компэарером.
В данном примере я показал следующее: Сначала по результату обработки файлов создаётся коллекция готовых строк для вставки в грид. Предполагается, что в коллекции есть столбец, под названием "ip"с типом данных Integer. Тут всё просто. Если есть IP к примеру такой 123.326.4.34, то мы вставляем в эту колонку число 123326004034. Таким образом в этой колонке у нас будет одинаковое число при одинаковых IP. Далее при вызове метода Distinct будет возвращена коллекция без повторов. Здесь весь секретв классе RowComparer. Функция Equals1 у него должна возвращать значение, указывающее равны ли объекты, а GetHashCode1 возвращать одинаковое значение для одинаковых объектов. Если правильно реализуешь логику сравнения, то код заполнения таблицы будет работать как надо. |
| Автор: diadiavova 22.10.2009, 13:36 | ||
| BugZZ, не знаю, возможно я непонятно объяснил, попытаюсь сформулировать иначе. Для того, чтобы иметь возможность удалить повторяющиеся элементы списка, нужно точно сформулировать по каким критериям следует определять совпадение элементов. В дотнете для этого существует интерфейс IEqualityComparer(Of T). Реализовав его в класе ты обязан определить два метода: Equals - получает два объекта сравниваемого типа и выдаёт True в случае, если объекты следует считать равными(логику прописываешь сам). GetHashCode - этот метод возвращает для каждого объекта некоторое число таким образом, чтобы равным объектам соответствовало одно и то же число. Если такой класс будет реализован, то его экземпляр можно передать методу Distinct и он отфильтрует коллекцию по описанному в этом классе правилу сравнения. На счёт свойства у грида, позволяющего исключать повторяющиеся записи не в курсе, может и есть. Добавлено через 2 минуты и 13 секунд
Ну я ведь не так описал. Каждый сегмент айпишника должен состоять из трёх разрядов, если меньше - заполняй нулями. В моём примере ведь так. |
| Автор: BugZZ 22.10.2009, 13:56 | ||||
Окей буду, пробовать. Просто после твоего поста, в очередной раз увидел что know-how у меня мало и многое - просто не знаю!
Извиняй, я не сразу обратил внимание. Как добъюсь результатов - отпишусь.... |
| Автор: diadiavova 22.10.2009, 13:59 | ||
|
| Автор: BugZZ 22.10.2009, 15:47 | ||||
| итак, пошел по легкому пути и сначала обкатал вариант с функцией которая говорит тру - если такой ИП уже есть и ФАЛС - если таких еще не обнаруженно. итак вот функция:
функцию я потестил. Все работает и делает то, что от нее требуется... После проверки функции долго смеялся ибо выяснилось что мой myXmlReader почему то вообще без моего ведома творит что хочет. итак. применяю фукцию.
запускаю тулзу и вижу что вместо ИП-адресов записаны http://pic.ipicture.ru/uploads/091022/T9T13U6mY3.png, хотя о них в коде НЕТ НИ СЛОВА! Вобщем, после проверок, пришел к вывроду что по каким-т непонятным причинам, XMLReader действует по след. принципу: 1 - читает документ 2 - Элемент и тебя зовут "username"? ДА! 2.1 Ты уже есть в списке (ДГВ) ? ДА 2.2 Беру след Элемент в файле (<date>) -----а все даты уникальны. Повторов нет! может конечно и не совсем так, но причина по которой ни с того ни с сяго берётся другой НИГДЕ НЕДЕКЛАРИРОВАННЫЕ элемент- мне не ясна...... |
| Автор: Pilger 22.10.2009, 16:47 |
| Попробуй myXmlReader.ReadElementString.Trim сначала в переменную поместить, а уже оттуда в функцию и в столбец. Проблема в том, что ReadElementString после прочтения сам перескакивает на сл. элемент, а т.к. ты его вызываешь 2 раза, то он соответственно сдвигается два раза. В функцию засовывается то что надо, а в столбец сл. элемент. Да и в экономическом плане удобнее. Зачем вызывать myXmlReader.ReadElementString.Trim дважды, когда можно записать в переменную. |
| Автор: BugZZ 22.10.2009, 17:09 | ||||
Макс, ты как обычно не подкачал. Все заработало. Решение :
Макс, тебе плюсик! |
| Автор: diadiavova 22.10.2009, 20:43 |
| Ну если это лёгкий путь тада извиняйте. В таком случае гораздо проще было перед добавлением новой строки в грид просто в цикле обходить все существующие и проверять, есть ли уже строка с таким айпи. |
| Автор: Pilger 22.10.2009, 22:03 |
| В общем то он так и сделал^^ |
| Автор: diadiavova 22.10.2009, 22:11 |
| Кстати, если бы он использовал лист, то вообще можно было без цикла обойтись...метод Find, передаёшь ему функцию(точнее лямбду) сравнивающую айпишники и сопсно всё. Но это не комильфо. Небольшое изменение условий потребует переписывания всего кода, а в моём случае переписать придётся только функции сравнения в компораторе. Кстати тоже юбилей сегодня 2000+ в песочнице |
| Автор: diadiavova 24.10.2009, 23:54 |
| Кстати: на счёт интерфейса...вот тут описал более-менее универсальную реализацию. http://forum.vingrad.ru/forum/topic-277734/kw-iequalitycomparer-gethashcode.html |