1 / 1 / 2
Регистрация: 04.08.2014
Сообщений: 71
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Выборка из БД в DataGridView: Почему последняя отмеченная строка не попадает в новый запрос04.08.2014, 20:21. Показов 2109. Ответов 14
Метки нет (Все метки)
Доброго времени суток! Помогите новичку разобраться.
Есть форма для работы с базой Access. таблица отображается в гриде:
Вопроса 2: 1) Почему последняя отмеченная строка не попадает в новый запрос (по какой-то причине checkbox в последней отмеченной строке читается как false хотя отмечен как true) 2) И почему поле с checkbox'ом перемещается из столбца 2 в 4, хотя при запуске таблица этим же запросом формируется правильно. Надеюсь доступно объяснил проблему. Подскажите что не так или ткните носом в ссылку, поиском не нашел как решить подобную проблему. Заранее спасибо!
0
|
04.08.2014, 20:21 | |
Ответы с готовыми решениями:
14
DataGridView. Не сохраняется последняя строка Чем является отмеченная строка? Обновление SQLite БД через DataGridView - обновляется только последняя строка Почему считывается только последняя строка? |
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|||||||||||
05.08.2014, 05:48 | 2 | ||||||||||
Сообщение было отмечено Hoffman как решение
Решение
Попробуйте выполнять grid.EndEdit() перед тем, как считывать значение из ячейки грида. Впоне возможно грид на момент вызова метода SelectRowsToPrint еще находится в режиме редактирования.
Я и в шар магический пробовал смотреть, и на кофейную гущу, и даже валенок за забор кинул, но увидеть код, который находится в методе GridStyle, так и не смог. Именно внутри этого метода скрыта причина указанного вами поведения.
Кстати, появился встречный вопрос: DbCommand (OleDbCommand является наследником DbCommand), можно выполнить тремя способами: ExecuteReader, ExecuteScalar и ExecuteNonQuery. ExecuteReader возвращает DbReader, с помощью которого можно прочитать результирующий набор процедуры (результат выполнения SELECT'а внутри процедуру). ExecuteScalar возвращает значение первого столбца из первого строки результирующего набора. ExecuteNonQuery ни какого результирующего набора не возвращает. DataAdapter - это совокупность комманд разного назначения: для выборки, для добавления. для изменения и для удаления данных. Внутри метода DataAdapter.Fill открывается соединение, если оно было закртыо, выполняется SelectCommand.ExecuteReader, из которого заполняется таблица, передеваемая в Fill в качестве параметра, после чего закрывается подключение, если оно изначально было закрыто. То есть, чтобы заоплнить таблицу результирующим набором из DataAdapter.SelectCommand, достаточно вызывать метод DataAdapter.Fill. Надеюсь, доступно объяснил? А теперь, внимание, вопросы: 1. Зачем в следующих кусках кода вы вызываете ExecuteNonQuery, который не возвращает результирующего набора, для SelectCommand, которая существует ради того, чтобы возвращать результирующий набор? 2. Зачем вы вообще вставили следующие куски кода в своей программе, если ранее вы используете метод DataAdapter.Fill, который прекрасно и правильно отрабатывает?
1
|
1 / 1 / 2
Регистрация: 04.08.2014
Сообщений: 71
|
||||||||||||||||
05.08.2014, 08:54 [ТС] | 3 | |||||||||||||||
Сорри, действительно совсем забыл про метод GridStyle(). Вот он:
Если я правильно понял без этого:
0
|
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
|
||||||
05.08.2014, 11:09 | 4 | |||||
Hoffman,
1) Вообще удалите эти три строчки - все и без них будет работать 2) в конструкторе формы в DataGride вашем создайте ВСЕ столбцы(ПКМ-правка столбцов) запроса и в поле DataPropertyName укажите имя столбца в запросе. Это будет намного лучше чем вызывать GridStyle при каждом запросе. 3) перед привязкой данных (grid.DataSource = dt; ) укажите сначала
собственно по вопросу: измененные данные гарантированно будут сохранены лишь после потери фокуса DataGrid'ом. в любой другой момент нет гарантии что измененные данные сохранились
1
|
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
|
|
05.08.2014, 11:19 | 5 |
Далее следующий очень интересный вопрос: у вас УЖЕ загружены данные из БД,вы же для вывода печати выполняете полноценный запрос чтоб ПОВТОРНО загрузить данные.
Вот в свое время нашел простенькую реализацию печати грида, правда ее еще напильником следует шлифовать, но в 9 из 10 случаях вполне справляется PrintDGV.zip второй вариант использовать программы-отчеты(напр., Crystal Reports, сам использую FastReport)
0
|
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
|
|||||||||||
05.08.2014, 11:36 | 6 | ||||||||||
Сообщение было отмечено Hoffman как решение
Решение
а при выводе в Excel просто добавляем одну сточку, чтоб печатать только выделенные строчки:
З.Ы. тот же FastReport позволяет сохранить отчет в Excel(и другие форматы), а не только выводить на печать. Добавлено через 10 минут зачем для вычисления сумм 5 раз гонять цикл, почему нельзя выполнить все вычисления в одном цикле? к тому же лучше брать значения не из grid, а из DataTable
1
|
1 / 1 / 2
Регистрация: 04.08.2014
Сообщений: 71
|
|
05.08.2014, 11:49 [ТС] | 7 |
Да, об этом знаю. От недостатка опыта, не подумал об этом сразу.
Вот этот пункт не понятен.. ну кроме сознания столбцов в конструкторе.. Процесс выглядит следующим образом: Грид грузится при запуске программы методом LoadGrid(), далее в гриде в столбце с checkbox'ми отмечаем нужные для экспорта строки вызываем метод LoadGridPrint() из которого вызывается SelectRowsToPrint() читаем отмеченные строки и формируем в LoadGridPrint() новый запрос, которым и загружаем грид по новой. Дальше экспортируем уже по новой загруженный грид в эксель и перегружаем грид первичным запросом в методе LoadGrid() т.е. всю таблицу из Access. Добавлено через 8 минут Я правильно понимаю что при таком подходе отпадает необходимость грузить грид новым запросом? За это отдельное спасибо!! Вечером все попробую и отпишусь.
0
|
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
|
|
05.08.2014, 12:00 | 8 |
именно так и есть
при выполнении grid.DataSourse=dt выполняется автоматическая генерация столбцов в DataGridView и после этого вы каждый раз редактируете заголовки и т.д. Вместо этого можно один раз создать столбцы указать чтоб они не создавались(AutoGenerateColumns). а чтоб было понятно из какого столбца в источнике данных DataTable следует брать значение созданному столбцу указываем в свойстве DataPropertyName столбца DataGridView имя соответственного столбца в DataTable.
1
|
1 / 1 / 2
Регистрация: 04.08.2014
Сообщений: 71
|
|
05.08.2014, 12:29 [ТС] | 9 |
Все поля в таблице, кроме ключевого, имеют тип string. Как в данном случае изменится ваш код?
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
05.08.2014, 13:11 | 10 |
Hoffman, колонка у вас съезжает потому, что коллекция колонок не очищается полностью при изменении DataSource. Из коллекции удаляются ненужные колонки, добавляются отсутствующие. После экспорта в EXCEL колонки, которые были в гриде для экспорта в EXCEL, остаются на своих местах. аотсутствующие в выборке для экспорта в EXCEL колонки добавляются, начиная с позиции 3.
Вам вообще грид не нужен для экспорта в EXCEL. DataTable с головой хватит. По хорошему нужно вообще dt, по полю "V" (по крайней мере так вы его обозвали в методе GridStyle) отфильтровать и кинуть результат в EXCEL не заморачиваясь с перевыборкой данных. Но это требует более глобальных переделок, нежели отказ от грида при экспорте в EXCEL)
1
|
1 / 1 / 2
Регистрация: 04.08.2014
Сообщений: 71
|
||||||||||||||||
05.08.2014, 21:34 [ТС] | 11 | |||||||||||||||
Вопрос снят. Разобрался сам:
С использованием всех советов получилось вот что:
Варианта придумал два: 1) ручками уже в листе Excel скрыть пустые строки (или может это можно как то программно сделать? не нашел пока как) 2) отсортировать grid перед экспортом по логическому полю (почти как посоветовал kodv). Могу отсортировать по любому текстовому полю:
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
||||||
06.08.2014, 06:22 | 12 | |||||
Hoffman, я же вам говорю, не используйте грид для экспорта. Используйте, допустим, отдельный DataView (отдельный для того, чтобы отображение в гриде ни как не менялось), и все будет проще и правильнее:
1
|
1 / 1 / 2
Регистрация: 04.08.2014
Сообщений: 71
|
||||||
06.08.2014, 19:08 [ТС] | 13 | |||||
Всем огромное спасибо!!!! Окончательный метод выглядит так:
0
|
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
|
||||||
07.08.2014, 16:14 | 14 | |||||
1
|
1 / 1 / 2
Регистрация: 04.08.2014
Сообщений: 71
|
|
07.08.2014, 16:20 [ТС] | 15 |
Еще раз спасибо, Learx!!! Тему можно закрывать.)
0
|
07.08.2014, 16:20 | |
07.08.2014, 16:20 | |
Помогаю со студенческими работами здесь
15
Почему-то заполняется только последняя ячейка DataGridView Datagridview как узнать, что текущая строка последняя (пустая для ввода новых данных пользователем) Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так? Почему не удаляется единственная строка из DataGridView? Последняя новость не попадает в базу Событие SheetChange: последняя строка и выделенная строка является одинаковой величиной Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |