أداة ال DataList من الأدوات المهمة جدا في تطبيقات ال ASP.NET و التي تقوم بعرض البيانات للزائر بعدة أشكال ممكنة من خلال إمكانتها المتاحة سواء في التصميم أو في دعمها للأحداث و إحتواء أدوات أخرى. الدرس سيكون طويلا جدا لما يحتويه من تفرعات و تشعبات ولكن سأحاول توصيله بأسهل طريقة ممكنة كي يبقى عالقا في الأذهان لأنه درس كما قلت مهم جدا جدا.
في البداية ال DataList تدعم إستخدام القوالب أو ما يعرف في الويب بال Templates و تقريبا تشبه ما ذكرناه في موضوع ال Repeater و لكن بالأصح هي أقرب لما تدعمه أداة ال DataGrid حيث تملك نفس القوالب.
القوالب الموجودة داخل ال DataList :
1.HeaderTemplate:
تحدد كيف سيظهر رأس ال DataList أي المنطقة العلوية للعرض.
2.ItemTemplate:
و هي المنطقة الأكثر حيوية حيث يتم تنسيق البيانات التي ستعرض فيها.
3.AlternateItemTemplate:
يتم فيها تنسيق العناصر التي تظهر مرة بعد مرة خلال عرض سجلات البيانات.
4.SeparatorTemplate:
و هي المنطقة الفاصلة بين السجلات المعروضة و قلنا بالعادة نستخدم فيها الوسم <BR>.
5.FooterTemplate:
و فيها يتم تنسيق ذيل ال Data List و إعداده إن استلزم الأمر.
6.SelectedItemTemplate:
تتحكم في تنسيق العنصر الذي يتم إختياره.
7.EditItemTemplate:
تقوم بتنسيق العنصر الذي تم إختياره لإجراء التعديل عليه بشكل معين.
ربط ال DataList بالبيانات :
نفس طريقة ال DataBinding التي ذكرناها في ال Repeater تستخدم هنا سواء إستخرجنا البيانات عن طريق DataReader أو DataSet و هذا مثال يوضح ذلك :
<%@ Page Language="C#" Debug="True" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
void Page_Load()
{
string prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("db.mdb");
string SQL="SELECT * FROM Categories";
OleDbConnection cn = new OleDbConnection(prov);
OleDbCommand cmd = new OleDbCommand(SQL,cn);
cn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
dl.DataSource= reader;
dl.DataBind();
cn.Close();
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp: DataList id="dl" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"category")%>
</ItemTemplate>
</asp: DataList>
</form>
</body>
</html>لننظر بداية إلى جزء ال HTML حيث أدرجنا أداة ال DataList :
<asp: DataList id="dl" runat="server"> </asp: DataList>
ثم ذهبنا للحدث Page_Load و أضفنا أكواد من أجل الإتصال بقاعدة البيانات و إستخراج السجلات من جدول Categories عن طريق الأداة DataReader .
بعد ذلك قمنا بربط الأداة DataList و التي أسميتها dl بالبيانات من خلال التالي :
dl.DataSource= reader; dl.DataBind();
و من أجل عرض أسماء التصنيفات من الجدول نحتاج لكتابة التالي :
<%# DataBinder.Eval(Container.DataItem,"category")%>
و طبعا يجب أن يكون داخل ال ItemTemplate لنصحل على النتيجة المطلوبة و هي إظهار جميع أسماء التصنيفات الموجودة داخل الجدول Categories.
لنفرض أننا نود تغيير ترتيب الظهور و إستخدام دالة نمرر لها قيم معينة و نضيف وصلة تشعبية HyperLink فماذا نفعل ؟
دعونا نرى هذا المثال :
<%@ Page Language="C#" Debug="True" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
public object IsActive(object vl)
{
string ac="";
if(vl.ToString()=="True")
ac="Yes";
else
ac="No";
return ac;
}
void Page_Load()
{
string prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("db.mdb");
string SQL="SELECT * FROM Categories";
OleDbConnection cn = new OleDbConnection(prov);
OleDbCommand cmd = new OleDbCommand(SQL,cn);
cn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
dl.DataSource= reader;
dl.DataBind();
cn.Close();
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp: DataList id="dl" runat="server" RepeatDirection="Horizontal" repeaterlayou="table" borderwidth="3" gridlines="both" width="100%">
<ItemTemplate>
<table border="0" width="100%">
<tr>
<td>
<%# DataBinder.Eval(Container.DataItem,"category")%>
</td>
</tr>
<tr>
<td>
Active(Yes/No) : <%#IsActive(DataBinder.Eval(Container.DataItem,"active"))%>
<br />
</td>
</tr>
<tr>
<td>
<a href='./more.aspx?id=<%# DataBinder.Eval(Container.DataItem,"id")%>'>more</a>
</td>
</tr>
</table>
</ItemTemplate>
</asp: DataList>
</form>
</body>
</html>في منطقة الأكواد نرى أننا أضفنا دالة أسميناها IsActive من نوع كائن Object نمرر لها باراميتر يقوم بفحصه فإن كانت قيمته True أظهر الناتج Yes و إلا سيظهر لنا كلمة No
بعد ذلك تأتي أكواد الإتصال في منطقة حدث تحميل الصفحة Page_Load و ربط ال DataList و نلاحظ أننا غيرنا خصائص ال DataList كالتالي :
<asp: DataList id="dl" runat="server" RepeatDirection="Horizontal" repeaterlayou="table" borderwidth="3" gridlines="both" width="100%">
أيضا أعود للدالة و نرى كيف تم إستدعائها مع تمرير باراميتر :
<%#IsActive(DataBinder.Eval(Container.DataItem,"active"))%>
نرى دائما عند محاولة الكتابة للعناصر التي تخضع لعملية ال Data Binding في منطقة ال HTML نستخدم معها علامة الموجه Directive و هي الإشارة # ثم نقوم بكتابة البيانات أو إستدعاء أي دالة.
من أهم الخصائص كانت ال RepeatDirection جعلناها Horizontal بدل Vertical التي تكون Default
إستخدام الأنماط Styles مع ال DataList :
BackColor
يتحكم في لون خلفية الكلام الذي سيظهر داخل العنصر.
BorderColor
يظهر لون الحدود الخاصة بالعناصر التي ستظهر.
BorderStyle
نمط أو شكل الحدود التي ستظهر به و هناك عدة قيم بالعادة يتم إستخدامها و هي :
(Dashed-Dotted-Double-Groove-Inset-None-NotSet-OutSet-Ridge and Solid)
BorderWidth
تحدد حجم الحدود التي سنعرض بها العناصر.
CssClass
تحدد نوع الفئة التي سيرتبط بها العنصر من خلال ملف CSS يحوي عدة أنماط على شكل فئات.
Font
تحديد نوع الخط.
ForeColor
لون الخط الذي سنكتب به.
Height
إرتفاع العنصر الذي سيتم عرضه.
HorizontalAlign
تتحكم في الإرتفاع الأفقي للعنصر و القيم المعتاد كتابتها هي :
(Center-Justify-Left-NotSet and Right)
VerticalAlign
تحديد المحاذاة الأفقية للعنصر و القيم المعتاد إستخدامها هي :
(Bottom-Middle-NotSet and Top)
Width
عرض العنصر الذي سيعرض.
كانت هذه معظم الأنماط المستخدمة مع ال DataList.
لنأخذ مثالين صغيرين يقومان بعمل تنسيقات معينة للعناصر:
<asp: DataList ItemStyle-Font-Italic="True" ItemStyle-Font-Bold="True" ItemStyle-Font-Name="Tahoma" Runat="server" > or <asp: DataList AlternatingItemStyle-ForeColor="Blue" AlternatingItemStyle-Font-Name="Arial" AlternatingItemStyle-Font-Size="14pt" Runat="server" >
و هكذا رأينا كيف نضيف الأنماط Styles إلى ال DataList كي تظهر لنا البيانات بالشكل الذي نرغب به.
أحداث ال DataList :
1.CancelCommand:
من أجل تفعيل هذا الحدث نقوم بإضافة الخاصية CommandName للزر و نجعل قيمته cancel.
2.DeleteCommand:
نقوم بجعل الخاصية CommandName تساوي delete.
3.EditCommand:
نجعل قيمة ال CommandName هي edit.
4.UpdateCommand:
نجعل قيمة ال CommandName هي update.
5.ItemCommand:
يتم تفعيل هذه الخاصية عند وجود حدث غير ما ذكرته بالأعلى من حذف و تعديل و إلغاء و إدخال.
و لكن ما هي ال CommandName أو بشكل آخر أين تكتب؟؟
الجواب سهل جدا و هي خاصية تضاف لأحد الأدوات التالية :
Button
LinkButton
ImageButton
نضيف لهم الخاصية CommandName بحيث عند الضغط على أحدهم يتم تنفيذ الحدث المعين مع العلم أنه يجب إضافة الحدث لل DataList و هذا سيتضح لنا من خلال الأمثلة القادمة.
لنأخذ مثالا نستخدم فيه أغلب الأحداث بشكل بسيط بحيث نحتاج إلى DataList و Label تقوم بكتابة جملة تدل على الحدث الذي إخترناه :
<%@ Page Language="C#" Debug="True" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
void dataBind(){
string prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("db.mdb");
string SQL="SELECT * FROM Categories";
OleDbConnection cn = new OleDbConnection(prov);
OleDbCommand cmd = new OleDbCommand(SQL,cn);
cn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
dl.DataSource= reader;
dl.DataBind();
cn.Close();
}
void Page_Load()
{
if(!Page.IsPostBack) {
dataBind();
}
}
void dl_ItemCommand(Object source, DataListCommandEventArgs e) {
msg.Text="<li>Item Command!";
}
void dl_EditCommand(Object source, DataListCommandEventArgs e) {
msg.Text="<li>Editing Item!";
}
void dl_DeleteCommand(Object source, DataListCommandEventArgs e) {
msg.Text="<li>Deleting Item!";
}
void dl_UpdateCommand(Object source, DataListCommandEventArgs e) {
msg.Text="<li>Updating Item!";
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<p>
<asp : DataList id="dl" runat="server" OnUpdateCommand="dl_UpdateCommand" OnDeleteCommand="dl_DeleteCommand" OnEditCommand="dl_EditCommand" OnItemCommand="dl_ItemCommand" repeatColumns="1" repeaterlayout="table" ItemStyle-Font-Name="tahoma" borderwidth="1" gridlines="both" width="33%">
<ItemStyle font-names="tahoma"></ItemStyle>
<ItemTemplate>
<table border="0" width="100%">
<tr>
<td>
<%# DataBinder.Eval(Container.DataItem,"category")%>
<br />
<asp:LinkButton runat="server" Text="Edit!" CommandName="edit" />
<asp:LinkButton Text="Delete!" CommandName="delete" runat="server" />
<asp:LinkButton Text="Update!" CommandName="Update" runat="server" />
</td>
</tr>
</table>
</ItemTemplate>
</asp : DataList>
</p>
<asp:Label id="msg" runat="server" text=""></asp:Label>
</form>
</body>
</html>نبدأ في تحليل المكتوب في المثال..
في الأعلى نرى أكواد الإتصال بقاعدة البيانات و هذه مألوفة لنا و بعدها هناك بعد الأحداث نعود لها بعد قليل.
نذهب لجزء ال HTML حيث الأدوات و قلنا أننا نحتاج ل Label نسميه msg و DataList نسميها dl كالتالي :
<asp : DataList id="dl" runat="server" OnUpdateCommand="dl_UpdateCommand" OnDeleteCommand="dl_DeleteCommand" OnEditCommand="dl_EditCommand" OnItemCommand="dl_ItemCommand" repeatColumns="1" repeaterlayout="table" ItemStyle-Font-Name="tahoma" borderwidth="1" gridlines="both" width="33%">
نرى الخصائص التي أضفناها و الأحداث التي عرفناها لتكون متصلة بال DataList مثلا لإضافة الحدث الخاص بالحدث نضيف هذه الخاصية :
OnDeleteCommand="dl_DeleteCommand"
قمنا بعد ذلك بتحديد ال ItemStyle من أجل تنسيق النمط الخاص بالمخرجات و أكتفيت فقط بجعل الخط Tahoma و من ثم أضفنا الوسم ItemTemplate كما هو موضح هنا :
<ItemTemplate> <table border="0" width="100%"> <tr> <td> <%# DataBinder.Eval(Container.DataItem,"category")%> <br /> <asp:LinkButton runat="server" Text="Edit!" CommandName="edit" /> <asp:LinkButton Text="Delete!" CommandName="delete" runat="server" /> <asp:LinkButton Text="Update!" CommandName="Update" runat="server" /> </td> </tr> </table> </ItemTemplate>
طبعا أضفنا جدولا من أجل تنسيق المخرجات في كل صف سيطهر لنا إسم التصنيف Category و تحته 3 أزرار من نوع LinkButton و كل واحد منها أضفنا له الخاصية CommandName و أسندنا لها القمية المطلوبة سواء حذف أو تعديل أو إدخال كما هو موضح بهذا الشكل :

طبعا ستظهر عدة بيانات أو أقسام على حسب السجلات الموجودة في جدول البيانات و مع كل سجل ستظهر 3 أزرار كل منها عبارة عن رز يقوم بإستدعاء حدث معين و لنفرض أننا ضغطنا الزر الذي يظهر لنا الكلمة Delete! فماذا سيحدث؟
سيتم إستدعاء الحدث dl_DeleteCommand حسب ما أضفنا لخصائص ال DataList و دعونا نعود لمنطقة الأكواد و لنرى هذا الحدث ماذا يحتوي :
void dl_DeleteCommand(Object source, DataListCommandEventArgs e) {
msg.Text="<li>Deleting Item!";
}فقط أضفنا تعليمة تقوم بجعل ال Label يقوم بعرض جملة مكتوب بها Deleting Item! كي نرى ما هو الزر الذي ضغطنا عليه و لكن هي كانت فكرة كي نرى كيف يتم إستدعاء الأحداث و لعل الأمثلة القادمة تزيد الإصارة و التعرف أكثر على الأحداث.
لنأخذ مثالا نوضح فيه تعديل البيانات في ال DataList و أتمنى أن تنتبهوا له جيدا لأنه مثال ممتاز نوعا ما.
لنبدأ في تحليل الفكرة:
أولا سنظهر التصنيفات الموجودة في جدول categories.
ثانيا نضيف زر للتعديل مع كل تصنيف يقوم بحدث التعديل.
هذا الشكل يوضح أول مرحلتين :

ثالثا عند الضغط على زر نقوم بإظهار إسم التصنيف داخل مربع نص Text Box و بجانبه زر لتأكيد التعديل.

رابعا بعد الضغط على زر التعديل تنتهي المهمة و تعود الصفحة للعرض كما كانت بعد حفظ التعديلات.
لتنفيذ أول خطوة نحتاج ل DataList تعرض البيانات عن طريق ال ItemTemplate كما عرفنا سابقا و نستخدم أيضا زر من نوع LinkButton و نعين ال CommandName إلى Edit و هذا يتضمن ثاني مرحلة أيضا.
أما ثالث مرحلة فسنحتاج لإضافة الوسم EditItemTemplate كي تظهر بدل ال ItemTemplate عند السجل الذي إخترناه و هي تحوي مربع نص Text Box و زر لتأكيد التعديل من نوع Link Buntton..
و المرحلة الرابعة و الأخيرة هي مرحلة إستدعاء الحدث الخاص بالتعديل و عمل بعض التعليمات كي نقوم بحفظ التعديلات في قاعدة البيانات و إعادة ربط الأداة بالبيانات بعد التعديل عليها و ظهورها بالشكل الطبيعي أي قبل ضغط زر التعديل أو التحرير بالأصح.
سوف أكتب الكود هنا ثم أبدأ في شرحه جزءا جزءا كي نستوعب الأمور بشكل أوضح و على فكرة إستخدام هذه الأدوات يعطينا مرونة و سرعة أكبر من إستخدام الطرق الشبيهة بال ASP الكلاسيكية القديمة و التي للأسف يقوم العديد من المبرمجين بإستخدامها لليوم مع هذه التقنية متجاهلين إمكانات الأدوات الجديدة و التي توفر العديد من الجهد و الوقت و كل ما نحتاجه فقط القليل من التدريب و التواصل معها كي نصل لمرحلة نستطيع تقدير الخدمات التي توفرها لنا هذه الأدوات الرائعة والان نعود للكود :
<%@ Page Language="vb" Debug="true" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub DataBind()
Dim prov As String
Dim SQL As String
Dim cn As OleDbConnection
Dim reader As OleDbDataReader
Dim cmd As OleDbCommand
prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & Server.MapPath("db.mdb")
SQL="SELECT * FROM Categories"
cn = new OleDbConnection(prov)
cmd = new OleDbCommand(SQL,cn)
cn.Open()
reader = cmd.ExecuteReader()
dl.DataSource=reader
dl.DataBind()
reader.Close()
cn.Close
End Sub
Sub Page_load
If Not Page.IsPostBack Then
DataBind()
End If
End Sub
Sub dl_EditCommand(source As Object, e As DataListCommandEventArgs)
dl.EditItemIndex=e.Item.ItemIndex
DataBind()
End Sub
Sub dl_UpdateCommand(source As Object, e As DataListCommandEventArgs)
Dim newCatName As TextBox
Dim catID As String
Dim prov As String
Dim SQL As String
Dim cn As OleDbConnection
Dim reader As OleDbDataReader
Dim cmd As OleDbCommand
prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & Server.MapPath("db.mdb")
SQL="Update Categories set Category=@newCatName where id=@catID"
cn = new OleDbConnection(prov)
cmd = new OleDbCommand(SQL,cn)
newCatName=e.Item.FindControl("newCatName")
catID=dl.DataKeys(e.Item.ItemIndex)
cmd.Parameters.Add("@newCatName",newCatName.Text)
cmd.Parameters.Add("@catID",catID)
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
dl.EditItemIndex=-1
DataBind()
End Sub
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp : DataList id="dl" runat="server" DataKeyField="id" OnUpdateCommand="dl_UpdateCommand" width="33%" OnEditCommand="dl_EditCommand" border="2">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"category") %>
<br />
<asp:LinkButton id="edit" commandName="edit" text="Edit!" runat="server" />
</ItemTemplate>
<EditItemTemplate>
<p>
<asp:TextBox id="newCatName" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem,"category") %>' />
<asp:LinkButton id="update" commandName="update" text="Update!" runat="server" />
</p>
</EditItemTemplate>
</asp : DataList>
</form>
</body>
</html>يوجد عندنا أحداث و إجرائيات و هي :
DataBind Page_Load dl_EditCommand dl_UpdateCommand
و هذه في منطقة الكود و الأولى أنا وضعت فيها الكود الخاص بربط الأداة DataList مع جدول التصنيفات و الحدث Page_Load هو الحدث الذي سينفذ عند إستدعاء الصفحة حيث يقوم بإستدعاء الإجرائية الأولى كي يتم ربط الأداة بالبيانات و تظهر لنا على الواجهة التطبيقية. و نرى الحدث dl_EditCommand و هو يحدد أي عنصر سيتم تفعيل ال EditTemplate عنده كي تظهر الأدوات اللازمة لمرحلة التعديل و نقوم بإعادة ربط البيانات. أما الحدث الأخير فهو يقوم بتعديل البيانات في الجدول عند الضغط على زر التعديل حيث يأخذ البيانات من ال TextBox و يقوم بإستبدالها بما هو موجود في الجدول قبل التعديلثم تقوم بإعادة ربط الأداة بالبيانات كي تظهر لنا البيانات الجديدة بعد التعديل و يجب أن لا نتجاهل هذه النقطة.
الآن نذهب لجزء ال HTML و نرى أداة ال DataList التي أضفناها كما يلي :
<asp : DataList id="dl" runat="server" DataKeyField="id" OnUpdateCommand="dl_UpdateCommand" width="33%" OnEditCommand="dl_EditCommand" border="2"> <ItemTemplate> <%# DataBinder.Eval(Container.DataItem,"category") %> <br /> <asp:LinkButton id="edit" commandName="edit" text="Edit!" runat="server" /> </ItemTemplate> <EditItemTemplate> <p> <asp:TextBox id="newCatName" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem,"category") %>' /> <asp:LinkButton id="update" commandName="update" text="Update!" runat="server" /> </p> </EditItemTemplate> </asp : DataList>
نرى أننا أضفنا الخاصية DataKeyField و هي مهمة للغاية و سأشرح ما هي و ما الفائدة منها.
الأن عند الضغط على أي عنصر بيانات سوف نقوم بإستدعاء حدث معين و يلزمنا تمرير قيمة نستطيع من خلالها تحديد السجل الذي سنجري عليه التعديل و بالعادة نمرر قيمة ال Primary Key في الجدول كي نستخدمها كشرط في الإستعلام SQL أو في ال DataView كي نصل للسجل المطلوب و هنا مررنا قيمة ال id الخاص بالسجل و طبعا سيمرر حسب ال Template الذي سنضغط عليه.
في منطقة ال Item Template قمنا بكتابة تعليمة تظهر لنا إسم التصنيف و تظهر أسفله زر مكتوب عليه كلمة Edit! كما هو موضح هنا :
<ItemTemplate> <%# DataBinder.Eval(Container.DataItem,"category") %> <br /> <asp:LinkButton id="edit" commandName="edit" text="Edit!" runat="server" /> </ItemTemplate>
أهم نقطة أننا حددنا ال CommandName في الزر إلى edit .
بعد ذلك نرى الجزء الخاص بال EditItemTemplate حيث أدرجنا فيه TextBox تظهر إسم القسم كمحتوى لها أو كقيمة إفتراضية و بجانيها زر من أجل تعديل البيانات كما يلي :
<EditItemTemplate> <p> <asp:TextBox id="newCatName" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem,"category") %>' /> <asp:LinkButton id="update" commandName="update" text="Update!" runat="server" /> </p> </EditItemTemplate>
و نرى أننا كتبنا update كقيمة لل commandName كي يتم إستدعاء حدث التعديل.
و الآن نعود للحدث dl_EditCommand :
Sub dl_EditCommand(source As Object, e As DataListCommandEventArgs) dl.EditItemIndex=e.Item.ItemIndex DataBind() End Sub
dl_EditItemIndex تأخذ قيمة رقمية و هي تحدد رقم العنصر الذي سنعدله أي الذي سنظهر له ال EditItemTemplate و القيمة هي عبارة عن قيمة ممررة مع المتغير e الذي تم تمريره كباراميتر للحدث و من أجل الوصول لرقم العنصر الذي قام بتفعيل الحدث نكتب e.Item.ItemIndex ثم بعد ذلك قمنا بربط البيانات.
أما الجزء الأخير فهي الحدث الخاص بالتعديل على قاعدة البيانات و دعونا نكتب الكود هنا ثم سأقوم بشرحه بعدها:
Sub dl_UpdateCommand(source As Object, e As DataListCommandEventArgs)
Dim newCatName As TextBox
Dim catID As String
Dim prov As String
Dim SQL As String
Dim cn As OleDbConnection
Dim reader As OleDbDataReader
Dim cmd As OleDbCommand
prov="Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & Server.MapPath("db.mdb")
SQL="Update Categories set Category=@newCatName where id=@catID"
cn = new OleDbConnection(prov)
cmd = new OleDbCommand(SQL,cn)
newCatName=e.Item.FindControl("newCatName")
catID=dl.DataKeys(e.Item.ItemIndex)
cmd.Parameters.Add("@newCatName",newCatName.Text)
cmd.Parameters.Add("@catID",catID)
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
dl.EditItemIndex=-1
DataBind()
End Subفي البداية قمت بتعريف بعد المتغيرات و الأدوات كالتالي :
Dim newCatName As TextBox Dim catID As String Dim prov As String Dim SQL As String Dim cn As OleDbConnection Dim reader As OleDbDataReader Dim cmd As OleDbCommand
حيث أن ال newCatName من نوع مربع نص TextBox و رقم ال CatID الخاص بالتصنيف من نوع نص تعريفات تخص الربط بقاعدة البيانات كلنا نعرفها.
و الآن لنحصل على قيمة ال newCatName نحتاج للحصول على الأداة التي أضفناها لل DataList و نحتاج لإستخدام الطريقة FindControl لتقوم بهذه الوظيفة و بالعادة تقوم ال FindControl بإعادة رقم -1 في حال عدم إيجادها للأداة المطلوبة أما ال catID فنستطيع الحصول على قيمة رقم التصنيف من خلال تمرير رقم العنصر التسلسلي حسب ظهوره في الأداة DataList و طبعا يبدأ الترقيم التسلسلي من صفر و هو ليس برقم ال PK في الجدول الخاص بالتصنيفات في قاعدة البيانات لذا نحتاج لتمرير هذا الرقم للطريقة DataKeys و التي تعيد قيمة الحقل المفتاحي و نحن قد حددناه الحقل id عند إدراج الأداة DataList.
newCatName=e.Item.FindControl("newCatName")
catID=dl.DataKeys(e.Item.ItemIndex)من الإمكانيات المميزة في الدوت نت و التي سهلت الكثير من العمل علينا و حدت من الأخطاء التي يقع فيها المبرمجون في كتابة جمل الإستعلام عند تمرير متغيرات لجملة الإستعلامات أنها قدمت لنا طريقة جديدة لكتابة الإستعلام SQL و دعونا نرى هنا :
SQL="Update Categories set Category=@newCatName where id=@catID"
نرى أننا إستخدمنا الرمز @ و بعده مررنا إسم الباراميتر و كي نضيفه نكتب التالي :
cmd.Parameters.Add("@newCatName",newCatName.Text)
cmd.Parameters.Add("@catID",catID)طبعا نحتاج لل cmd و التي هي OleDbCommand كي نضيف إليها قيم المتغيرات حيث أن ال @newCatName كانت قيمتها هي قيمة مربع النص و التي هي newCatName.Text أما ال @catID فقد حصلنا عليها قبل قليل مستفيدين من الباراميتر الممرر للحدث e.
بعد ذلك نقوم بفتح الإتصال و نستخدم ال DataReader و أعتقد أنكم قرأتم درسه و عرفتم أننا في حال التعديل و الحذف نحتاج لإستخدام ExecuteNonQuery لأننا لا نريد إرجاع بيانات كما هو الحال في ال ExecuteReader أو ال ExecuteScalar ثم نغلق الإتصال كما هو هنا :
cn.Open() cmd.ExecuteNonQuery() cn.Close()
بعد ذلك كتبنا dl.EditItemIndex=-1 و التي تفيد في حجب ال EditItemTemplate و إعادته لحالته الأولى كما كان في حال ال ItemTemplate و ثم ربطنا البيانات كي نضمن ظهورها بعد عملية التعديل.
درس كان شيقا و يحمل العديد من الفائدة لنا و لربما وضح العديد من الأسئلة التي تدور حول ما فائدة هذه الأداوت الجديدة.
الحمد لله انني انتهيت من اطول درس اكتبه في حياتي :s
تحياتي لكم.
محمد خليل أبو صلاح
