Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 1
Регистрация: 25.03.2014
Сообщений: 67

Обновление combobox

11.08.2017, 10:26. Показов 3287. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Суть проблемы. Есть три радиокнопки и комбобокс (см.скрин). При выборе радиокнопки в combobox нужно перегрузить данные из БД.

Данные загружаю запросом в таблицу DataTable в DataSet.
DA - DataAdapter
DS - DataSet
DT_Ctrl - DataTable
cbName - combobox


Загрузка выполняется в событии CheckedChanged для каждой радиокнопки.
Данные берутся из трех разных таблиц БД.

VB.NET
1
2
3
4
5
6
       '  .... тут выполняем запрос в БД
        DA = New SqlCeDataAdapter(qSQL) ' получаем результат запроса
        DA.Fill(DS, DT_Ctrl.TableName) ' отправляем результат в datatable
        Me.cbName.DataSource = DT_Ctrl
        Me.cbName.DisplayMember = "_Name" ' связываем данные таблицы с combobox
        Me.cbName.ValueMember = "ID_Work"
VB.NET
1
2
3
4
5
6
       '  .... тут выполняем запрос в БД
        DA = New SqlCeDataAdapter(qSQL) ' получаем результат запроса
        DA.Fill(DS, DT_Ctrl.TableName) ' отправляем результат в datatable
        Me.cbName.DataSource = DT_Ctrl
        Me.cbName.DisplayMember = "_Name" ' связываем данные таблицы с combobox
        Me.cbName.ValueMember = "ID_Mat"
VB.NET
1
2
3
4
5
6
       '  .... тут выполняем запрос в БД
        DA = New SqlCeDataAdapter(qSQL) ' получаем результат запроса
        DA.Fill(DS, DT_Ctrl.TableName) ' отправляем результат в datatable
        Me.cbName.DataSource = DT_Ctrl
        Me.cbName.DisplayMember = "_Name" ' связываем данные таблицы с combobox
        Me.cbName.ValueMember = "ID_Exp"
В общем срабатывает это только один раз. При нажатии на любую первую радиокнопку, combobox заполняется, а дальше при нажатии на любые следующие кнопки, список в combobox не обновляется. В таблице DT_Ctrl данные меняются.

Пробовал связывать с тремя разными DataTable. Тогда срабатывает три раза - по одному на каждую кнопку, а дальше опять пусто.
Что не так? Почему не обновляется?
Миниатюры
Обновление combobox  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2017, 10:26
Ответы с готовыми решениями:

Обновление Данных в Access из Combobox
Доброго времени суток. Столкнулся со следующей проблемой. На форме есть несколько текстбоксов и несколько комбобоксов. Когда добавляю все...

Значение из ComboBox формы в запросе MS SQL для другого ComboBox
Здравствуйте! Научите пожалуйста использовать значение ComboBox (хотя бы VB) в запросе MS SQL. Значение числовое int. Знаю, что для...

Заполнение ComboBox из БД в зависимости от выбранного значения в другом ComboBox
Т.к. я не профессионал, прошу сразу не закидывать палками )) Проблема следующая, грубо говоря на форме преславутые зависимые ComboBox,...

10
1741 / 1660 / 167
Регистрация: 25.07.2015
Сообщений: 2,719
11.08.2017, 11:45
Полагаю , что надо каждый раз очищать и перезаполнять комбобокс при нажатии кнопки.
Полный код процедуры покажите пожалуйста.
1
1 / 1 / 1
Регистрация: 25.03.2014
Сообщений: 67
11.08.2017, 12:15  [ТС]
Цитата Сообщение от Kulma Посмотреть сообщение
Полагаю , что надо каждый раз очищать и перезаполнять комбобокс при нажатии кнопки.
Я об этом тоже подумал, но кроме Refresh ничего не нашел. И еще насторожила такая инструкция на MSDN к ComboBox.DataSource
Комментарии
A data source can be a database, a Web service, or an object that can later be used to generate data-bound controls. When the P:System.Windows.Forms.ComboBox.DataSour ce property is set, the items collection cannot be modified.
А код - это почти все, что касаемо заполнения combobox. Естественно есть объявление переменных, но я их словами описал в посте. И есть еще запросы в базу, но они объемные и к проблеме отношения не имеют, поскольку DataTable обновляются нормально, а вот связь между DT и combobox перестает работать после обновления DT. То есть, первый запрос в БД выполняется, данные заливаются в DT, связь через combobox.DataSourse устанавливается нормально. Список в combobox-е появляется. Но если DT наполнить новыми данными из БД, то связь пропадает и combobox пустой.
0
39 / 38 / 6
Регистрация: 17.07.2015
Сообщений: 380
Записей в блоге: 1
11.08.2017, 13:27
Цитата Сообщение от Joiner Посмотреть сообщение
кроме Refresh ничего не нашел
Joiner,
VB.NET
1
2
3
ComboBox1.Items.Add("Добавить один элемент")
ComboBox1.Items.AddRange({"Добавить", "несколько", "элементов, иными словами - массив"})
ComboBox1.Items.Clear() 'Очистить ваш ComboBox
0
1 / 1 / 1
Регистрация: 25.03.2014
Сообщений: 67
11.08.2017, 14:17  [ТС]
На clear ругается, пробовал присвоить datasource значение null и nothing, тоже не проходит. Я так понимаю, что привязанные данные менять нельзя. Об этом и говорит MSDN.
Думаю, что единственный вариант перезагружать форму заново, что бы присвоить новую связь. Но этот вариант - не вариант.
В общем решил я не выеживаться и применить DataGrid. Так даже, наверное, и пользователю удобнее будет.
Смысл всей этой затеи таков. Это программа составления строительной сметы. Есть работы, есть материалы и есть прочие расходы типа аренды техники, вывоз мусора и прочее. Сметчику необходимо по некоторым позициям в смете знать общее количество и заложенную сумму денег. Я хотел сделать просмотр по каждой позиции. То есть выбираешь тип позиции, например прочие затраты, а в combobox-е появляется список из названий, которые есть в смете и которые нужно контролировать (это свойство задается в настройках справочника затрат) и которые относятся только к затратам. Выбираешь нужную позицию в combobox-е и ниже в ячейках появляется сумма.
Теперь решил сделать отдельную панель с DataGridView и пускай туда весь список со всеми суммами загружается. Пользователь сможет сразу весь список увидеть, а не тыкать по одной позиции. Хотя, с другой стороны, весь список ему не всегда нужен. Обычно проверяются только позиции по которым есть сомнения.

Добавлено через 7 минут
Цитата Сообщение от SergProgrammer Посмотреть сообщение
VB.NET
1
2
3
ComboBox1.Items.Add("Добавить один элемент")
ComboBox1.Items.AddRange({"Добавить", "несколько", "элементов, иными словами - массив"})
ComboBox1.Items.Clear() 'Очистить ваш ComboBox
Это не то, данные берутся из БД, причем нужно, что бы в combobox были и названия и ID, потому как потом по ID нужно из другой таблицы БД выдернуть нужные строки. Поэтому и использую datasource, чтобы напрямую связать с datatable.
0
39 / 38 / 6
Регистрация: 17.07.2015
Сообщений: 380
Записей в блоге: 1
11.08.2017, 15:21
Цитата Сообщение от Joiner Посмотреть сообщение
нужно, что бы в combobox были и названия и ID
Для этого не оптимально использовать ComboBox
0
 Аватар для l34ddx
69 / 66 / 23
Регистрация: 23.07.2014
Сообщений: 121
11.08.2017, 16:37
Лучший ответ Сообщение было отмечено edward_freedom как решение

Решение

Зачем использовать дататэйбл если вы создали и так набор таблиц датасет?
заполняйте датасет таблицами и меняйте датасорс у комбобокса
Вот пример (набросал по-быстрому):
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Imports System.Data.OleDb
Public Class Form1
    Dim mycon As OleDbConnection
    Dim ds As New DataSet
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        mycon = New OleDbConnection
        mycon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Database2.accdb;Persist Security Info=False;"
        mycon.Open()
        Dim c As New OleDbCommand
        c.Connection = mycon
        c.CommandText = "SELECT * from Таблица1"
        c.ExecuteNonQuery()
        Dim da1 As New OleDbDataAdapter(c)
        da1.Fill(ds, "Таблица1")
        c.Connection = mycon
        c.CommandText = "SELECT * from Таблица2"
        c.ExecuteNonQuery()
        da1.Fill(ds, "Таблица2")
        c.Connection = mycon
        c.CommandText = "SELECT * from Таблица3"
        c.ExecuteNonQuery()
        da1.Fill(ds, "Таблица3")
    End Sub
 
    Private Sub RadioButton1_CheckedChanged(sender As Object, e As System.EventArgs) Handles RadioButton1.CheckedChanged
        ComboBox1.DataSource = ds.Tables("Таблица1")
        ComboBox1.DisplayMember = "Поле1"
        ComboBox1.ValueMember = "Код"
        ComboBox1.SelectedItem = Nothing
    End Sub
 
    Private Sub RadioButton2_CheckedChanged(sender As Object, e As System.EventArgs) Handles RadioButton2.CheckedChanged
        ComboBox1.DataSource = ds.Tables("Таблица2")
        ComboBox1.DisplayMember = "Поле1"
        ComboBox1.ValueMember = "Код"
        ComboBox1.SelectedItem = Nothing
    End Sub
 
    Private Sub RadioButton3_CheckedChanged(sender As Object, e As System.EventArgs) Handles RadioButton3.CheckedChanged
        ComboBox1.DataSource = ds.Tables("Таблица3")
        ComboBox1.DisplayMember = "Поле1"
        ComboBox1.ValueMember = "Код"
        ComboBox1.SelectedItem = Nothing
    End Sub
 
    Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.SelectedItem Is Nothing Then
            TextBox1.Text = String.Empty
            Exit Sub
        End If
        TextBox1.Text = ComboBox1.SelectedValue.ToString
    End Sub
End Class
P.S. Текстбокс так ... для проверки АЙДИ выбранной записи)))
0
1 / 1 / 1
Регистрация: 25.03.2014
Сообщений: 67
11.08.2017, 16:58  [ТС]
Цитата Сообщение от SergProgrammer Посмотреть сообщение
Для этого не оптимально использовать ComboBox
Ну почему ж, я в этой же программе многократно использую combobox.DisplayMember и combobox.ValueMember именно для таких ситуаций. Привязываю с помощью combobox.DataSource данные из DataTable и при выборе в combobox получаю ID, который потом гораздо удобнее использовать в запросах к БД, чем просто строку. Да и сами данные в datatable я то же меняю и все работает. А здесь все различие в том, что данные в datatable загружаются из разных таблиц БД и название первого столбца с идентификатором у них разное, поэтому и приходится перенастраивать связь. А это и не прокатывает.

Добавлено через 18 минут
Цитата Сообщение от l34ddx Посмотреть сообщение
Зачем использовать дататэйбл если вы создали и так набор таблиц датасет?
заполняйте датасет таблицами и меняйте датасорс у комбобокса
На счет datatable я, может, неправильно сформулировал, они у меня в dataset находятся. По коду видно.
Спасибо, но что-то я не очень понял. У меня в первом топике практически то же самое написано, разница только в том, что Вы загружаете все три таблицы разом при загрузке формы, а я загружаю по отдельности при нажатии на радиокнопку.
Я, конечно попробую, но разницы со своим кодом особо не вижу. В комбобоксе все пропадает именно в момент попытки заново настроить datasource с другой таблицей из dataset.
0
 Аватар для l34ddx
69 / 66 / 23
Регистрация: 23.07.2014
Сообщений: 121
11.08.2017, 17:37
Цитата Сообщение от Joiner Посмотреть сообщение
я загружаю по отдельности при нажатии на радиокнопку.
Вы каждый раз загружаете одну и ту же информацию одну и ту же таблицу - правильнее её один раз загрузить в таблицу , а потом обновлять , если что-то поменялось в процессе работы программы DA.Update
3
1741 / 1660 / 167
Регистрация: 25.07.2015
Сообщений: 2,719
12.08.2017, 07:20
Joiner, держите , заточите под себя.
Коннектился к свой тестовой базе, потому и не выкладываю проект.
Обратите внимание на Alias-ы (псевдонимы названия столбцов) - должны быть одинаковые во всех запросах.
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
36
37
38
39
40
41
42
43
44
45
Imports System
Imports System.Data.OleDb
Public Class Form1
    Dim con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Проект\dbada.mdb")
    Friend SqlCom As OleDb.OleDbCommand
    Friend DT_Ctrl As New Data.DataTable
    Friend DA As OleDb.OleDbDataAdapter
    Friend sqlRB1 As String = "SELECT ID_marka AS ID ,name_marka AS Field FROM Marka"
    Friend sqlRB2 As String = "SELECT ID_model AS ID,name_model AS Field FROM Modeli"
    Friend sqlRB3 As String = "SELECT ID_parts AS ID,partnum AS Field FROM Parts"
    Friend qSQL As String
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
    End Sub
 
    Private Sub cmbUpdate()
        DT_Ctrl.Clear()
        If con.State = ConnectionState.Closed Then
            con.Open()
        End If
        SqlCom = New OleDb.OleDbCommand(qSQL, con)
        DA = New OleDb.OleDbDataAdapter(SqlCom)
        DA.Fill(DT_Ctrl)
        ComboBox1.ValueMember = "ID"
        ComboBox1.DisplayMember = "Field"
        ComboBox1.DataSource = DT_Ctrl
        con.Close()
    End Sub
 
    Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
        qSQL = sqlRB1
        cmbUpdate()
    End Sub
 
    Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
        qSQL = sqlRB2
        cmbUpdate()
    End Sub
 
 
    Private Sub RadioButton3_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton3.CheckedChanged
        qSQL = sqlRB3
        cmbUpdate()
    End Sub
End Class
Миниатюры
Обновление combobox   Обновление combobox   Обновление combobox  

0
1741 / 1660 / 167
Регистрация: 25.07.2015
Сообщений: 2,719
12.08.2017, 07:21
Joiner, держите , заточите под себя.
Коннектился к свой тестовой базе, потому и не выкладываю проект.
Обратите внимание на Alias-ы (псевдонимы названия столбцов) - должны быть одинаковые во всех запросах.
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
36
37
38
39
40
41
42
43
44
45
Imports System
Imports System.Data.OleDb
Public Class Form1
    Dim con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Проект\dbada.mdb")
    Friend SqlCom As OleDb.OleDbCommand
    Friend DT_Ctrl As New Data.DataTable
    Friend DA As OleDb.OleDbDataAdapter
    Friend sqlRB1 As String = "SELECT ID_marka AS ID ,name_marka AS Field FROM Marka"
    Friend sqlRB2 As String = "SELECT ID_model AS ID,name_model AS Field FROM Modeli"
    Friend sqlRB3 As String = "SELECT ID_parts AS ID,partnum AS Field FROM Parts"
    Friend qSQL As String
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
    End Sub
 
    Private Sub cmbUpdate()
        DT_Ctrl.Clear()
        If con.State = ConnectionState.Closed Then
            con.Open()
        End If
        SqlCom = New OleDb.OleDbCommand(qSQL, con)
        DA = New OleDb.OleDbDataAdapter(SqlCom)
        DA.Fill(DT_Ctrl)
        ComboBox1.ValueMember = "ID"
        ComboBox1.DisplayMember = "Field"
        ComboBox1.DataSource = DT_Ctrl
        con.Close()
    End Sub
 
    Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
        qSQL = sqlRB1
        cmbUpdate()
    End Sub
 
    Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
        qSQL = sqlRB2
        cmbUpdate()
    End Sub
 
 
    Private Sub RadioButton3_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton3.CheckedChanged
        qSQL = sqlRB3
        cmbUpdate()
    End Sub
End Class
Миниатюры
Обновление combobox   Обновление combobox   Обновление combobox  

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2017, 07:21
Помогаю со студенческими работами здесь

Обновление combobox
Доброго времени суток. В вэбе я новичок, есть такая задача: вытянуть из БД факультеты в комбобокс, после выбора факультета в комбобоксе...

Обновление Combobox
Всем Ку! Только начинаю осваивать WPF, поэтому попрошу не кидаться камнями! Есть программа в которой реализован combobox , необходимо,...

Обновление comboBox
Сейчас я обновляю список портов таким образом comboBox_ports.Items.Clear(); foreach(string portname in SerialPort.GetPortNames()) { ...

Обновление combobox
У меня такая ситуация, есть форма на которой combobox, возле него кнопка новый, при нажатии открывается форма я ввожу туда запись, и она...

Обновление данных в ComboBox - С#
Здравствуйте. У меня имеются 2 формы: Form1 и Form2, в Form1 у меня находится ComboBox, связанный с БД SQL Server, с выпадающим списком и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru