الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح: كيف تجعل الداتا جريد ترتب الأعمدة حسب رغبتك

بدأه بهاء صلاح الدين في 1 مارس 2010 · 18 رد · 6,157 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته ..........

سلأقدم لكم اليوم شرحا" لكيفية ترتيب أعمدة الداتاجريد لكي تُعرض حسب الشكل الذي ترغبه،فمن المعروف ان الداتا جريد تعرض البيانات متجاورة و هذا احيانا" كثيرة لا يبدو مرضيا" للمستخدم،لذا فسنقوم اليوم بإنشاء داتا جريد لعرض بياناتها وفق ترتيب معين، مثل ما يحدث في المواقع الاخبارية أو حتى في هذا المنتدى، حيث تجد أن المشاركة تحوي صورة العضو و أسفلها عدد مشاركاته ثم الى جانبهما المشاركة و تاريخها ... الخ. يمكن القيام بهذا عن طريق إنشاء Template داخل الداتا جريد و نرتب داخل هذا ال Template الأعمدة كما نشاء

post-158674-12674720586337_thumb.jpg

سنبدأ الآن....

1- نقوم بإنشاء قاعدة بيانات جديدة في sql server و نسميها Template_DataBase ثم ننشئ بداخلها جدول نسميه News ونضع فيه الحقول التالية:

ID,Int

Title,Nvarchar(200

Summary,Nvarchar(max

My_Image,image

2- نفتح visual studio ثم ننشئ مشروع asp جديد ونضيف للمشروع صفحتين هما Default.aspx,Insert_News.aspx

3-نضيف صندوقي نص و اداة fileuploader إلى الصفحة Insert_News.aspx كما في الصورة التالية:

post-158674-12674732196602_thumb.jpg

4-ثم نكتب هذا الكود لإضافة الخبر لقاعدة البيانات تحت زر الإضافة:

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Template_Database;Integrated Security=True");
    	byte[] image_bytes = new byte[FileUpload1.FileContent .Length];
    	SqlCommand Insert_com = new SqlCommand("Insert into news values(@txt_title,@txt_summary,@img)", con);
    	Insert_com.Parameters.Add("@txt_title", SqlDbType.NVarChar).Value = Text_title.Text;
    	Insert_com.Parameters.Add("@txt_summary", SqlDbType.NVarChar).Value = Text_summary.Text;
    	Insert_com.Parameters.Add("@img", SqlDbType.Image).Value = FileUpload1 .FileBytes ;
    	Insert_com.CommandType = CommandType.Text;
    	con.Open();
    	Insert_com.ExecuteNonQuery();
    	con.Close();

5-نذهب الى صفحة Default.aspx ونضع فيها داتا جريد عادية ثم ننشئ datasource جديد يقوم بجلب جميع الأعمدة من جدول News و نربط الداتا جريد مع الداتا سورس كما هو معروف.

6-نختار Edit columns من قائمة GridView Tasks ، نلاحظ عدم وجود العمود My_Image الذي سيقوم بعرض الصورة، نضيف من خلال Available fields حقل خاص لعرض الصور لذا نختار Imagefield. نعين خاصية DataImageUrlField الى My_Image

post-158674-12674721419405_thumb.jpg

post-158674-12674721189946_thumb.jpg

7-ننشئ ملف handler جديد ، هذا الملف يقوم بتحويل الصورة المخزنة في قاعدة البيانات الى بايتات لعرضها في الصفحة و نكتب فيه كود استدعاء الصورة داخل الحدث ProcessRequest(HttpContext):

SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString);
        	string sql = "Select My_Image from News where="ID=@ImageId"]ID=@ImageId]";
        	SqlCommand cmd = new SqlCommand(sql, myConnection);
        	myConnection.Open();
        	cmd.Parameters.Add("@ImageId", SqlDbType.Int);
        	cmd.Parameters[0].Value = Convert.ToInt32(context.Request.QueryString["ID"]);
        	cmd.Prepare();
        	SqlDataReader dr;
        	dr = cmd.ExecuteReader();
        	while (dr.Read())
        	{
            	context.Response.ContentType = "jpeg";
            	context.Response.BinaryWrite((byte[])dr["My_Image"]);
        	}
        	myConnection.Close();

ثم داخل كود aspx نعين الخاصية ImageUrl الخاصة بImagefield الذي اضفناه الى القيمة التالية:

'<%# "Handler.ashx?id=" + Eval("ID") %>'

7-كما قلنا في البداية أننا نريد عمل template معين للداتا جريد و من خلال هذا ال template سنرتب الصورة و العنوان و ملخص الخبر بالكيفية التي نريدها ، لذا نذهب الى Gridview_Tasks و نختار Edit Templates

8- نلاحظ تحول الداتاجريد الى مربع خال و بجانبه قائمة المفترض ان بها الحقول التي نرغب بإضافنها و لكنها خالية، لماذا؟ لأن الأعمدة بوضعها الحالي مخصصة للعرض بالطريقة النمطية فقط، لذا علينا أن نقوم بتعديل وضعها لكي تقبل الاضافة الى template

9-نعود الى Edit columns و نقوم بإختيار العمود الذي نرغب في ظهوره في template ثم نضغط convert this field into template field

post-158674-12674722338554_thumb.jpg

10-قمنا هنا بإختيار أعمدة الصورة و العنوان و الملخص و أهملنا ID لأننا لا نريد ظهوره.

11-نذهب مرة أخرى Edit Templates و نضغط على القائمة المنسدلة نلاحظ ظهور الأعمدة الثلاثة و اسفل كل منهم عناصر مثل Item Template و Header Template و Footer Template و عناصر أخرى ، و هي عناصر مخصصة لضبط مثلا" رأس العمود و أسفله و ضبط الصف التالي له(AlternatingItem Template)

post-158674-12674722444957_thumb.jpg

12-نختار Item Template الخاص ب العمود title نلاحظ ظهور label ، هذه label مسؤلة عن عرض العنوان , و عند إختيار Item Template الخاصة بكل عمود سنجد label آخر لعرض الملخص ,و Image لعرض الصورة

13-نختار Item template الخاصة بtitle و نضيف اليها html table ثم نذهب الى Item template الخاصة بالعمود summary و نختار ال label و نقصه ثم نعود لوضعه في html table.

14- نكرر الخطوة السابقة مع item template الخاصة بعمود الصورة

15-نقوم بترتيب الlabels و image كما نشاء ، لاحظ اننا بهذه الطريقة قد جعلنا الأعمدة كلها تحت عمود واحد هو عمود title

post-158674-12674722219348_thumb.jpg

16-نقوم بتشغيل الصفحة نلاحظ ظهور الأعمدة كما نريد و لكن سيظهر حقلي summary و Imagefield خاليان لذا نذهب الى Edit columns و نقوم بحذفهما و أيضا" قم بتعيين الخاصية Show Header الخاصة بالداتا جريد إلى false

post-158674-12674723909837_thumb.jpg

17- نقوم يتشغيل الصفحة ، سنجد ان الداتا جريد قد ظهرت بالشكل المطلوب و قد عرضت البيانات بالطريقة التي نريدها

post-158674-126747237924_thumb.jpg

و بالهناء و الشفاء laugh.gif

Template Datagrid.rar

post-158674-12674721312161_thumb.jpg

تم تعديل هذه المشاركة بواسطة بهاء صلاح الدين فراج في 1 مارس 2010 في 23:11

3
#2

أكرم الله وجهك وأشكرك أخي الكريم على الدرس الرائع

يحفظ في المفضلة

#3

جزاك الله كل خير وجعله في ميزان حسناتك

2

ASP.NET Team Leader

moh_kin_mah@hotmail.com

--------------------------------

لو أعجبك أي من مشاركاتي ... برجاء قم بتقييم المشاركة عبر الأزرار الموجودة أسفل يسار كل مشاركة

#4

اشكرك اخي بهاء على هذا الموضوع الرائع لكن؟؟؟؟

ممكن تسوي رابط مثل ماهو في المواقع يسمى المزيد اذا نقرت عليه يعطيك المزيد من الاخبار واما في الصفحة الرئيسية يعطيك فقط نبذة او مختصر ثك يقول لك انقر هنا لتعرف المزيد عن هذا الخبر!!

بعد ذلك ممكن تعيد رفع المشروع من جديد

ايضا ارفع معه صفحات ASP.NET لانها غير موجودة في مشروعك الذي ارفقته

ولك مني جزيل الشكر والتقدير

انا بنتظارك اخي بهاء

2
#5

اخي بهاء رجاء ارفق الملف مرة اخرى ولانتسى الصفحات الا اس بي

#6

السلام عليكم و رحمة الله و بركاته ...

لعمل رابط (المزيد ) يا كمبيوتر نت، عليك بإضافة الحقل HyperlinkField من Edit Columns ثم قم بتعيين الخاصية NavigateUrlField إلى مثلا" صفحة الأخبار "News.aspx"

ثم أضف الحقول التي ستعتمد عليها كبارامتر عند الانتقال إلى News.aspx إلى الخاصية DataNavigateUrlField و هنا نقوم بإضافة الحقل ID

و بعد ذلك إذهب إلى الخاصية DataNavigateUrlFormatString و إجعل قيمتها "News.aspx?ID={0}" ، لاحظ querystring الذي أضفناه في نهاية URl ، لذلك قمنا بإضافة الحقل ID إلى DataNavigateUrlField أما إذا كنت ستعتمد على حقلي ID و Title فسيكون URL كالآتي :"News.aspx?ID={0}&Title={1}" حيث أن 0 , 1 هي Index الحقول و هذا لكي عندما تذهب إلى الصفحة News.aspx فإنك ستعرض تفاصيل الخبر من قاعدة البيانات إعتمادا" على قيمة ID و Title في قاعدة البيانات.

و لا تقم بتحويل الحقل HyperlinkField إلى Template Item لأن فورمات الحقل لن يقبل غير بارامتر واحد و لست أدري ما السبب .....

مرفق المشروع بعد إضافة الملفات المفقودة .... فقط أضف الحقل News إلى جدول News ... و شكرا" لكم على ردودكم الطيبة

Templated_Datagrid.rar

تم تعديل هذه المشاركة بواسطة بهاء صلاح الدين فراج في 4 مارس 2010 في 02:08

#7

جزاك الله خير اخي بهاء

كل الشكر لك ولمجهوداتك

انا شخصيا جالس اطبق من يومين وفعلا استفدت فايدة عظيم وماكنت اعلم ان القريدفيو تقدر تتحكم فيها بالشكل المرن هذا

جزاك الله خير ورحمك ورحم والديك ورزق من حيث لاتدري واعانك على دنياك واخرتك

#8

السلام عليكم ورحة الله وبركاته

اولا اخي بهاء اعذرني على شكري لك المتأخر ،

ثانيا: اخي بهاء معاي اسئلة في حول هذا الموضوع وهي:

1) ارى انّ الحقول اموجودة في الدتا بيس تختلف اسمائها في جملة الادخال

اقتباس

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Template_Database;Integrated Security=True"); byte[] image_bytes = new byte[FileUpload1.FileContent .Length]; SqlCommand Insert_com = new SqlCommand("Insert into news values(@txt_title,@txt_summary,@img)", con); Insert_com.Parameters.Add("@txt_title", SqlDbType.NVarChar).Value = Text_title.Text; Insert_com.Parameters.Add("@txt_summary", SqlDbType.NVarChar).Value = Text_summary.Text; Insert_com.Parameters.Add("@img", SqlDbType.Image).Value = FileUpload1 .FileBytes ; Insert_com.CommandType = CommandType.Text; con.Open(); Insert_com.ExecuteNonQuery(); con.Close();

2) ماذا يعني هذا الكود التالي :: اقصد شرح عمله:

اقتباس

cmd.Parameters[0].Value = Convert.ToInt32(context.Request.QueryString["ID"])

3) وهل تقصد بهذا الكود هو فقط انه يقبل الصور ذات الامتداد jpeg:

اقتباس

context.Response.ContentType = "jpeg";

context.Response.BinaryWrite((byte[])dr["My_Image"]);

4) هذا الكود لم افهم ماذا يعمل ، وايضا اين يكتب بالذات . بحثت عن موضوع مكانه فلم اجده :

اقتباس

'<%# "Handler.ashx?id=" + Eval("ID") %>'

5) هذا الشرح لم افهم تطبيقه وحاولت بقدر الامكان لكن لم استطع ، طبعا الموجود في اداة القريد فيو ولو تكرمت اعيد شرحه بالتفصيل:

اقتباس

12-نختار Item Template الخاص ب العمود title نلاحظ ظهور label ، هذه label مسؤلة عن عرض العنوان , و عند إختيار Item Template الخاصة بكل عمود سنجد label آخر لعرض الملخص ,و Image لعرض الصورة

13-نختار Item template الخاصة بtitle و نضيف اليها html table ثم نذهب الى Item template الخاصة بالعمود summary و نختار ال label و نقصه ثم نعود لوضعه في html table.

14- نكرر الخطوة السابقة مع item template الخاصة بعمود الصورة

15-نقوم بترتيب الlabels و image كما نشاء ، لاحظ اننا بهذه الطريقة قد جعلنا الأعمدة كلها تحت عمود واحد هو عمود title

6) طبقت مشروعك ولكنه لم يطبق ، طبعا الداتا بيس لم ترفق معاه لكني سويت عندي داتا بييس , ولكنه لم يطبق ويتنفذ

اعرف اني اكترت عليك في الكلام ولكن صدقني انا بحاجة الى ذلك وكنت ابحث عن مثل هذا الشرح الرائع فوجدت شرحك الطيب الرائع، ولكني بحكم اني مبتدئ في البرمجة صعبت علي بعض الاشياء

،واعرف انك مشغول ولكن اعتبر الاجر من الله لك وان شاء الله لن انساك من الدعاء

منتظر رد في اسرع وقت ممكن

اخوك احمد

#9

انا في إنتظار ردك اخي بهاء!!!!!!!!!!!!!

تم تعديل هذه المشاركة بواسطة كمبيوتر نت في 7 مارس 2010 في 13:28

#10

السلام عليكم و رحمة الله و بركاته .....

كيف حالك يا أخ كمبيوتر نت؟!

بالنسبة للنقطة الأولى قم بإضافة حقل يسمى news إلى جدول news في قاعدة البيانات التي أرفقتها في المشاركة الأولى، ثم قم بإضافة textbox و سمها إلى text_news إلى الصفحة insert_news.aspx و هذا يعني ان تدخل عنوان الخبر و ملخص للخبر و تفاصيل الخبر الى قاعدة البيانات، ثم قم بتعديل كود الإضافة إلى التالي:

SqlCommand Insert_com = new SqlCommand("Insert into news values(@txt_title,@txt_summary,@txt_news,@img)", con);

و فم بإضافة هذا السطر:

Insert_com.Parameters.Add("@txt_news", SqlDbType.NVarChar).Value = Text_news.Text;

و معذرة على هذا السهو، فقد نسيت إجراء التعديلات اللازمة على المشروع

أما النقطة الثانية فأعذرني فلست خبيرا" بملف handler.ashx و لكن سأحاول شرح الكود مثلما فهمته. لو نظرت إلى هذا الكود:

string sql = "Select My_Image from News where ID=@ImageId";

ستجد انه يأتي بالصورة على أساس البارامتر @imageid، من أين تأتي قيمة البارامتر ؟؟ كما قلنا أن ملف Handler.ashx يقوم بتحويل البيانات القادمة من السيرفر إلى بايتات و ذلك بناء على http request يرسله جهاز العميل إلى السيرفر، لذا فقد قمنا بعمل الكائن context من الفئة httpcontext و هذا الكائن سيقوم في البداية بجلب قيمة الحقل ID من الجدول في قاعدة البيانات من خلال هذا السطر:

cmd.Parameters[0].Value = Convert.ToInt32(context.Request.QueryString["ID"]);

و هكذا نمرر قيمة الحقل ID إلى البارامتر @imageid

أما النقطة الثالثة فالكود ليس معناه أنه فقط يقبل الصور ذات الامتداد jpg و لكنه تعريف للمتصفح بأن الملف الناتج سيكون من نوع jpg و هذا لأن جميع الصور في قاعدة البيانات من النوع jpg، أما إذا كانت الصور من عدة أنواع فحقيقة لا ادري ما هو الكود الذي سيكتب في هذه الحالة

أما النقطة الرابعة في تساؤلك فعليك بالذهاب إلى كود aspx الخاص بالعمود imageurlfield الذي اضفته إلى الداتاجريد لعرض الصور، و ضع هذا الكود :

ImageUrl='<%# "Handler.ashx?id=" + Eval("ID") %>'

و هذا معناه أن ان العمود سيعرض الصور من خلال الملف handler.ashx

و النقطة الخامسة هي انك بعد أن قمت بتحويل الأعمدة إلى نمط template عليك بإختيار edit template و تلاحظ تحول الداتا جريد إلى مربع خال و بجانبه قائمة منسدلة، تقوم بإختيار القائمة تلاحظ وجود الأعمدة و تحت كل عمود بعض الخيارات مثل header template و footer template و هي مخصصة لضبط رأس و أسفل العمود، ثم تختار تحت أول عمود الا و هو العمود title أهم الخيارات و هو item template و هنا ستجد label ستقوم بعرض عنوان الخبر ,و قلنا في البداية اننا لا نريد عرض البيانات بطريقة متجاورة كما هو معتاد و لكن سنغير من ترتيب الأعمدة بحيث نضع بعضها في الأسفل و أخر في الجانب الأيسر و هكذا ، لذا عليك سحب html table و إلقاءه داخل item template الخاص بالعمود title و تضع ال label الموجود داخل html table، ثم تذهب إلى item template الخاص بكل عمود و تقص labels و image control و تضعها داخل html table الذي وضعته في item template الخاص بالعمود title و ترتب الأدوات كما تريد ، مثلا" تضع image control في الجانب الأيمن من html table و تضع labels فوق بعضها بشكل عمودي و ها سينتج لك شكل الداتا جريد الموجود في المواقع الإخبارية.....

أرجو ان يكون الشرح واضح و تحياتي لك .....

#11

موضوع رائع جدا

يسحق الشكر

شكرا جزيلا يا اخى وبارك الله فيك

1
#12

السلام عليكم ورحمة الله وبركاته

اشكرك اخي بهاء مع تجاوبك معاي

وبالنسبة للاجوبة :

في النقطة الاولى اني لم اقصد كيفية الاضافة في الداتا بييس (اقصد اضافة حقول) ولكني اقصد ان الحقول المكتوبة في جملة الادخال ((insert)) تختلف اسماء حقولها في الداتا بيسس فمثلا:

انت سميت في الداتا بييس هذا الحقل title وفي جملة الادخال اعطيت له الاسم text_title فهذا ينتج خطأ لانه اختلف اسمه عن الاسم الذي موجود في الداتا بيسس وقس البيقية على هذا المعنى؟

ايضا اخي مشروعك لم يتفذ ابدا ونتج هناك خطأ وحاولت بقد الامكان ان اجد الخطأ ولكن لاجدوى في ذلك !!!!!!!!!!!! فرجاء راجع المشروع مرة اخرى وارفقه الي مرة اخرى!!!

اما بالنسبة لاداة القريد فيو فانا حاولت ان افهم بعض الاشياء ولكن اختلط علي بعض الاشياء !!! لكن المقصود هو انك عملت في الداتا بيسس حقل مسمى بالـــ summary وهو يعني نبذة عن الخبر

ثم طلبت منك انا !!! كيف تعمل المزيد فقلت لي نضيف حقل ارخ في الدتا بيس ونسميه news !! الناظر في المواقع يجد انا هناك (( العنوان في اعلى ثم الصورة جانبا ثم موضوع الخبر وهو نبذة فقط ثم يقول لك انقر هنا لتعرف المزيد فتقر فينقلك الى صفحة اخرى بها كل التفاصيل ؟؟؟ القصد من هذا هو انا الحقل news لانحتاج اليه في الداتا بيسس !!! يكفي فقط suammary لانك عندما تنقر على المزيد يعطيك كل التفاصيل الموجودة في summary !!!

وهناك قد تكون مشكلة في الادخال !! هي ان المشرف او المدير على الموقع يقوم بادخال العنوان وصورته والمخلص عليه ثم التفاصيل !!! لا لانتحاج الي المخلص فقط !!! هناك قد تكون داله تاخذ نبذة من التفاصيل ثم تقول لك انقر هنا لتعرف المزيد !!! فماهي ياترى؟؟؟

منتظر رد اخي بهااااااااااااااااء

#13

السلام عليكم جميعا" ....

اقتباس
انت سميت في الداتا بييس هذا الحقل title وفي جملة الادخال اعطيت له الاسم text_title فهذا ينتج خطأ لانه اختلف اسمه عن الاسم الذي موجود في الداتا بيسس وقس البيقية على هذا المعنى؟

text_title هي إسم الكنترول الموجود في الصفحة و كذلك text_summary و ليس اسماء الحقول في الداتا بيس

اقتباس

كيف تعمل المزيد فقلت لي نضيف حقل ارخ في الدتا بيس ونسميه news !! الناظر في المواقع يجد انا هناك (( العنوان في اعلى ثم الصورة جانبا ثم موضوع الخبر وهو نبذة فقط ثم يقول لك انقر هنا لتعرف المزيد فتقر فينقلك الى صفحة اخرى بها كل التفاصيل ؟؟؟ القصد من هذا هو انا الحقل news لانحتاج اليه في الداتا بيسس !!! يكفي فقط suammary لانك عندما تنقر على المزيد يعطيك كل التفاصيل الموجودة في summary !!!

كل شخص و له طريقته ، فالبعض يريد إضافة حقل للملخص و حقل لتفاصيل الخبر ، و آخرون يضيفون فقط حقل تفاصيل الخبر و منه نعرض بضعة أسطر فقط كملخص للخبر و عند الضغط على (مزيد) تظهر بقية تفاصيل الخبر... المهم أن فكرة إستعمال Templated Items داخل الداتا جريد تكون وصلتك ، اما بالنسبة لدالة تعرض جزء من الخبر فعليك بإستخدام الدالة substring ، مثال:

label1.text.substring(0,50);

و هذا الكود يعني أن يعرض فقط أول خمسين حرف من النص.و لكن أحيانا" الخمسون حرفا" لن يعطونك جملة كاملة ... مثلا" :بهاء صلاح الدي ..... و هذا ليس بالمشكلة فهناك مواقع كثيرة تستخدم هذه الطريقة أما إذا كنت تريد جملة كاملة فعليك بالبحث في المنتديات عن الطريقة المناسبة و على ما اعتقد انها تحتاج إلى حيلة برمجية فلا توجد دالة تقوم بذلك.

اكرر مرة اخرى .. لكي يعمل معك المشروع فقط أضف حقل news إلى الجدول News في الداتا بيس.

رجاء إذا حصل خطأ ما في المشروع فأرسل نص الخطأ و الكود المسبب للخطأ

تقبل تحياتي .....

#14

السلام عليكم

اشكرك اخي بهاأأأأأأأأأأأأأأاء

واعذرني اذا اكثرت عليك في الاسئلة دون معنى !!!!

فهذه قد تكوت فكرتي تختلف على فكرتك والبرمجة ماهي الا منطق

ولك مني جزيل الشكر والتقدير

اخوك /// أحمد

#15

موضوع جميل بجد متشكر اوى كنت بدور عليها

جزاك الله خيرا :)

#16

الاخ بهاء

جزاك الله خير على ماقدمته وعلى ماتقدمه

ارجو ان تساعدوني في حل هذه المسالة الخاصة بالقريد فيوت

/index.php?showtopic=217362

#17

fبارك الله فيك وجعله في ميزان حسناتك

#18

أشكرك أولاً على هذه المعلومات القيمة التي استفدت منها كثيراً

وبعد إذنك كان لدي تساؤلان:

1- هل يمكن تنظيم الجريد فيو بهذا الشكل ولكن مع ربطها بالداتا بيز بالكود بدلاً من العمل wizard.

2- كيف أقوم بتسطيب موقع الويب ليكون كملف exe لو كان من الممكن أن تفيدني في هذا الأمر ؟

ولك مني جزيل الشكر

وجزاك الله خيراً

#19

والله فوق الرائع ... جزاك الله خير يا اخى الفاضل

مواضيع مشابهة