تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] مشكلة في تغيير لون خلفية الخلية في ال Datagridview
#1
السلام عليكم ورحمة الله وبركاته 
اولا اشكر جميع القائمين على هذا المنتدى الرائع على جهودهم المبذولة من اجل اثراء المحتوى العربي 
نأتي الى المشكلة 
ساقوم بعرض مثال مبسط في الصورة رقم 1 في المرفقات يظهر فورم به 3 عناصر
كامبوبوكس لادخال القيم و زر لإضافة القيم الى جدول و   Datagridview لعرض الجدول 
قمت بكتابة هذا الكود من اجل تحديد لون الخلية المضافة في العمود الثاني 
حيث يكون لونها ابيض اذا كانت فارغة و احمر اذا كانت تحتوي قيمة كما يظهر في الصورة رقم 2
Private Sub DataGridView1_RowsAdded(sender As Object, e As DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
    Dim ccc As Integer

    For ccc = 0 To DataGridView1.Rows.Count - 1
        If DataGridView1.Rows(ccc).Cells(1).Value.ToString <> "" Then
            DataGridView1.Rows(ccc).Cells(1).Style.BackColor = Color.Red
        End If
    Next
End Sub

بعدها كتبت كود اخر لتغيير لون الخلفية للأخضر اذا تم الضغط عليها مرتين كما في الصورة 3
Private Sub DataGridView1_CellMouseDoubleClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick
    DataGridView1.CurrentCell.Style.BackColor = Color.Green
End Sub

الى هنا كل شيء تمام.... المشكلة تبدأ عن اضافة سطر جديد حيث يختفي اللون الاخضر و يعود كل شيء
كما كان هذا ما تظهره الصورة رقم 4
اللون الأخضر يختفي عند اضافة السطر الذي يحتوي على القيمة 333
المطلوب هو طريقة للإبقاء على اللون الأخضر بعد اضافة السطر الجديد
ملاحظة :
جربت العمل بالاحداث cellformating,  cellpainting, rowprepaint
من اجل جعل الخلية المضافة باللون الاحمر اذا كانت بها قيمة لكن المشكلة هي
انني لا استطيع تغيير لونها بعد ذلك بكل الطرق!!! 
في انتظار ردودكم


الملفات المرفقة صورة/صور
               
الرد }}}
تم الشكر بواسطة:
#2
السلام عليكم

سبب اختفاء اللون الاخضر و يعود كل شيء عند إضافة سطر جديد هو أنك عامل حلقة For تمر على الأسطر من بدايتها إلى نهايتها فهنا سوف يعيد الالوان حسب الشرط الموجود

هذا تصحيح للكود
كود :
Private Sub DataGridView1_RowsAdded(sender As Object, e As DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded

   ' التأكد من إنشاء الخلية
   If DataGridView1.Rows(e.RowIndex).Cells(1).Value IsNot Nothing Then

       ' التأكد من محتوى الخلية
       If DataGridView1.Rows(e.RowIndex).Cells(1).Value.ToString <> "" Then

           ' تلوين خلفية الخلية
           DataGridView1.Rows(e.RowIndex).Cells(1).Style.BackColor = Color.Red

       End If

   End If

   ' إظهار السطر الجديد في الواجهة
   DataGridView1.FirstDisplayedScrollingRowIndex = e.RowIndex

End Sub

تم إضافة كود لاظهار السطر الجديد المضاف في الواجهة، ترى تأثيره إذا كانت الأسطر كثيرة تجاوزت الأسطر الظاهرة في الأداة
الرد }}}
تم الشكر بواسطة:
#3
الف شكر اخي مساعدة على المساعدة
سيتم التجريب و الرد لاني اتصل الان عبر الهاتف
الرد }}}
تم الشكر بواسطة:
#4
السلام عليكم

قمت بتجريب الكود اخي الكريم لكن للاسف لم يعمل... فوق هذا لم تعد الخلايا تتلون بالاحمر اساسا هههه

لذلك ارفقت سليوشن المشروع بالكود خاصتك وقمت بجعل الكود القديم كومنت


الملفات المرفقة
.rar   WindowsApplication8.rar (الحجم : 728.39 ك ب / التحميلات : 37)
الرد }}}
تم الشكر بواسطة:
#5
مشروعك لم يعمل لدي لاختلاف الاصدار

الكود السابق كان على اساس لا يوجد قاعدة بيانات

بعد الاطلاع على أكواد المشروع
تفضل الكود
كود :
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'ExpatsTableAdapter.InsertQuery(ComboBox1.Text)
    'ExpatsTableAdapter.Fill(RecoordDataSet.Expats)

    Dim row As RecoordDataSet.ExpatsRow = Me.RecoordDataSet.Expats.NewRow
    row.ExpatsNames = ComboBox1.Text
    Me.RecoordDataSet.Expats.Rows.Add(row)
    ExpatsTableAdapter.Update(RecoordDataSet.Expats)

End Sub

ملاحظة في هذا الكود لن يتم الاحتفاظ على الخلايا التي تم تحديدها باللون الأخضر
الرد }}}
تم الشكر بواسطة:
#6
الف شكر اخي
يعني بقيت نفس المشكلة Sad
الظاهر لا يوجد حل لهذه المعضلة من الافضل ان ابحث عن طريقة اخرى لاتمام المشروع
الرد }}}
تم الشكر بواسطة:
#7
إذا أردت الاحتفاظ باللون الاخضر لابد من إضافة عمود يشير لذلك في قاعدة البيانات
الرد }}}
تم الشكر بواسطة:
#8
لم افهم قصدك اخي ... يمكن توضح اكثر؟
الرد }}}
تم الشكر بواسطة:
#9
أضف عمود في قاعدة البيانات وليكن اسمه Green من نوع bit

في ملف الداتاسيت اضف عمود جديد اسمه مطابق لما أضفته لقاعدة البيانات وهو Green ونوع بياناته Boolean

اضف كويري كما فعلت في اضافة InsertQuery ولكن هنا تختار UpdateQuery وتضع هذا النص فيه
كود :
UPDATE [dbo].[Expats] SET [Green] = @Green WHERE (([Id] = @Original_Id);
SELECT Id, ExpatsNames, Green FROM Expats WHERE (Id = @Id)

وفي كود الفورم هذه التعديلات
كود :
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'TODO: This line of code loads data into the 'RecoordDataSet.Expats' table. You can move, or remove it, as needed.
    Me.ExpatsTableAdapter.Fill(Me.RecoordDataSet.Expats)

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim row As RecoordDataSet.ExpatsRow = Me.RecoordDataSet.Expats.NewRow

    row.ExpatsNames = ComboBox1.Text
    row.Green = False
    Me.RecoordDataSet.Expats.Rows.Add(row)

    ExpatsTableAdapter.Update(RecoordDataSet.Expats)

End Sub

Private Sub DataGridView1_CellMouseDoubleClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick

    Me.DataGridView1.CurrentRow.Cells(1).Style.BackColor = Color.Green

    Dim id As Integer = ExpatsBindingSource.Current("ID")
    Dim row As RecoordDataSet.ExpatsRow =
        Me.RecoordDataSet.Expats.Where(Function(x) x.Id = id).FirstOrDefault

    row.ExpatsNames = row.ExpatsNames
    row.Green = True

    ExpatsTableAdapter.Update(RecoordDataSet.Expats)

End Sub

Private Sub DataGridView1_RowsAdded(sender As Object, e As DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded

    For i = 0 To DataGridView1.Rows.Count - 1

        Dim row As RecoordDataSet.ExpatsRow =
            Me.RecoordDataSet.Expats.Where(Function(x) x.Id = CInt(DataGridView1.Rows(i).Cells(0).Value)).FirstOrDefault

        If row.ExpatsNames <> "" Then
            DataGridView1.Rows(i).Cells(1).Style.ForeColor = Color.Red
        End If

        If row.Green Then
            DataGridView1.Rows(i).Cells(1).Style.BackColor = Color.Green
        End If

    Next

End Sub


تم تصحيح كود الفورم
الرد }}}
تم الشكر بواسطة:
#10
الف شكر اخي العزيز على الشرح و سابدا العمل بنصيحتك ان شاء الله
الرد }}}
تم الشكر بواسطة:



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


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