Private Sub Student_Somme_Ranking() DataGridView1.Sort(DataGridView1.Columns(3), System.ComponentModel.ListSortDirection.Descending) Dim g As Integer = 0 DataGridView1.Rows(0).Cells(4).Value = Student_Ranking(g) For i As Integer = 1 To DataGridView1.Rows.Count - 2 If DataGridView1.Rows(i - 1).Cells(3).Value = DataGridView1.Rows(i).Cells(3).Value Then DataGridView1.Rows(i).Cells(4).Value = DataGridView1.Rows(i - 1).Cells(4).Value.ToString.Split(New Char() {" "})(0) + " مكرّر" g += 1 If g = 12 Then Exit For ElseIf DataGridView1.Rows(i).Cells(3).Value < DataGridView1.Rows(i - 1).Cells(3).Value Then g += 1 If g = 12 Then Exit For DataGridView1.Rows(i).Cells(4).Value = Student_Ranking(g) End If Next DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Ascending) End Sub
المشكلة بترتيب الاعمدة عندك في كودك اخر سطر اكتب رقم العامود 0 و ليس 1
هذه الداله من احد الاساتذه وهي صدقه عنه
يمكن للقائمين على المنتدى وضعها في موضوع خاص بها مع قيامهم بشرحها لتعم الفائده للاعضاء والاستاذ صاحب الكود
الافضل وضع هذه الداله ضمن المكتبه dll الخاصه بالمبرمج للتعامل معها في اي مشروع يتم تضمين المكتبه معه
او وضعها في موديول لمناداتها من اي كلاس في المشروع
الداله تتعامل مع الجدول DataTable بعد ان يعبئ بالبيانات وتنادى سواء بالقيمه او المرجع (سيتضح المقصود في طريق التعامل)
قد ترى الكود ليس صغيرا ولكن فيه ثلاث مهام
المهمه الاولى يتاكد من هل الجدول فيه عمود للترتيب
فاذا لم يجده او وجد نوعه ليس نصا فيضيف عمود جديد نصي للترتيب مع اضافت رمز _ لاسم العمود لتلافي تشابه اسماء الاعمده
المهمه الثانيه هو للترتيب
المهمه الثالثه للاختيار بين كلمت "مكرر" وهي الافتراضيه او ترقيم المكرر برقم بين قوسين وهي الاختياريه
الداله
PHP كود :
Public Shared Function OrdinalingDataTableRows(ByRef dataTable As DataTable, valueColumnName As String, ordinalColumnName As String, Optional numbering As Boolean = False) As DataTable If Not dataTable.Columns.Contains(ordinalColumnName) Then dataTable.Columns.Add(ordinalColumnName, GetType(String)) ElseIf Not dataTable.Columns(ordinalColumnName).DataType Is GetType(String) Then dataTable.Columns.Add(ordinalColumnName & "_", GetType(String)) ordinalColumnName = ordinalColumnName & "_" End If Dim dicOrdinals As New Dictionary(Of Double, String), ordinals = { _ "الأول", "الثاني", "الثالث", "الرابع", "الخامس", "السادس", "السابع", "الثامن", "التاسع", "العاشر", _ "الحادي عشر", "الثاني عشر", "الثالث عشر", "الرابع عشر", "الخامس عشر", "السادس عشر", "السابع عشر", "الثامن عشر", "التاسع عشر", "العشرين", _ "الحادي والعشرين", "الثاني والعشرين", "الثالث والعشرين", "الرابع والعشرين", "الخامس والعشرين", "السادس والعشرين", "السابع والعشرين", "الثامن والعشرين", "التاسع والعشرين", "الثلاثين"} Dim values = (From x In dataTable.Rows Order By x(valueColumnName) Descending Select x(valueColumnName) Distinct).ToArray For index = 0 To ordinals.Count - 1 If index = values.Count Then Exit For dicOrdinals.Add(values(index), ordinals(index)) Next Array.ForEach(dataTable.Rows.OfType(Of DataRow).ToArray, Sub(r As DataRow) r(ordinalColumnName) = DBNull.Value) For Each row As DataRow In dataTable.Rows Dim value = row(valueColumnName) Dim ors = row(ordinalColumnName) Dim count = (From x In dataTable.Rows Where Not IsDBNull(x(ordinalColumnName)) AndAlso x(valueColumnName) = value).Count Dim v = row(valueColumnName) If dicOrdinals.ContainsKey(row(valueColumnName)) Then row(ordinalColumnName) = dicOrdinals(row(valueColumnName)) If count > 0 Then If numbering Then row(ordinalColumnName) &= Space(1) & "(" & count + 1 & ")" For Each row2 As DataRow In dataTable.Rows If Not IsDBNull(row2(ordinalColumnName)) AndAlso row2(ordinalColumnName).Equals(dicOrdinals(row(valueColumnName))) Then row2(ordinalColumnName) &= Space(1) & "(1)" End If Next Else row(ordinalColumnName) &= Space(1) & "(مكرر)" End If End If End If Next Return dataTable End Function
التعامل معها بالمرجع
بعد تعبئت كائن الجدول dt بالبيانات
يكفي ان ترسل للداله اسم كائن الجدول واسم عمود القيم واسم العمود الخاص بالترتيب
(واختياريا يمكن ان تجعل التكرار رقمي باضاف True)
PHP كود :
' يجب ان تعبئ كائن الجدول dt بالبيانات قبل استدعاء الداله OrdinalingDataTableRows(dt, "STUDENT_Notes", "STUDENT_Ranking")
او
PHP كود :
' يجب ان تعبئ كائن الجدول dt بالبيانات قبل استدعاء الداله OrdinalingDataTableRows(dt, "STUDENT_Notes", "STUDENT_Ranking", True)
التعامل بالقيمه
بان تربط مصدر بيانات الداتاجريدفيو بها مباشره بعد تعبئت الجدول بالبيانات
PHP كود :
' يجب ان تعبئ كائن الجدول dt بالبيانات قبل استدعاء الداله Me.DataGridView1.DataSource = OrdinalingDataTableRows(dt, "STUDENT_Notes", "STUDENT_Ranking")
او
PHP كود :
' يجب ان تعبئ كائن الجدول dt بالبيانات قبل استدعاء الداله Me.DataGridView1.DataSource = OrdinalingDataTableRows(dt, "STUDENT_Notes", "STUDENT_Ranking", True)
بارك الله فيك و جزاك خير الجزاء أخي الكريم على هذه الدالة و هذا المساعدة .. زادها الله بموازين حسناتك إن شاء الله
فقط لو سمحت هل من الممكن وضعها بنفس ملفي المرفق
لأنّي ربما لم أعرف التعامل معها بشكل سليم
لاحظ أخي الكريم الصورة المؤشّر عليها بالسهم الأحمر و هي الدالة المعنية
نجد أنّ السادس تكرّر 3 مرّات .. 6-6-6 و لذلك من المفروض ألاّ يكون هناك ثامن
كود :
Dim Cmd = New OleDbCommand("SELECT * From TBL_STUDENT", Conne_2019)
Dim Da = New OleDbDataAdapter()
Da.SelectCommand = Cmd
dt = New DataTable()
Da.Fill(dt)
Me.DataGridView2.DataSource = OrdinalingDataTableRows(dt, "STUDENT_Notes", "STUDENT_Ranking")