Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Стирание ранее заполненного DataSet и повторное заполнение. Нарушение отображения в DataGridView

05.08.2017, 17:29. Показов 2011. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, Господа. У меня возникла проблема, которую не могу решить уже не первый день...

Вообщем есть БД, в ней есть несколько таблиц, я гружу эти таблицы в DataSet, добавляю за счет DataSet.Tables.Add(newTable), затем подвязываю этот DataSet к BindingSource, а BindingSource подвязываю непосредственно к DataGridView. Устанавливаю DataGridView.DataMember на ту таблицу из DataSet, какую хочу отображать. Вообщем все по стандарту.

Не буду приводить весь процесс того, что мне нужно сделать, упростим. Создадим две кнопки. Одна будет стирать из DataSet всю информацию, соответственным образом должен отобразиться пустой DataGridView. Вторая кнопка должна снова заполнять DataSet теми же данными, что и вначале, и, как я понимаю, DataGridView должен это все вновь отобразить.

Задача элементарная, но после того как я первый раз стираю информацию из DataSet, второй раз я не могу больше загрузить в него ничего. Точнее могу, информацией он заполняется, но DataGridView больше отказывается ее отображать.

Из DataSet удалял инфу и так DataSet.Clear(), и так DataSet.Reset(), и так DataSet.Tables.Clear(), и комбинировал эти вызовы - бесполезно.
Пытался по нажатию второй кнопки(которая заново загружает инфу в DataSet), снова подвязывать DataSet на BindingSource, а BindingSource на DataGridView - тоже безрезультатно.

Короче как я только уже не делал...

Помогите пожалуйста, как мне реализовать то, что я хочу

Добавлено через 3 часа 53 минуты
Не знаю правильно или нет, но сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
...
// Очищаю и пересоздаю DataSet
this.dataSet1.Reset();
this.dataSet1 = new DataSet();
// Загружаю базу данных в наш DataSet
DataBaseLoader.getInstance().LoadDB( this.dataSet1 );
// Привязываем все воедино
this.bindingSource1.DataSource  =   this.dataSet1;   
this.dataGridView1.DataSource   =   bindingSource1; 
this.bindingSource1.DataMember  =   "CARD"; 
...
Так работает то, что я хотел. Но логично ли это?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.08.2017, 17:29
Ответы с готовыми решениями:

Стирание ранее нарисованных линий
Господа этот код рисует окружность TextBox1+=1, как сделать чтобы при TextBox1-=1 линии стирались Public Class Form1 Dim x2 As...

Повторное открытие проекта с ранее на нём нажатой кнопкой
добрый день. я новичок не судите строго. несколько дней ломаю голову как сделать так чтобы при повторном открытии проекта(формы)ранее...

Заполнение DataSet данными из другого DataSet
Здравствуйте. Есть DataSet (назовем его ds1) с 2 связанными таблицами( Table1 и Table2, связаны по полю ID). Необходимо выбрать часть...

9
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
06.08.2017, 19:03
У Вас биндинг служит только для перемычки между БД и гридом? Тогда зачем? Можно тогда обойтись напряму, без лишних объектов памяти, и сразу кидать датасорс вместо биндингсорсов, как по мне. Я то думал, вы создаете отдельный класс-модель данных, и биндите его через класс. А так... лишние действия получаются.
0
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
08.08.2017, 08:56
Цитата Сообщение от Bretbas Посмотреть сообщение
Так работает то, что я хотел. Но логично ли это?
Не совсем понятно что именно вы хотели? Точнее зачем надо было теребить dataset?
Цитата Сообщение от hoolygan Посмотреть сообщение
У Вас биндинг служит только для перемычки между БД и гридом? Тогда зачем?
Подобную штуку писал когда делал для кучи мелких и похожих друг на друга таблиц, чтобы не расписывать для каждой из них отдельную форму и команду под каждую кнопку.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
08.08.2017, 18:04  [ТС]
Цитата Сообщение от Aferuga Посмотреть сообщение
Не совсем понятно что именно вы хотели? Точнее зачем надо было теребить dataset?
Я же говорю, мне нужно стирать таблицу, и подружать новую в один и тот же DataSet. Структура таблиц одна и та же, поэтому DataSet не нужно менять. Я стирал вначале методом Clear(), потом Reset() объекта DataSet. Так все этим методы сбивают мои настроенные в редакторе столбцы DataGridView. Единственный способ, чтобы столбцы не сбивались, это тот, который я написал выше
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
08.08.2017, 21:47
Та ну ладно. В 3 строке очищаете таблицы, а в 4-ой создаете новый датасет, так нафиг тогда 3-я строка? И всё равно вопрос оставлю - зачем bindingsource? Да еще и так костыльно? Ведь это же явно не в определении модели прописывается, а в каком-то локальном методе, типа нажатия на кнопку? Сам биндинг прекрасно отрабатывает изменения в обеих сторонах - и модели и UI, ему не нужно каждый раз указывать что и куда Вы подвязываете. Но делается это на немного выше уровне, на уровне связывания моделей. Вот и вопрос поэтому мой так звучал.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
09.08.2017, 13:37
Цитата Сообщение от Bretbas Посмотреть сообщение
Задача элементарная, но после того как я первый раз стираю информацию из DataSet, второй раз я не могу больше загрузить в него ничего. Точнее могу, информацией он заполняется, но DataGridView больше отказывается ее отображать.
У вас не отображаются данные в гриде, а вы зачем-то DataSet мучаете. DataGridView.Refresh() пробовали?
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
09.08.2017, 17:53  [ТС]
hoolygan,
Цитата Сообщение от hoolygan Посмотреть сообщение
Та ну ладно. В 3 строке очищаете таблицы, а в 4-ой создаете новый датасет, так нафиг тогда 3-я строка?
Я не знаю, это просто вуду программирование какое-то. Только так работает то, что я хочу видеть

Цитата Сообщение от hoolygan Посмотреть сообщение
И всё равно вопрос оставлю - зачем bindingsource?
Он нужен в другой части задачи, просто оставим что он нужен и все Если Вы имеете ввиду, напрямую DataSet подсоединять к DataGridView, то я так тоже делал, результат один и тот же. Без разницы, с BindingSource или без него.

Igr_ok,
Цитата Сообщение от Igr_ok Посмотреть сообщение
У вас не отображаются данные в гриде, а вы зачем-то DataSet мучаете. DataGridView.Refresh() пробовали?
Пробовал Пробовал и DataGridView.Update() и еще что-то там. Все перепробовал уже.

Еще раз, чтобы все поняли чего я хочу добиться:
1. Есть DataSet и DataGridView(BindingSource опустим, так как он роли не играет). Есть несколько одинаковых по структуре таблиц, но данные в них разные. Поэтому средствами Visual Studio у меня создается автоматически DataSet, с такой структурой, какая мне нужна.

2. Я беру DataGridView, и в редакторе Visual Studio начинаю редактировать колонки, так как я хотел бы их видеть( какая-то растянута, какая-то невидна будет вовсе, какая-то еще что-то там). Вообщем настраиваю внешний вид колонок DataGridView через редактор. Все колонки готовы.

3. В коде, я заполняю DataSet, и передаю его как источник в DataGridView(опять же можно все через BindingSource - роли не играет) для отображения. Все, при первом запуске программы все заполняется и все отображается отлично.

4. Теперь, я хочу, к примеру, заменить подгруженную ранее в DataSet таблицу на другую, с той же структурой, и хочу чтобы она отобразилась в DataGridView. Так вот, если я просто создам другой DataSet2 и загружу туда данные, а потом передам его как источник данных в DataGridView, то все мои настройки колонок, которые были описаны в пункте 2, будут сбиты, тоесть тупо отобразятся ВСЕ колонки из новой таблицы, будут стандартные имена, нихрена не выровнено и т.п.
Я бы хотел этого избежать. Поэтому я понял, что нужно что-то делать с первым DataSet'ом, который создался средстами Visual Studio в пункте 1. Я начал разными способами пробовать стереть информацию, ранее загруженную в этот DataSet, для того, чтобы загрузить новую из новой таблицы. При разных манипуляциях с DataSet'ом, таких как DataSet.Clear(), DataSet.Reset() и т.п., я увидел, что колонки действительно не сбиваются, НО новая информация перестает отображаться в DataGridView. Как я только не пробовал, ничего не получалось. И тут, в один момент, методом научного тыка и вуду программирования, я нашел способ, чтобы получить то, чего я хочу....и это...барабанная дробь...
Вот он, как я уже писал выше:
C#
1
2
3
4
5
6
7
8
9
10
11
...
// Очищаю и пересоздаю DataSet
this.dataSet1.Reset();
this.dataSet1 = new DataSet();
// Загружаю базу данных в наш DataSet
DataBaseLoader.getInstance().LoadDB( this.dataSet1 );
// Привязываем все воедино
this.bindingSource1.DataSource  =   this.dataSet1;   
this.dataGridView1.DataSource   =   bindingSource1; 
this.bindingSource1.DataMember  =   "CARD"; 
...
Фухх, я уж устал писать
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
10.08.2017, 15:57
Момент конечно очень интересный, но кажется мне, что у Вас стоят обработчики на много событий, и Вы просто не смотрите в их сторону. Просто так не нужно делать резет, потом новый объект - это глупо, потому что старый все равно убьется мусорщиком. Так что проблема явно не в этом куске кода.
Да и гриду (если это не юзерконтрол, а стандартный - потому что мало ли что там прописано может быть лишнего) абсолютно пофигистичен на то, как именуется датасет - ему важны названия полей, и не более того, так что можно грузить и 10 и 500 датасетов, и 100500 DataTable - но если названия полей совпадают - то он их покажет нормально.
Так что смотреть нужно глубже - а это больше напоминает огромный костылище, а значит ошибка не тут, и точно что-то не так связываете.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
10.08.2017, 19:30
Bretbas, Бывают случаи, когда Refresh не обновляет грид. Для этого рекомендуют
C#
1
2
this.dataGridView1.DataSource   = null;
this.dataGridView1.DataSource   =   bindingSource1;
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
11.08.2017, 08:00  [ТС]
Igr_ok, Так тоже делал. Мне Usaga говорил так попробовать. Тоже безрезультатно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2017, 08:00
Помогаю со студенческими работами здесь

Запись данных из программно заполненного DataGridView в MS Access
Добрый всем день! У меня есть windows-приложение, в котором программно заполняется DataGridView. Возникла задача - дописать строки из...

Повторное заполнение ComboBox
Добрый вечер! Проблема такая: делаю список доступных Com портов, сначала ищу их и заполняю combobox, затем при повторном вызове диалогового...

DataSet Visualizer проблема отображения данных
Приветствую всех. Установил Visual Studio 2008 Sp1 Rus. При отладке программы в DataSet Visualizer нормально отображается только первая...

Повторное заполнение progressBar из таймера
есть progressbar и есть timer все подсоединил , все работает (один раз ) я хочу что бы эта полоска обновлялась и снова плыла в право ......

При загрузке формы происходит заполнение DataSet, но заполнение происходит не вполне корректно
Есть строго типизированные DataSet и TableAdapter. При загрузке формы происходит заполнение DataSet, но заполнение происходит не вполне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru