Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229

DataTable с условием выборки как источник данных для Combobox

07.04.2019, 17:35. Показов 6939. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, приветствую!

Есть TestDataTable с данными.
Необходимо заполнить Combobox1 из TestDataTable с условием, что столбец Pressure_for_search >= цифры из Textbox1
Вот так попробовал, не захотел код работать.
VB.NET
1
2
3
4
5
    Private Sub TextBox1_Validated(sender As Object, e As EventArgs) Handles TextBox1.Validated
        Dim strSelectText As String = "Pressure_for_search >= " & TextBox1.Text
        ComboBox1.DataSource = Form_Main.TestDataTable.Select(strSelectText)
        ComboBox1.DisplayMember = "Main_tube_type"
    End Sub
И никак не придумаю, как решить задачу. Вся надежда на Вас.

С уважением, Алексей.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2019, 17:35
Ответы с готовыми решениями:

Запрос с заполнением данных( с двойным условием выборки)
Доброго времени суток. Есть задача следующего плана: Составляется документ "Разность Номенклатур"(название придумал...

Как для Combobox, который сделан в UserControl, установить источник привязки List<string>
Здравствуйте. Подскажите пожалуйста такую вещь. Я сделал Combobox в UserControl. Затем я программно создаю экземпляр этого UserControl и...

Фильтр данных в ComboBox + DataTable
Дано: 2 Combobox, 1 DataTable. DataTable является источником данных для Combobox. DataTable состоит из трех столбцов: Имя,...

50
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
09.04.2019, 07:19
Студворк — интернет-сервис помощи студентам
Allleksey, используйте операторы AND/OR/IN//LIKE(полный перечень у мелкомягких). По сути SQL запрос.
0
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 839
09.04.2019, 08:53
Использовал разные способы фильтрования данных в дататабле:
1
VB.NET
1
2
dt2.DefaultView.RowFilter = "(Convert([колличество],System.String) >= 16)"
2 dwe.RowFilter = "колличество >= '16'"
при вывод в MsgBox(str) получаются разные результаты
на рисунке 1 по 1-му способу
на 2-м рисунке по 2-му способу
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
Public Class Form1
    Public dt1, dt2 As DataTable
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        dt1 = New DataTable
        dt1.Columns.Add("Продукты")
        dt1.Columns.Add("колличество")
        dt1.Rows.Add(New String() {"Яблоки", "45"})
        dt1.Rows.Add(New String() {"Помидоры", "12"})
        dt1.Rows.Add(New String() {"Тыквы", "25"})
        dt1.Rows.Add(New String() {"кабачки", "34"})
        dt2 = dt1
        DataGridView1.DataSource = dt1
        DataGridView1.Columns(0).Width = 100
        DataGridView1.Columns(1).Width = 100
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim str As String = Nothing
        Dim str1 As String = Nothing
        dt2 = New DataTable
        dt2 = dt1.Copy
        dt2.DefaultView.RowFilter = "(Convert([колличество],System.String) >= 16)"
        For Each r In dt2.Rows
            str += r("Продукты") & vbTab & r("колличество") & vbCrLf
        Next
        MsgBox(str)
        ComboBox1.DataSource = dt2
        ComboBox1.DisplayMember = "колличество"
        Dim dwe As DataView
        dwe = New DataView(dt2)
        dwe.RowFilter = "колличество >= '16'"
        For Each r1 In dwe
            str1 += r1("Продукты") & vbTab & r1("колличество") & vbCrLf
        Next
        MsgBox(str1)
        DataGridView2.DataSource = dt2
        DataGridView2.Columns(0).Width = 100
        DataGridView2.Columns(1).Width = 100
        ComboBox2.DataSource = dwe
        ComboBox2.DisplayMember = "колличество"
        DataGridView3.DataSource = dwe
        DataGridView3.Columns(0).Width = 100
        DataGridView3.Columns(1).Width = 100
    End Sub
End Class
хотя в комбобоксы все правильно заносится
Миниатюры
DataTable с условием выборки как источник данных для Combobox   DataTable с условием выборки как источник данных для Combobox  
0
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 839
09.04.2019, 09:27
Jungl,Ввел в коды дата табле 3 и получается что ваш код не работает может уменя где ошибка?
через DataView все нормально фильтрует
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
Public Class Form1
    Public dt1, dt2, dt3 As DataTable
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        dt1 = New DataTable
        dt1.Columns.Add("Продукты")
        dt1.Columns.Add("колличество")
        dt1.Rows.Add(New String() {"Яблоки", "45"})
        dt1.Rows.Add(New String() {"Помидоры", "12"})
        dt1.Rows.Add(New String() {"Тыквы", "25"})
        dt1.Rows.Add(New String() {"кабачки", "34"})
        dt2 = dt1
        DataGridView1.DataSource = dt1
        DataGridView1.Columns(0).Width = 100
        DataGridView1.Columns(1).Width = 100
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim str As String = Nothing
        Dim str1 As String = Nothing
        dt2 = New DataTable
        dt2 = dt1.Copy
        dt3 = New DataTable
        dt3 = dt1.Copy
        dt2.DefaultView.RowFilter = "(Convert([колличество],System.String) >= 16)"
        For Each r In dt2.Rows
            str += r("Продукты") & vbTab & r("колличество") & vbCrLf
        Next
        MsgBox(str)
        ComboBox1.DataSource = dt2
        ComboBox1.DisplayMember = "колличество"
        Dim dwe As DataView
        dwe = New DataView(dt3)
        dwe.RowFilter = "колличество >= '16'"
        For Each r1 In dwe
            str1 += r1("Продукты") & vbTab & r1("колличество") & vbCrLf
        Next
        MsgBox(str1)
        DataGridView2.DataSource = dt3
        DataGridView2.Columns(0).Width = 100
        DataGridView2.Columns(1).Width = 100
        ComboBox2.DataSource = dwe
        ComboBox2.DisplayMember = "колличество"
        DataGridView3.DataSource = dwe
        DataGridView3.Columns(0).Width = 100
        DataGridView3.Columns(1).Width = 100
    End Sub
End Class
Сотовественно в MsgBox(str) и MsgBox(str1) все так же как и у меня на тех рисунках. Может кто подскажет где у меня ошибка? Заранее благодарен за помощь
0
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
09.04.2019, 09:43
andrsh, при DataTable я не увидел у вас .DefaultView.ToTable
0
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 839
09.04.2019, 11:37
Jungl, Спасибо действительно пропустил теперь все ОК
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
09.04.2019, 14:02  [ТС]
Коллеги, прошу прощения, но продолжу в этой же теме. Итоговый код со всеми фильтрами получился такой:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Sub FillCB()
        If TextBox1.Text <> "" Then
            Dim DataTableTest As New Data.DataTable
            DataTableTest = Form_Main.DTCombobox40
            Dim strSelectComand As String = "Pressure_for_search >= " & TextBox1.Text
            DataTableTest.DefaultView.RowFilter = "(Convert([Main_tube_material],System.String) Like '" & Form_Main.ComboBox33.Text & "' 
            AND Convert([Pressure_for_search],System.String) >= " & intPressureSearch & "
            And Convert([Temperature_for_search],System.String) >= " & intTemperatureSearch & "
            And Convert([Main_tube],System.String) LIKE '" & Form_Main.type & "'
            And Convert([Work_line],System.String) LIKE 'yes')"
            DataTableTest = DataTableTest.DefaultView.ToTable
            ComboBox1.DataSource = DataTableTest
            ComboBox1.DisplayMember = "Main_tube_type"
        End If
    End Sub
Но теперь есть продолжение вопроса. В Combobox есть повторяющиеся позиции. Как оставить в Combobox только уникальные строки?
0
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 839
09.04.2019, 17:12
Allleksey, Сначала наверное надо удалить повторяющиеся значения из твоей DataTableTest с помощью данной функции а потом отфильтровать значения из нее и выбрать в комбобокс. Данная тема "Удаление повторов в DATATABLE" была уже на форуме. Это от туда.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Function CropeArr(ByVal Arr As System.Data.DataTable) As System.Data.DataTable
        Dim dt As New System.Data.DataTable
        Dim columns() As DataColumn = {New DataColumn("Names"), New DataColumn(Arr.Columns.Item(1).ColumnName)}
        dt.Columns.AddRange(columns)
        dt.TableName = Arr.TableName
        Dim keys(1) As DataColumn
        keys(0) = dt.Columns("Names")
        dt.PrimaryKey = keys
        Dim rw As System.Data.DataRow
 
        For w = 0 To Arr.Rows.Count - 1
            Try
                rw = dt.NewRow()
                rw!Names = Arr.Rows(w)!Names
                rw.Item(1) = Arr.Rows(w).Item(1)
                dt.Rows.Add(rw)
            Catch ex As ConstraintException 'Играет роль хеш-функции
            End Try
        Next
        Return dt
    End Function
Я думаю переделать под себя тебе не трудно будет.
0
1548 / 1525 / 325
Регистрация: 03.10.2012
Сообщений: 1,555
09.04.2019, 17:47
Лучший ответ Сообщение было отмечено Allleksey как решение

Решение

Цитата Сообщение от andrsh Посмотреть сообщение
Catch ex As ConstraintException 'Играет роль хеш-функции
Я бы не стал использовать обработчик ошибок в качестве хеш-функции.
Предлагаю такой вариант (если не предполагается использование свойства ValueMember комбобокса).
Вместо 12-13 строк в коде Allleksey:
VB.NET
1
2
3
4
5
Dim hash As New HashSet(Of String)
For Each s In (From r In DataTableTest.Rows Select r.Item("Main_tube_type")).ToList
    hash.Add(s)
Next
ComboBox1.DataSource = hash.ToList
2
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
09.04.2019, 18:16  [ТС]
Цитата Сообщение от MrCrown Посмотреть сообщение
Я бы не стал использовать обработчик ошибок в качестве хеш-функции.
Вот до этого мне еще очень далеко. Я понимаю, что я не то, что бы поверхностно что то понимаю... Я лишь прикоснулся...
СПАСИБО

С уважением, Алексей.
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
19.04.2019, 08:00  [ТС]
Jungl, пытаюсь сделать фильтр по дробному числу.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim dblPressureSearch As Double
            If Me.TextBox7.Text = Nothing Then
                dblPressureSearch = 0
            Else
                dblPressureSearch = Me.TextBox7.Text
            End If
            ' Копия DataTable для фильтра и устранения повторений.
            Dim DataTableTest As New Data.DataTable
            DataTableTest = Me.DTCombobox6_1
            ' Запрос в DataTable с фильтром. Отбор значений по параметрам.
            DataTableTest.DefaultView.RowFilter = "(Convert([Pressure_for_search],System.String) >= " & dblPressureSearch & ")"
            DataTableTest = DataTableTest.DefaultView.ToTable
            If DataTableTest.Rows.Count <> 0 Then
                Me.ComboBox6.DataSource = DataTableTest
                Me.ComboBox6.DisplayMember = "Flange_pressure_rating_type"
            Else
                Me.ComboBox6.DataSource = Nothing
                Me.ComboBox6.Items.Clear()
                Me.ComboBox6.Items.Add("нет")
                Me.ComboBox6.SelectedIndex = 0
                Me.key4_6 = "?"
            End If
Пока dblPressureSearch содержит целое число, все работает. Когда в переменной число с запятой, выдается сообщение об ошибке: "System.Data.SyntaxErrorException: "Синтаксическая ошибка в данном выражении.""
В таблице столбец Pressure_for_search числовой одинарный с плавающей запятой.

Никак не пойму, в чем причина.
0
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
19.04.2019, 12:43
Цитата Сообщение от Allleksey Посмотреть сообщение
В таблице столбец Pressure_for_search числовой одинарный с плавающей запятой.
Замените на точку, будет работать?
1
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
19.04.2019, 13:57  [ТС]
Цитата Сообщение от Jungl Посмотреть сообщение
Замените на точку, будет работать?
@&#%@!!! (Это я выругался)
Второй раз наступаю на одни и те же грабли, и никак не могу запомнить, что надо для начала вот такой фокус провернуть.
Спасибо. Если кому интересно, итоговый код вот так выглядит:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            Dim dblPressureSearch As Double
            If Me.TextBox7.Text = Nothing Then
                dblPressureSearch = 0
            Else
                dblPressureSearch = Me.TextBox7.Text
            End If
            ' Копия DataTable для фильтра и устранения повторений.
            Dim DataTableTest As New Data.DataTable
            DataTableTest = Me.DTCombobox6_1
            ' Запрос в DataTable с фильтром. Отбор значений по параметрам.
            DataTableTest.DefaultView.RowFilter = "(Convert([Pressure_for_search],System.String) >= " & dblPressureSearch.ToString.Replace(",", ".") & ")"
            DataTableTest = DataTableTest.DefaultView.ToTable
            If DataTableTest.Rows.Count <> 0 Then
                Me.ComboBox6.DataSource = DataTableTest
                Me.ComboBox6.DisplayMember = "Flange_pressure_rating_type"
            Else
                Me.ComboBox6.DataSource = Nothing
                Me.ComboBox6.Items.Clear()
                Me.ComboBox6.Items.Add("нет")
                Me.ComboBox6.SelectedIndex = 0
                Me.key4_6 = "?"
            End If
0
2 / 2 / 0
Регистрация: 19.04.2019
Сообщений: 58
22.04.2019, 14:26
Allleksey, Хотел применить ваш код но у меня почему-то выскакивает вот такая ошибка:
System.Data.EvaluateException: "Невозможно выполнить операцию ">=" над System.String и System.Int32." в строке
VB.NET
1
DataTableTest.DefaultView.RowFilter = "(Convert([кол_во],System.String) >= " & dblPressureSearch.ToString.Replace(",", ".") & ")"
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
22.04.2019, 14:42  [ТС]
Цитата Сообщение от _Alectr_21 Посмотреть сообщение
System.Data.EvaluateException: "Невозможно выполнить операцию ">=" над System.String и System.Int32."
В таблице в столбце Кол-во данные какого типа хранятся? Должны быть цифровые.
0
2 / 2 / 0
Регистрация: 19.04.2019
Сообщений: 58
22.04.2019, 14:52
Allleksey, да там хранятся как целые числа так и с запятой

Добавлено через 7 минут
Если вводится число для фильтрации типа 45,3 то все нормально. Если вводится число для фильтрации типа 45 или даже 45,0 то выскакивает эта ошибка.
0
4 / 4 / 0
Регистрация: 24.02.2016
Сообщений: 229
22.04.2019, 15:03  [ТС]
_Alectr_21, весь код покажите.
0
2 / 2 / 0
Регистрация: 19.04.2019
Сообщений: 58
22.04.2019, 15:07
Код тот же самый только в самом конце изменения
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Dim dblPressureSearch As Double
        If TextBox6.Text = Nothing Then
            dblPressureSearch = 0
        Else
            dblPressureSearch = TextBox6.Text
        End If
        ' Копия DataTable для фильтра и устранения повторений.
        Dim DataTableTest As New Data.DataTable
        DataTableTest = dt1
        ' Запрос в DataTable с фильтром. Отбор значений по параметрам.
        DataTableTest.DefaultView.RowFilter = "(Convert([кол_во],System.String) >= " & dblPressureSearch.ToString.Replace(",", ".") & ")"
        DataTableTest = DataTableTest.DefaultView.ToTable
        DataGridView2.DataSource = DataTableTest
        DataGridView1.Columns(0).Width = 100
        DataGridView1.Columns(1).Width = 100
    End Sub
0
1801 / 1788 / 173
Регистрация: 25.07.2015
Сообщений: 2,905
22.04.2019, 16:32
Здесь у вас как-то всё не очень.
Цитата Сообщение от _Alectr_21 Посмотреть сообщение
DataTableTest.DefaultView.RowFilter = "(Convert([кол_во],System.String) >= " & dblPressureSearch.ToString.Replace(",", ".") & ")"
Зачем скобки первые и последние, где апострофы вокруг dblPressureSearch ,
если уж хотите , чтобы вернулось строковое представление данных, конвертация не правильно записана...
вернее правильно , но для sql , а не для vb.net. К слову из-за того , что вы её не обернули в амперсанд,
Convert([кол_во],System.String) у вас воспринимается просто как текст
Должно быть что-то типа такого видимо, исходя из вами написаного
VB.NET
1
DataTableTest.DefaultView.RowFilter = "'" & System.Convert.ToString("[кол_во]") & "' >= '" & dblPressureSearch.ToString.Replace(",", ".") & "' "
Хотя сравнивать строковые значения -не самая лучшая идея , тем более , что изначально они
цифровые , на сколько я понимаю .
0
2 / 2 / 0
Регистрация: 19.04.2019
Сообщений: 58
22.04.2019, 16:41
Kulma, Значения действительно числовые. Есть целые числа в столбце и дробные через запятую. Может подскажете что-нибудь?
0
1801 / 1788 / 173
Регистрация: 25.07.2015
Сообщений: 2,905
22.04.2019, 16:57
_Alectr_21, да собственно всё уже подсказал )))
Уберите конвертацию в строковое представление и всё должно получиться.
Наверное так как-то
VB.NET
1
DataTableTest.DefaultView.RowFilter = "[кол_во] >= "& Replace(dblPressureSearch,",", ".") &" "
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2019, 16:57

FoxPro как источник данных для PHP
Еарод препод задал создате базу в FoxPro и создать PHP страницу которая будет брать инфу из этой базы! Помогите кто может, вообще не...

Dictionary как источник данных для dataGridView
Здравствуйте! Можно ли для dataGridView в качестве источника данных использовать Dictionary? Если можно, подскажите как? (нужно чтобы при...

Как задать источник данных для отчета из кода?
Подскажите как задать в VB2010 источник данных для отчета из кода. На форме имеется грид, заполненный данными с sql сервера, reportviewer: ...

SQL запрос как источник для данных в форме
Все. не могу больше. не допирает до меня, дятел я, пните в правильном направлении, плиз. Дано: База на SQLServer. Форма в VB. Надо:...

Источник значений для comboBox из удобной bytesroad.netsuit
Здравствуйте. Сделал &quot;Project&quot; -&gt; &quot;Add reference&quot; -&gt; &quot;BytesRoad.Net.Ftp.dll, BytesRoad.Net.Sockets.dll, BytesRoad.Diag.dll&quot; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru