بسم الله الرحمن الرحيم
قبل البدء في هذا الدرس أحب أن أوجه رسالة شكر للقائمين على هذا المنتدى الغالي وجميع الأساتذة الفضلاء الذين سخروا جهودهم لنشر العلم والتعليم ، كما أحب توجيه رسالة شكر خاصة للأستاذ الغالي محمد خليل أبو صلاح الذي خدمني من حيث شعر ومن حيث لم يشعر من خلال مشاركاته التي غالبا ما أجد حلول مشاكلي بين طياتها وهذا ليس تقليل من شأن بقية الأساتذة فجلهم نهلنا من علمه .. أثابهم الله جميعا على تلك الجهود ..
كما أعتذر عن قلة المشاركة رغم متابعتي المستمرة لهذا القسم ربما لانشغالي بتطبيق الدروس أحيانا وأحيانا لعدم توفر الوقت وأحيانا أخرى لقدم المشاركة..
لا أريد الاطالة نبدأ على بركة الله في آخر ماتوصلت له من محاولات حول ماعنون به هذا الدرس
لنفرض أن لدينا ثلاث شركات للسيارات ولكل شركة عدد من السيارات التابعة لها ونريد عرض كل شركة والسيارات التابعة لها أسفل منها
سيكون لدينا :
جدول لشركات السيارات اسمه cartype يحتوي على حقلين هما cartypeID و cartypeName
وجدول للسيارات اسمه carmodel يحتوي على ثلاثة حقول وهي carmodelID و carmodelName و carmodel_cartypeID
من الحلول المثلى لعملية العرض استخدام Gridview داخل Repeater مع Data View لفلترة السيارات تحت الشركات التابعة لها ورغبة في الاختصار وبعدا عن التكرار فطريقة العرض هذه مشروحة من قبل الأستاذ محمد خليل أبو صلاح تحت عنوان التعامل مع Data View مع مثال مشابه على هذا الرابط
فيرجى مراجعتها وأخذ الفكرة فهي العامل الأساس في كل درس ..
في طريقة العرض التي سوف أقوم بها سأستخدم Repeater داخل Repeater
في الـ Repeater الأول سنقوم بعرض الشركات
وفي الـ Repeater الثاني سنقوم بعرض السيارات التابعة لكل شركة وسيكون الكود كالتالي
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Dim constring As String = ConfigurationSettings.AppSettings("ConnectionString")
Dim con As New SqlConnection(constring)
Dim dap As SqlDataAdapter
Dim dst As New DataSet
Dim cmd As New SqlCommand
Dim StrSql As String
Dim dv As DataView
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
StrSql = "select * from cartype"
con.Open()
dap = New SqlDataAdapter(StrSql, con)
dap.SelectCommand = New SqlClient.SqlCommand(StrSql, con)
dap.Fill(dst, "cartype")
con.Close()
StrSql = "select * from carmodel"
con.Open()
dap = New SqlDataAdapter(StrSql, con)
dap.SelectCommand = New SqlClient.SqlCommand(StrSql, con)
dap.Fill(dst, "carmodel")
con.Close()
dv = dst.Tables("carmodel").DefaultView
If Not Page.IsPostBack Then
Me.cartype.DataSource = dst.Tables("cartype")
Me.DataBind()
End If
End Sub
Function GetCarModel(ByVal cartypeID As Integer) As DataView
dv.RowFilter = "carmodel_cartypeID=" & cartypeID
Return dv
End Function
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="cartype" runat="server">
<ItemTemplate>
<table><tr><td>
<%#Eval("cartypeName")%>
<br />
<asp:Repeater id="carmodel" runat="server"
DataSource='<%#GetCarModel(Eval("cartypeID"))%>'>
<ItemTemplate>
<asp:CheckBox ID=CheckBoxModel runat=server Text=' <%#Eval("carmodelName")%>' />
</ItemTemplate>
</asp:Repeater>
</td></tr></table>
</ItemTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>وطريقة العرض ستظهر كما في الصورة
http://upload.9q9q.net/image/gIDeb8EID/cars2.bmp.html
مايهمنا الآن في هذا الدرس هو الشعور باختيار أي CheckBox يحتوي على سيارة معروضة ومن الوهلة الأولى يتضح أننا بحاجة إلى حلقتي For لتفي بالغرض
حيث تكون الحلقة الأولى لـصفوف Repeater المسمى cartype والحلقة الثانية لـصفوف Repeater المسمى carmodel
ومن خلالها نقوم باختبار CheckBox واحدا تلو الآخر ..
نقوم بانشاء Button ونضع خلفه الحلقة الأولى
Dim i As Integer For i = 0 To cartype.Items.Count - 1 Next
وداخل الحلقة نقوم بتعريف متغير من نوع صف Repeater للمرور على جميع صفوف Repeater المسمى cartype من خلال الحلقة كمايلي
Dim i As Integer For i = 0 To cartype.Items.Count - 1 Dim cartypeItem As RepeaterItem = cartype.Items(i) Next
الآن عند محاولة انشاء الحلقة الثانية التابعة لـ Repeater الثاني والمسمى carmodel على نفس النهج سنلاحظ وجود خطأ والسبب
هو عدم الشعور بوجود هذا الـ Repeater داخل الـ Repeater الأول والمسمى cartype
ومما ينبغى ملاحظته هو أن هناك Repeater كامل والمسمى carmodel لكل صف من الـ Repeater الأول المسمى cartype
ولذلك نقوم بتعريف متغير من نوع Repeater لكل صف من الـ Repeater الأول لنتمكن من الوصول إلى الـ Repeater الثاني كما يلي
Dim i As Integer
For i = 0 To cartype.Items.Count - 1
Dim cartypeItem As RepeaterItem = cartype.Items(i)
Dim carmodel As Repeater = cartypeItem.FindControl("carmodel")
Nextالآن نستطيع انشاء الحلقة الثانية على نفس نهج الحلقة الأولى ولكن من خلال المتغير carmodel كما يلي
dim x,i as integer
For i = 0 To cartype.Items.Count - 1
Dim cartypeItem As RepeaterItem = cartype.Items(i)
Dim carmodel As Repeater = cartypeItem.FindControl("carmodel")
For x = 0 To carmodel.Items.Count - 1
Dim carmodelItem As RepeaterItem = carmodel.Items(x)
Next
Nextنقوم الآن بتعريف متغير من نوع Boolean ونضع فيه القيمة True في حال تم اختيار الـ CheckBox الذي وصل عليه العد في الحلقة و False لو كان العكس
dim x,i as integer
For i = 0 To cartype.Items.Count - 1
Dim cartypeItem As RepeaterItem = cartype.Items(i)
Dim carmodel As Repeater = cartypeItem.FindControl("carmodel")
For x = 0 To carmodel.Items.Count - 1
Dim carmodelItem As RepeaterItem = carmodel.Items(x)
Dim isChecked As Boolean = CType(carmodelItem.FindControl("CheckBoxModel"),CheckBox).Checked
Next
Nextثم نقوم بفحص المتغير قيمة isChecked لاتخاذ اجراء معين من خلال IF الشرطية كالتالي
dim x,i as integer
For i = 0 To cartype.Items.Count - 1
Dim cartypeItem As RepeaterItem = cartype.Items(i)
Dim carmodel As Repeater = cartypeItem.FindControl("carmodel")
For x = 0 To carmodel.Items.Count - 1
Dim carmodelItem As RepeaterItem = carmodel.Items(x)
Dim isChecked As Boolean = CType(carmodelItem.FindControl("CheckBoxModel"), CheckBox).Checked
If isChecked Then
End If
Next
Nextلنفرض أننا نريد طباعة أسماء السيارات المختارة داخل Label نضيف السطرين التاليين لأخذ الـ Text من CheckBox وطباعتها في الـ Label
Dim i, x As Integer
For i = 0 To cartype.Items.Count - 1
Dim cartypeItem As RepeaterItem = cartype.Items(i)
Dim carmodel As Repeater = cartypeItem.FindControl("carmodel")
For x = 0 To carmodel.Items.Count - 1
Dim carmodelItem As RepeaterItem = carmodel.Items(x)
Dim isChecked As Boolean = CType(carmodelItem.FindControl("CheckBoxModel"), CheckBox).Checked
If isChecked Then
Dim isCheckedText As String = CType(carmodelItem.FindControl("CheckBoxModel"), CheckBox).Text
Label1.Text = Label1.Text + CStr(isCheckedText) + " "
End If
Next
Nextأرجوا من الله أن أكون قد وفقت في توضيح الصورة وأعتذر إن كان هناك أي غموض في هذا الدرس المتواضع فلست متمرساً في كتابة الدروس لكني أحببت أن أساهم ولو بالقليل في نفع اخواني وتقديم شيء لهذا المنتدى الغالي .. ا.هـ
أعطر التحايا ..
أخوكم
نبيل المشفي