تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] تغيير لون بعض Items فى Combobox بناء على اختيارات Combobox آخر
#1
Lightbulb 
هذه هى واجهة البرنامج



كل Combobox من الأربعة السفلى يعتمد على اختيار ما قبله
ما أريده هو أنه عندما يتم اخيار Available فى Combobox المسمى Status كما بالصورة



يتغير لون items فى Combobox المسمى Name والتى يكون مسجلاً أمامها Yes
فى قاعدة البيانات فى خانة Available كما بالصورة



البرنامج بالمرفقات
وهذا هو كود البرنامج لمن لا يتمكن من التحميل:
كود :
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 Food = '" & 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 Clothes = '" & 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


الملفات المرفقة
.rar   Store.rar (الحجم : 81.78 ك ب / التحميلات : 14)
الرد
تم الشكر بواسطة:
#2
Display Colors in ComboBox from aRGB Value item
الرد
تم الشكر بواسطة: معاند الحظ , ابراهيم ايبو
#3
حاولت وتوصلت لهذا الكود:

كود :
Private Sub ComboName_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboName.DrawItem

        If e.Index = -1 Then Return

        Dim myFont As Font = New Font("times new roman", 10, FontStyle.Regular)
        Dim mycolor As New Color
        Dim myBrush As Brush = Brushes.Black
        Dim rect As Rectangle = New Rectangle(0, e.Bounds.Top, e.Bounds.Width - 1, e.Bounds.Height - 1)

        e.DrawBackground()
        e.DrawFocusRectangle()

        Select Case ComboName.Items(e.Index).ToString
            Case "GOOD"
                mycolor = Color.Pink
            Case Else
                mycolor = Color.White
        End Select

        If e.State = DrawItemState.Selected Then
            myBrush = Brushes.Red
        Else
            myBrush = Brushes.Black
        End If

        e.Graphics.DrawRectangle(New Pen(mycolor), rect)
        e.Graphics.FillRectangle(New SolidBrush(mycolor), rect)
        rect.Inflate(1, 1)
        e.Graphics.DrawString(ComboName.Items(e.Index).ToString(), myFont, myBrush, e.Bounds, StringFormat.GenericDefault)

    End Sub

ولكن الخلفية دائماً (بيضاء) والنص (أسود) لكل items وأنا لا أعرف كيفية تفعيل "case "GOOD لتغييره
وبعدها ربط قاعدة البيانات به كما ذكرت
الرد
تم الشكر بواسطة: ابراهيم ايبو
#4
لتسهيل الفكرة هذا هو تصميم برنامجى وكل combobox اسمه فى design مكتوب بالأحمر:



كما أننى حاولت تعديل كود Drawitem ووصلت للتالى:

كود :
   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

ولكنى لم أستطع ربط drawitem event بقاعدة البيانات وتعديل الكود الخاص بذلك
الرد
تم الشكر بواسطة: ابراهيم ايبو
#5
upppppppppppppppppppppppppppp
الرد
تم الشكر بواسطة: ابراهيم ايبو



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم