Управление цветом некоторых элементов combobox с помощью другого выбора combobox
Это моя форма и дизайн базы данных:
https://www5.0zz0.com/2020/04/15/18/890159245.jpg[^]
нижние комбо-боксы зависят друг от друга при загрузке элементов из базы данных
все, что я хочу, это когда я выбираю (доступно) в выпадающем списке с именем (статус), как это:
https://www5.0zz0.com/2020/04/05/13/182870544.jpg[^]
элементы в выпадающем списке (имя), который имеет (Да) в базе данных, соответствующие
чтобы столбец (доступный) изменил цвет на красный.
вот мой код:
Imports System.Data.OleDb Public Class Form1 Dim cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Stock.accdb") Dim da As OleDbDataAdapter Dim cm As OleDbCommandBuilder Dim cmd As OleDbCommand Dim itemRoute As String() Private Sub ComboType_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboType.SelectedIndexChanged ComboName.Items.Clear() ComboQuantity.Items.Clear() ComboStore.Items.Clear() If ComboType.SelectedItem = "Food" Then Dim dt1 As New DataTable dt1.Clear() Dim sql As String = "SELECT * FROM Food" da = New OleDbDataAdapter(sql, cnn) cm = New OleDbCommandBuilder(da) da.Fill(dt1) For ii As Integer = 0 To dt1.Rows.Count - 1 ComboName.Items.Add(dt1(ii)(0)) Next End If If ComboType.SelectedItem = "Clothes" Then Dim dt1 As New DataTable dt1.Clear() Dim sql As String = "SELECT * FROM Clothes" da = New OleDbDataAdapter(sql, cnn) cm = New OleDbCommandBuilder(da) da.Fill(dt1) For ii As Integer = 0 To dt1.Rows.Count - 1 ComboName.Items.Add(dt1(ii)(0)) Next End If End Sub Private Sub ComboName_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboName.SelectedIndexChanged ComboQuantity.Items.Clear() ComboStore.Items.Clear() If ComboType.SelectedItem = ("Food") Then Dim dt2 As New DataTable dt2.Clear() Dim sql2 As String = "SELECT * FROM Food WHERE FoodName = '" & ComboName.SelectedItem & "'" da = New OleDbDataAdapter(sql2, cnn) cm = New OleDbCommandBuilder(da) da.Fill(dt2) Dim quants As String = dt2(0)(1) Dim quant As String() = quants.Split("-") For ii As Integer = 0 To quant.Count - 1 ComboQuantity.Items.Add(quant(ii)) Next Dim stores As String = dt2(0)(2) Dim store As String() = stores.Split("-") itemRoute = store End If If ComboType.SelectedItem = ("Clothes") Then Dim dt2 As New DataTable dt2.Clear() Dim sql2 As String = "SELECT * FROM Clothes WHERE ClothesName = '" & ComboName.SelectedItem & "'" da = New OleDbDataAdapter(sql2, cnn) cm = New OleDbCommandBuilder(da) da.Fill(dt2) Dim quants As String = dt2(0)(1) Dim quant As String() = quants.Split("-") For ii As Integer = 0 To quant.Count - 1 ComboQuantity.Items.Add(quant(ii)) Next Dim stores As String = dt2(0)(2) Dim store As String() = stores.Split("-") itemRoute = store End If End Sub Private Sub ComboQuantity_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboQuantity.SelectedIndexChanged ComboStore.Items.Clear() ComboStore.Items.Add(itemRoute(ComboQuantity.SelectedIndex)) End Sub End Class
Что я уже пробовал:
попробовал с событием drawitem второго combobox (Comboname)
но не смог изменить привязку базы данных к нему
Private Sub ComboName_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboName.DrawItem If e.Index = -1 Then Return e.DrawBackground() Dim item = DirectCast(ComboName.Items(e.Index), DataRowView) 'Anothe Failed Line: 'Dim item As DataRowView = CType(ComboName.Items(e.Index), DataRowView) Dim text = ComboName.GetItemText(item) Dim available = CBool(item("Available")) Using brush As New SolidBrush(If(available, Color.Red, e.ForeColor)) e.Graphics.DrawString(text, e.Font, brush, e.Bounds) End Using End Sub
Richard Deeming
Dim sql2 As String = "SELECT * FROM Food WHERE FoodName = '" & ComboName.SelectedItem & "'"
Dim sql2 As String = "SELECT * FROM Clothes WHERE ClothesName = '" & ComboName.SelectedItem & "'"
Не делай этого так!
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
Dim dt2 As New DataTable Using cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Stock.accdb") Const sql2 As String = "SELECT * FROM Food WHERE FoodName = @Name" Dim da As New OleDbDataAdapter(sql2, cnn) da.SelectCommand.Parameters.AddWithValue("@Name", ComboName.SelectedItem) da.Fill(dt2) End Using
Кроме того, не храните соединения, команды или адаптеры данных в виде полей. Создайте их в точке, где они необходимы, и оберните соединения и команды в
Using
блоки.И вам вообще не нужен командный конструктор, так как вы никогда им не пользуетесь.
Doctor GME
спасибо за ценные замечания
я буду держать это в моей голове