السلام عليكم ....
عملت في مشروع , طلب فيه تلوين سطر في DataGridView او عقدة في Tree , بحيث أن المستخدم هو الذي يحدد هذا اللون (مثلا المستخدم يريد تلوين السجلات التي لم يتأكد تماما من بياناتها باللون الأصفر بحيث يسهل عليه إيجادها لاحقا) ... و أحببت مشاركتكم الأكواد ...
يتم حفظ اللون في قاعدة البيانات كرقم صحيح ..
يتم تحويل اللون لرقم بالدالة :
ColorDialog1.Color.ToArgb()
يتم تحويل الرقم إلى لون بالدالة :
Color.FromArgb
لتلوين أسطر الغريد مباشرة , عند إضافتها , نستخدم الحدث RowsAdded ..
الكود كاملا :
Imports System.Data.OleDb
Public Class Form1
Dim adapter As OleDbDataAdapter
Dim dt As New DataTable
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=" + Application.StartupPath + "\db.mdb" + ";Persist Security Info=False")
adapter = New OleDbDataAdapter("SELECT * FROM Employee", connection)
adapter.Fill(dt)
DataGridView1.AutoGenerateColumns = False
DataGridView1.DataSource = dt
End Sub
Private Sub BtnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave.Click
DataGridView1.EndEdit(DataGridViewDataErrorContexts.CurrentCellChange)
Dim commandBuilder As New OleDbCommandBuilder(adapter)
adapter.Update(dt)
'to reload new ID
dt.Clear()
adapter.Fill(dt)
MsgBox("Save OK....")
End Sub
Private Sub BtnChangeColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnChangeColor.Click
If DataGridView1.SelectedRows.Count = 0 Then
DataGridView1.CurrentRow.Selected = True
'MsgBox("No rows were selected, Select full row from row header.")
'Exit Sub
End If
If ColorDialog1.ShowDialog <> Windows.Forms.DialogResult.Cancel Then
Dim drv As DataRowView
Dim dr As DataRow
For Each dgvRow As DataGridViewRow In DataGridView1.SelectedRows
If dgvRow.IsNewRow Then Exit For
drv = dgvRow.DataBoundItem
dr = drv.Row
dr("RowColor") = ColorDialog1.Color.ToArgb()
dgvRow.DefaultCellStyle.BackColor = ColorDialog1.Color
Next
End If
End Sub
Private Sub DataGridView1_RowsAdded(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
Dim drv As DataRowView
Dim dr As DataRow
Dim dgvRow As DataGridViewRow
For index = e.RowIndex To e.RowIndex + e.RowCount - 1
dgvRow = DataGridView1.Rows(index)
If dgvRow.IsNewRow Then Exit For
drv = dgvRow.DataBoundItem
dr = drv.Row
If Not IsDBNull(dr("RowColor")) Then
dgvRow.DefaultCellStyle.BackColor = Color.FromArgb(dr("RowColor"))
Else
dgvRow.DefaultCellStyle = Nothing
End If
Next
End Sub
End Classو المثال في المرفقات ..
تطوير المثال :
سنقوم بتعديل المثال بحيث يمكننا طباعة الألوان في كريستال ريبورت ..
نضيف ثلاثة حقول للجدول R G B من نوع Number و حجم كل منها Byte (كي لا نهدر مساحة القاعدة) ... لحفظ اللون بالتنسيق RGB .. (نلغي حقل اللون السابق)
كريستال ريبوت فيه الدالة Color التي تأخذ ثلاث وسطاء أرقام هي R G B ..
من Section Expert نأخذ Details ثم التبويب Color ثم نضغط على زر الصيغة (x-2) الخاصة باللون و نكتب الكود :
Color ({Employee.R}, {Employee.G}, {Employee.B})أي سيتم تلوين خلفية السجل الحالي حسب قيم R G B في السجل الحالي ..
المثال في المرفقات ..

