منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : استفسار عن الـ CommandArguments + DataKeys
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم
من خلال تعرضي للـ GridView
كان هناك مثال بالمنتدى القديم حول نقل قيمة من صفحة لأخرى , وكان المثال فيه CommandArguments + DataKeys+DataKeyNames
اتمنى لو احصل على فكرة نظرية ولو بسيطة عن هذه المصطلحات الثلاث (شو معناتهم , ومتى استخدمهم)
لم استطع فهم هذه المصطلحات من المراجع الانكليزية , أو الاحرى لم اجد مرجع يشرحها من البداية ,
أضف اليها حدث الـ RowCommand ـ
هو سبب مشكلتي مع هذه المصطلحات


Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
Dim itm As Integer
itm = Convert.ToInt32(e.CommandArgument)
Response.Redirect("Default2.aspx?ID=" & GridView1.DataKeys(itm).Value.ToString())
End Sub
سأكتب هنا ماتم التوصل اليه Big Grin
مع مثال


GridView والحدث RowCommand


يحدث الحدث RowCommand عندما ننقر على زر ButtonField داخل الجريدفيو

(أي ينفذ مانريد تنفيذه عند النقر على الزر )

الزر داخل الجريد فيو يمكن ان ينجز بعض المهام

ولهذا الزر خاصيتان مهمتان هما :

CommandName

CommandArgument قيمتها الافتراضية : رقم (index) للسطر الحالي .

وحتى نستطيع استخدام هاتين الخاصتين يجب ان نمرر الكائن (e) المأخوذ من الكلاس (GridViewCommandEventArgs) كوسيط الى معالج الحدث RowCommand

"حيث هذه الكلاس تزود الحدث السابق بالمعطيات فهي تحدد مصدر الامر ووسائط الحدث وتحدد رقم السطر"

الزر داخل الجريدفيو له استخدامات عدة , وعادة مايتم استخدامه من أجل المهام التالية (على ان يوضع اسم المهمة ضمن الـخاصية CommandName ) والمهام هي:

Edit : تضع السجل الحالي بوضع التحرير وتطلق الحدث RowEditing

Cancel : تلغي عملية التحرير السابقة وتعيد الجريد فيو لوضع القراءة

Delete : تحذف السجل الحالي وتطلق الحدث RowDeleting , RowDeleted

Page : جعل الجريد فيو تعرض بصفحات Paging وهنا نضع في الخاصية CommandArgument

"التالي" و " السابق" وهكذا .. أو بشكل أرقام تشير لرقم الصفحة , وهنا يتم اطلاق حدث

PageIndexChenging


[ATTACH=CONFIG]744[/ATTACH]


Sort : ترتيب اسطر الجريدفيو , وتطلق الحدثين Sorting , Sorted وهنا يمكن ان نستخدم الخاصية CommandArgument

لتحديد اتجاه الترتيب تنازلي أو تصاعدي حيث نعطيها يدويا احدى القيمتين

Ascending أو Descending

Update : تحديث السجل الحالي في قاعدة البيانات (وليس فقط بالجريدفيو) وهنا ينطلق الحدثين RowUpdating , RowUpdated .

لتحديد رقم السطر الذي أطلق الحدث RowCommand نستخدم الخاصية CommandArgument التابعة

للكائن e المشتق من (GridViewCommandEventArgs) الذي قمنا بوضعه مسبقا كوسيط للحدث . حيث تحوي هذه الخاصية رقم السطر


مثال


كود :
[align=left]void ContactsGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
  {    
    if(e.CommandName=="Add")
    {
      // Convert the row index stored in the CommandArgument

      // property to an Integer.

      int index = Convert.ToInt32(e.CommandArgument);

      // Retrieve the row that contains the button clicked

      // by the user from the Rows collection.

      GridViewRow row = ContactsGridView.Rows[index];
      ……….. [/align]
[SIZE=6]مثال :


(عند النقر على الزر Add داخل الجريدفيو يقوم باضافة السطر الحالي الى الـ ListBox )

لنقوم الان بانشاء جريدفيو و ListBox بصفحة التصميم

نذهب لصفحة الـ Html

ونضيف للجريد فيو ButtonField ونسميه Add أو اضافة

ونضيف لهذا الزر الخاصية CommandName="Add"

بالشكل التالي

كود :
<asp:ButtonField CommandName="Add" Text="Add" />



ليصبح كود الجريدفيو كامل كالتالي :



كود :
[COLOR="#0000FF"][align=left]
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"

            DataKeyNames="id" DataSourceID="SqlDataSource1" Width="97%"

[COLOR="#FF0000"]

            onrowcommand="GridView1_RowCommand"> [/COLOR]

  <Columns>

<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True" SortExpression="id" />


<asp:BoundField DataField="name" HeaderText="name" SortExpression="name" />


<asp:BoundField DataField="city" HeaderText="city" SortExpression="city" />


<asp:BoundField DataField="mob" HeaderText="mob" SortExression="mob" />


[color=#FF0000]<asp:ButtonField CommandName="Add" Text="Add" />[/color]


   </Columns>


</asp:GridView>[/align][/COLOR]


[ATTACH=CONFIG]743[/ATTACH]


نحدد الجريدفيو ونذهب الى خصائصها في الـ Properties
نحدد Events بدلا من الخصائص

ونضغط دبل كليك على الحدث RowCommand

لنجعل هذا الحدث ينفذ المهمة المطلوبة من النقر على الزر Add والتي هي هنا اضافة السطر الحالي الى ListBox

اذاً نكتب به الكود التالي :


كود :
[SIZE=6][COLOR="#0000FF"]
[align=left]
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)

    {
        
        if (e.CommandName == "Add")

        {

            int index = Convert.ToInt32(e.CommandArgument);

            
            GridViewRow row = GridView1.Rows[index];


            ListItem item = new ListItem();      

                                                            
item.Text= "name: " + Server.HtmlDecode( row.Cells[1].Text) + "-  city:

" + Server.HtmlDecode(row.Cells[2].Text) +"-


mob:  " + Server.HtmlDecode(row.Cells[3].Text);


            if (!ListBox1.Items.Contains(item))

            {

                ListBox1.Items.Add(item);
            
       }

}[/align][/COLOR][/SIZE]


[/SIZE]
المثال هنا


[COLOR="#0000FF"]
[ATTACH]742[/ATTACH] [/COLOR]
اعذرني اخي لم اقرا كامل الموضوع لكن شدتني جزئية نقل قيمة .. ارجو ان مرادك متوفر بالرابط التالي:
http://vb4arb.com/vb/showthread.php?96-%...1%D8%D1%DE
أشكرك أخي سعود وموضوع مفيد جدا (عرض العناوين والتفاصيل )
وسأدرسه بالتفصيل ان شاء الله فالافكار مرتني من قبل, بارك الله فيك
أما موضوع نقل قيمة بالكويري سترنج فأنا لا أسأل عنه ولكن كان سؤالي حول المصطلحات التي كتبتها هل لها علاقة بنقل القيم بين الصفحات ..
ولكن تبين انه ليس لها علاقة , مجرد توهم فقط .

ثم بالتعليقات الاخرى كتبت كيفية استعمال بعض هذه المصطلحات .



بقي الان الـ DataKeys أو الـ DataKeyNames

شو شغلتهم ؟؟



DataKey

تمثل قيمة المفتاح الرئيسي PrimaryKey لمصدر البيانات

يمكن الحصول عليه بالطريقة

Datakey k1=GridView1.DataKeys[0];


ان خاصية الـ DataKeyNames تحمل اسم حقل المقتاح الرئيسي

مثلا : IdCustomer

فمثلا

لدينا صفحتين الاولى بها GridView تعرض عناوين الاخبار والثانية بها DetailsView تعرض التفاصيل

لو اردنا الحصول على قيمة المفتاح الرئيسي

عند عرض التفاصيل بالـ DetailsView

أولا يجب ان تكون الخاصية DataKeyNames في الجريدفيو (بالصفحة الاولى ) تحمل اسم

الحقل الرئيسي بجدول البيانات

وفي DetailsView نستخدم الحدث DataBound كالتالي


كود :
[align=left]
[COLOR="#0000CD"]
[SIZE=6]protected void DetailsView1_DataBound(object sender, EventArgs e)

    {

        DataKey k1 = DetailsView1.DataKey;

        Label1.Text = "the key is: " + k1.Value.ToString();

    }[/SIZE][/COLOR] [/align]



حيث حدث DataBound يحدث عند جلب البيانات من المصدر (قاعدة البيانات)