السلام عليكم ورحمة لله وبركاته ,,
سنتحدث في هذا الدرس عن كيفية تقسيم البيانات لعرضها داخل أداة DataGridView ,, وهذه الطريقة تستخدم في البرامج الضخمة التي يحتمل أن يصل عدد السجلات التي ستسدعى من خلال الإستعلام إلى مئات الالاف .
في هذه الحالة بالفعل لن تقوم بعرض مئات الألاف مرة واحدة في الاداة DataGridView
لهذا قمت بعمل كود يعتمد على هذه الفكرة وقمت بإستخدام الفكرة الموضوعة في موضوعي هنا لأنشاء قائمة ListItem
تعلم إنشاء قائمة ListItem خاصة بك ,, ماهي ؟ و ماخصائصها ؟ و مافوائدها ؟
بداية نقوم بإنشاء قاعدة بيانات اكسيس كمثال سريع للتجربة عليه ونقوم بإنشاء جدول وحيد بإسم Orders وننشى فيه الحقول المبينة في الصورة التالية
ومن ثم نقوم بإختيار اللغة التي سنعمل عليها التطبيق.
ومن ثم نقوم بإنشاء كلاس Class ونقوم بتسميته بـ ListItem
VB.NET
Private _text As String = String.Empty
Private _value As Integer
Public Sub New(ByVal text As String, ByVal value As Integer)
_text = text
_value = value
End Sub
Public Property text() As String
Get
Return _text
End Get
Set(ByVal value As String)
_text = value
End Set
End Property
Public Property value() As Integer
Get
Return _value
End Get
Set(ByVal value As Integer)
_value = value
End Set
End Property
Public Overrides Function ToString() As String
Return _text
End Function
End Class
Public Class listitem
C#
{
class listitem
{
private string _text = string.Empty;
private int _value;
public listitem(string text, int value)
{
_text = text;
_value = value;
}
public string text
{
get { return _text; }
set { _text = value; }
}
public int value
{
get { return _value; }
set { _value = value; }
}
public override string ToString()
{
return _text;
}
}
}
namespace C_Sharp_Paging___Example_
قمنا بتعريف كلاس خاص سنستخدمه لنسب قيمة أخرى غير القيمة الأساسية التي سنعين من خلالها مقدار السجلات والمتبقي منها :)
-----------------
وبعد أن نقوم بعمل شاشة مصغرة تشبه هذه الصورة :
نقوم بتعريف كود الاتصال بقاعدة البيانات و بعض المتغيرات التي سنستخدمها على مجال الفورم ككل
VB.NET
Dim max As Integer = 10
Dim x As Integer, y As Integer
Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Application.StartupPath & "\db.accdb;Persist Security Info=False;")C#
OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Application.StartupPath + @"\db.accdb;Persist Security Info=False;");
int max = 10;
int x,y;كما نقوم ايضاً بإضافة فضاء الاسماء الذي يتيح لنا التعامل مع محرك الاكسيس
VB.NET
Imports System.Data.OleDb
C#
using System.Data.OleDb;
-----------
وفي حدث الـ Form_Load
VB.NET
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Open()
x = (Convert.ToInt32(cmd.ExecuteScalar()))
con.Close()
Dim z As Integer = x / max
y = x Mod max
If y <> 0 Then
z += 1
End If
For r = 1 To z
ComboBox1.Items.Add(New listitem(r, r * max - max))
Next
ComboBox1.SelectedIndex = 0
Dim cmd As New OleDbCommand("select count(*) from orders", con)C#
OleDbCommand cmd = new OleDbCommand("select count(*) from orders", con);
if (con.State == ConnectionState.Open)
{
con.Close();
}
con.Open();
x = (Convert.ToInt32(cmd.ExecuteScalar()));
con.Close();
int z = x / max;
y = x % max ;
if (y != 0)
{
z++;
}
for (x = 1; x <= z; x++)
{
comboBox1.Items.Add(new listitem(Convert.ToString(x), x * max - max));
}
comboBox1.SelectedIndex=0;---------------
وفي حدث الـ ComboBox1_SelectedIndexChanged نقوم بكتابة الكود التالي :
VB.NET
Dim dt As New DataTable()
dt.Clear()
con.Open()
da.Fill(DirectCast(ComboBox1.SelectedItem, listitem).value, max, dt)
con.Close()
DataGridView1.DataSource = dt
Dim da As New OleDbDataAdapter("select * from orders order by id", con)C#
DataTable dt = new DataTable();
dt.Clear();
con.Open();
da.Fill(((listitem)comboBox1.SelectedItem).value, max, dt);
con.Close();
dataGridView1.DataSource = dt;
OleDbDataAdapter da = new OleDbDataAdapter("select * from orders order by id", con);---------
وبعد أن تقوم بعمل Run المشروع سيظهر لك الشكل التالي
يوجد في المرفقات نفس المثال ,, على الطريقتين (VB.NET & C Sharp)
لاتنسوني من دعائكم ,,
م.لؤي