Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197

Как внести изменение в поле для конкретной строки

28.03.2012, 13:33. Показов 3328. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть обычная форма Supplier с датагридом, данные в который загружаются так: в коде формы этот код
VB.NET
1
2
3
Private Sub Supplier_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.DataGridView1.DataSource = GetDt(SqlQuery)
    End Sub
и создан модуль, в котором функция обрабатывает SQL-запросы и возвращает результат в эту форму при загрузке:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function GetDt(ByVal SqlQuery As String) As DataTable
        Dim dt As New DataTable
        Dim Con As New OleDb.OleDbConnection("Provider=Microsoft Office 12.0 Access Database Engine OLE DB Provider; Data Source=" _
        & My.Application.Info.DirectoryPath & "\Учебная.accdb") ' Переменная для подключения базы
        Dim SqlCom As OleDb.OleDbCommand ' Переменная OleDb-команды
        Dim DA As OleDb.OleDbDataAdapter ' Адаптер для заполнения таблицы после запроса
        SqlCom = New OleDb.OleDbCommand(SqlQuery, Con) ' Указываем строку запроса и привязываем к соединению
        Con.Open() ' Открываем соединение
        SqlCom.ExecuteNonQuery() 'Выполняем запрос
        DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса
        DA.Fill(dt) ' Заполняем таблицу результатми
        Con.Close() ' Не понятно, будет ли в этом случае соединение закрываться?
        Return dt
    End Function
В результате открывается форма с набором данных. В наборе данных есть булево поле Status. Решил запрограммировать, чтобы при изменении значения поля это изменение вносилось в БД. Сделал это так:
VB.NET
1
2
3
4
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        SqlQuery = "UPDATE Suppliers SET [Status] = True"
        Me.DataGridView1.DataSource = GetDt(SqlQuery)
    End Sub
В результате попытки изменения значения поля Status с False на True изменяются значения всех строк этого поля, а не ячейки, в которой я изменил значение. Как исправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.03.2012, 13:33
Ответы с готовыми решениями:

Подсчет количества одинаковых значений по определенным столбцам (в пределах одной конкретной строки) и вывод в поле
Добрый день, форумчане! Составляется форма для ежедневного отчета по насосной станции. Далее опишу подробнее описание сути вопроса. Цель...

Поиск конкретной ячейки, которая находится на пересечении конкретного столбца и конкретной строки
Друзья, добрый день. Сейчас поясняю что имею виду. Есть конкретная ячейка, значение в которой мне нужно, но я не знаю ни значения ни...

Можно ли в Word задать поле (отступ) для конкретной буквы (слова)?
Например, есть фраза: "Привет как дела." Надо, чтобы расстояние между словом "как" и словом "дела" было в два раза...

17
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 13:49
T-SQL
1
UPDATE Suppliers SET [Status] = True WHERE [другое поле] = значение
другое поле - это поле с уникальными значениями. Желательно ключевое
значение - значение ключевого поля в той же строке где надо изменить значение поля Status
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 13:50  [ТС]
Мне кажется, что ошибка в том, что сначала надо выбрать строки, в которых будет выполняться Update. Я подправил код, но запрос не выполняется:
VB.NET
1
2
3
4
5
6
7
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        sup = DataGridView1.CurrentRow.Cells(0).Value
        SqlQuery = "SELECT * FROM [Suppliers] WHERE IdSupplier = " & sup
        GetDt(SqlQuery)
        SqlQuery = "UPDATE Suppliers SET Status = True"
        GetDt(SqlQuery)
    End Sub
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 13:52
VB.NET
1
SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
а так?
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 13:54  [ТС]
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
UPDATE Suppliers SET [Status] = TRUE WHERE [другое поле] = значение
Понял.
И только сейчас дошло: ведь я могу значение поля менять не только с False на True, но и наоборот. Т.е, надо сначала сделать проверку, какое значение у поля, а потом присвоить ему противоположное значение. Опять делать запрос и с помощью конструкции If...Then это дело реализовывать?
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 13:55
смысл в том, что это:
VB.NET
1
SqlQuery = "SELECT * FROM [Suppliers] WHERE IdSupplier = " & sup
просто делает выборку из таблицы БД, но следующий далее запрос на обновление никак с результатами этой выборки не связан в нем надо отдельно указать условие отбора : ...Where...
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 13:56  [ТС]
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
Ага, буду пробовать, просто я не успеваю менять коды и отвечать на форуме
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 13:59
вот, полистай брошюрку из вложения. Там, правда, для MS SQL server но с аксесом различия синтаксиса минимальны.
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 14:00  [ТС]
Я сейчас так сделал
VB.NET
1
2
3
sup = DataGridView1.CurrentRow.Cells(0).Value
        SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
        GetDt(SqlQuery)
но нифига не изменяется значение поля

Добавлено через 51 секунду
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
вот, полистай брошюрку из вложения.
Где ссылка?
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 14:01
Добавил вложение...
Вложения
Тип файла: rar sql.rar (142.8 Кб, 21 просмотров)
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 14:05
а в самой базе смотрел? А то у тебя в процедуре GetDT по запросу на Update возвращать нечего. По идее DA пустой останется. Базу смотри через аксес. Вроде должно отработать все
1
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 16:46  [ТС]
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
Добавил вложение...
Спасибо, мануал будет полезен надолго, буду разбираться

Добавлено через 2 часа 38 минут
VB.NET
1
2
3
4
5
6
7
8
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        sup = DataGridView1.CurrentRow.Cells(0).Value
        If DataGridView1.CurrentRow.Cells(2).Value = 0 Then
            SqlQuery = "UPDATE Suppliers SET Status = False WHERE IdSupplier = " & sup
        Else : SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
        End If
        GetDt(SqlQuery)
    End Sub
Так всё работает.
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 17:06
Цитата Сообщение от paa66 Посмотреть сообщение
If DataGridView1.CurrentRow.Cells(2).Value = 0 Then
немного не понял, а в самой БД поле IdSupplier допускает пустые значения?
Просто, если ты пользуешься им как ключом, это нежелательно, т.к. не обеспечивается уникальность значений в данном поле.
И еще: результаты запросов показываются в DataGridView, надо понимать, имена полей тоже из БД в шабках столбцов DGV пишутся. Почему бы не почитать про псевдонимы (Alias). Так оно конечному юзеру будет приятнее. Или в БД столбцы поименовать кириллицей (даже с пробелами). А в запросах обязательно окружай имя поля с пробелами в []. Тогда алиасы не нужны будут и в то же время нормальные имена столбцов поимеешь в DGV.
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 17:14  [ТС]
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
в самой БД поле IdSupplier допускает пустые значения?
Почему такой вывод? Это поле - автосчётчик, в коде это поле обозначено как DataGridView1.CurrentRow.Cells(0) (т.е. первое поле таблицы), а вот булево поле Status может быть равным 0, это поле в коде обозначено как DataGridView1.CurrentRow.Cells(2) (т.е. третье поле в таблице)
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 19:01
а, ну да. Не досмотрелся. Просто привык уже индексы столбцов извлекать из них самих:
VB.NET
1
DataGridView1.CurrentRow.Cells(me.IdSupplier.Index).Value
тут IdSupplier - столбец (объект DataGridViewColumn). Когда работаешь с DGV, заполняемой вручную, то нет проблем присвоить столбцу не только HeaderText, но и Name.
А когда столбцы приходят в пустой DGV, то имя столбца в нем присваивается по имени столбца с данными, прилетевшими из БД. Но на стадии разработки этих столбцов нет! Зато зная, с каким именем прилетит он из БД, можно и обратиться по имени:
VB.NET
1
DataGridView1.CurrentRow.Cells("IdSupplier").Value
C одной стороны, это кажется гемором, но! Присваивая интуитивно понятные имена, легче писать код, да и потом читать его тоже. Плюс не надо держать в голове (или лазить в БД за этим) порядок следования столбцов. И если через время ты захочешь изменить структуру таблицы (внедрить столбцы или изменить порядок следования имеющихся) не будет нужды шарится по всему коду и рихтовать индексы, введенные как фиксированные числа.
Кроме того, читая мануал по SQL ты мог заметить, что порядок следования и количество столбцов в выборке можно регулировать самим запросом: вместо * (все столбцы в порядке их следования в таблице БД) можно написать:
SQL
1
SELECT [столбец5], [столбец1], [столбец2],[столбец8],[столбец4] FROM...
т.е. отобрать только те столбцы, в которых есть надобность и показать их в желаемом порядке. А попробуй так сотворить с кодом, в котором индексы жестко зафиксированы...
Если хочешь, попробуй этот способ - потом не откажешься
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 19:44  [ТС]
Попробовал я вставить
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
DataGridView1.CurrentRow.Cells("IdSuppli er").Value
и выдало ошибку в дэбуге, когда закрыл дочернюю форму, что Column named IdSupplier cannot be found. Хотя, конечно же, столбец под таким названием есть. Но буду иметь в виду такой метод обращения к полю.
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.03.2012, 19:56
Цитата Сообщение от paa66 Посмотреть сообщение
столбец под таким названием есть
а попробуй после выборки запроси циклом имена столбцов. только Name.
Странная ошибка сама по себе... я именно так всегда стараюсь обращаться.
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
29.03.2012, 06:53  [ТС]
Ошибка вот в чём была: я делал запрос к БД в виде
VB.NET
1
SqlQuery = "SELECT IdSupplier as [№ п\п],..FROM [Suppliers]"
Датагрид уже не содержит имя поля IdSupplier, а поле носит имя [№ п\п]. Теперь это имя и надо использовать и получится так:
VB.NET
1
sup = DataGridView1.CurrentRow.Cells("№ п\п").Value
Теперь всё работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2012, 06:53
Помогаю со студенческими работами здесь

Dataset (после изменение конфигурации БД не могу внести изменение)
Использую типизированный dataset после изменение конфигурации бд не могу внести изменение.Dataset изменял набор данных, настроив запрос, но...

Добавление значения для конкретной строки
Например, есть таблица с двумя столбцами - nickname и email. 1 строка 1 колонки уже заполнена - один Nickname1 есть. Если...

Изменение строки в поле
Хочу изменить значение строки для поля, но он этого не делает, хотя все вроде делаю правильно Может кто нить что подскажет или...

Как переставить цифры даты так чтобы её можно внести в поле DATE mysql?
Я отправляю через input дату dd.mm.yyyy, как переставить местами цифры и отправить дату в бд вот такого формата yyyy-mm-dd? Я создала поле...

Изменение строки в табличном поле
Добрый день! Подскажите, пожалуйста, как изменить данные в строке табличного поля на форме? Создал на форме табличное поле, заполнил...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru