Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130

VB. NET - Зависимые ComboBox + БД / DataRelation

16.01.2011, 08:35. Показов 4540. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.
Есть на форме два комбо-бокса, итемы в них загружаются из базы данных из двух таблиц - в один комбо - некоторые указатели, в другой - содержимое этих указателей. Задача при выборе в первом комбо указателя, грузить во второй соответствующее ему содержимое. Таблицы (х2) в БД нормализованы, связаны отношением один-ко-многим.

Вопрос даже не в том как это реализовать (с помощью SQL я знаю как), а вопрос в том можно ли сделать такую зависимость с помощью объекта DataRelation? Или какими либо другими способами, кроме SQL-запросов.

P.S. Visual Basic 2010.

P.P.S. Заранее спасибо

Добавлено через 12 минут
Прошу прощения, модераторы, перенесите пожалуйста этот пост в подтему Visual Basic .NET.
Промахнулся немного

Спасибо
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.01.2011, 08:35
Ответы с готовыми решениями:

Программно создать на листе зависимые Combobox
Доброе время суток! Помогите пожалуйста! Можно ли программно на листе создать зависимые Combobox (элемент ActiveX): при выборе значения в...

datagridview и datarelation
как заполнить datagridview ,если имеется 3 связанные таблицы посредством datarelation

Объект DataRelation, ссылающийся на себя
Добрый вечер. Изучаю ADO.NET по книжке, там есть пример демонстрирующий работу объекта DataRelation, который ссылается сам на себя....

5
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
17.01.2011, 00:46
если таблицы связаны вроде как тут:



В результате Билл выдаёт нам в акцессе:

и мы ведь хотим что-то типа того внутри нашей мега-проги, да?

Нужно в Visual Studio выбрать:

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

нажимаем готово

затем
Название: Шаг2.5.png
Просмотров: 1145

Размер: 9.0 Кб

Далее щёлкаем правой кнопкой мыши по таблице "Носители" в "Источниках данных", изменяем вид на комбобокс (как хочется ТопикСтартеру), перетаскиваем его отсюда на форму. Далее перетаскиваем на форму таблицу "Содержимое", причём именно ту, что в источниках данных находится внутри "Носители"

результат:


без единой строчки кода

теперь понятно почему VS2010 столько стоит?
1
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
17.01.2011, 15:06  [ТС]
to cergew:
Таблицы у меня аналогично в Access связаны.
Я привык в коде все подключения делать... И вот про источники данных то совсем забыл. Надо будет по аналогии код написать.

Спасибо тебе!

Добавлено через 40 минут
cergew:
Попробовал, как ты сказал - получил кучу "ненужных" элементов (BindingSource, BNavigator, Da, ds).

В итоге покопался еще - сейчас думаю что, проще все-таки вручную, через запрос типа:
SQL
1
SELECT * FROM tbl WHERE FIELD = ('" & ComboBox1.Text & "')
1
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
17.01.2011, 17:26
Цитата Сообщение от Maden Посмотреть сообщение
проще все-таки вручную, через запрос типа:
а расскажи пожалуйста, как ты это вручную делаешь всё, через запросы?
0
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
18.01.2011, 18:00  [ТС]
Ну вот например:
Подключение к базе данных и чтение из нее с помощью DataAdapter

VB.NET
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
30
31
32
33
34
35
Imports System.Data.OleDb 'Импортируем область имен для краткости в будущем
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles    Button1.Click 
'Тут неважно в каком событии пишешь
 
        Dim connetionString As String 'определяем переменную для строки подключения к БД
        Dim oledbCnn As OleDbConnection 'определяем сам объект подключения
        Dim oledbAdapter As OleDbDataAdapter 'определяем дата-адаптер
        Dim ds As New DataSet 'создаем новый экземпляр набора данных
        Dim sql As String 'определяем переменную для нашего ЗАПРОСА
        Dim i As Integer 'а это так - счетчик
 
'Для аксессовских БД строка подключения выглядит так:
        connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your mdb filename;"
'ОПРЕДЕЛЯЕМ ЗАПРОС - если надо подробнее - смотри в поисковике _SQL-запрос_
        sql = "SELECT * FROM Таблица WHERE Поле = чему-то"
 
'Создаем подключение
        oledbCnn = New OleDbConnection(connetionString)
        Try
            oledbCnn.Open() 'Открываем соединение
            oledbAdapter = New OleDbDataAdapter(sql, oledbCnn) 
            oledbAdapter.Fill(ds) 'Заполняем адаптер
            For i = 0 To ds.Tables(0).Rows.Count - 1 'поехали читать данные в цикле
                MsgBox(ds.Tables(0).Rows(i).Item(0))
            Next
'Далее закрываем все подключения и пр.
            oledbAdapter.Dispose() 
            oledbCnn.Close()
'ловим ошибки
        Catch ex As Exception
            MsgBox("Невозможно соединиться с БД" & vbCrLf & "Текст ошибки: " & ex.Message)
        End Try
    End Sub
End Class
Аналогично можно читать содержимое базы с помощью DataReader'a:

VB.NET
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
Imports System.Data.OleDb
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim connetionString As String
        Dim oledbCnn As OleDbConnection
        Dim oledbCmd As OleDbCommand
        Dim sql As String
 
        connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your mdb filename;"
        sql = "Your SQL Statement Here like Select * from product"
 
        oledbCnn = New OleDbConnection(connetionString)
        Try
            oledbCnn.Open()
            oledbCmd = New OleDbCommand(sql, oledbCnn)
            Dim oledbReader As OleDbDataReader = oledbCmd.ExecuteReader()
            While oledbReader.Read
                MsgBox(oledbReader.Item(0) & "  -  " & oledbReader.Item(1) & "  -  " & oledbReader.Item(2))
            End While
            oledbReader.Close()
            oledbCmd.Dispose()
            oledbCnn.Close()
        Catch ex As Exception
            MsgBox("Can not open connection ! ")
        End Try
    End Sub
End Class

Ну а по поводу пресловутых комбо - дак придется сделать так:
1. Загрузить данные в первый комбо
2. В событии SelectedItemChanged первого комбо загружать содержимое второго комбо, например так:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
 
connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your mdb filename;"
        
sql = "SELECT * from tblProduct WHERE id=('" & comboBox1.Text & "')"
 
        oledbCnn = New OleDbConnection(connetionString)
        Try
            oledbCnn.Open()
            oledbCmd = New OleDbCommand(sql, oledbCnn)
            Dim oledbReader As OleDbDataReader = oledbCmd.ExecuteReader()
ComboBox1.Items.Clear()
            While oledbReader.Read
                ComboBox1.Items.Add(oledbReader.Item(1))
            End While
            oledbReader.Close()
            oledbCmd.Dispose()
            oledbCnn.Close()
        Catch ex As Exception
            MsgBox("Can not open connection! ")
        End Try

Вот как-то так. Я не люблю пользоваться визуальными конструкторами данных, поскольку потом тяжело вспоминать что к чему, да и кроме того копи-пастом часто занимаюсь ИМХО так удобнее.
1
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
18.01.2011, 21:36
Цитата Сообщение от Maden Посмотреть сообщение
так удобнее
да, интересный способ, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2011, 21:36
Помогаю со студенческими работами здесь

Добавление строк в таблицу с использованием DataRelation
Есть три таблицы: users: CREATE TABLE `users` ( `id_user` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `id_type` int(11)...

DataAdapter методом Fill выгружает в DataSet DataRelation?
Если таблицы связаны и я методом Fill выгружаю их в DataSet то помимо объектов DataTable создаются ли объекты DataRelation дублирующие...

Вызвать Form2 нажатием кнопки button компонента в combobox-e на Form1 (NET Framework 4.5.2)
Всем привет) Как вот можно при помощи кнопки button1 вызвать событие Form2 при мощи combobox-oв, например я хочу выбрать в комбобоксе1...

Я чего-то не понимаю, или combobox в net версии 4 действительно нельзя сделать "только для чтения"?:)
Система XP Pro SP3 лицензионная. Net FrameWork 4 Multi-Targetting Pack. C# Microsoft Visual Studio 2010 SP1. MSDN говорит, что для...

Оптимизация производительности C#.NET (Алгоритм, Многопоточность, Debug, Release, .Net Core, Net Native)
Решил поделится своим небольшим опытом по оптимизации вычислений на C#.NET. НЕ профи, палками не кидать, конструктив приветствуется! ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru