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

نسخة كاملة : مشكلة فى كود DrawSubItem
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
عندى listview يوجد بها 15 Columns اريد اضافة الصور فى ال15 Columns subitems المشكلة ان الكود يعمل تعليق فى الفورم


كود :
   Private Sub Listview1_DrawSubItem(sender As Object, e As DrawListViewSubItemEventArgs) Handles Listview1.DrawSubItem
       Try
           Dim imgs = New Rectangle(e.Bounds.Location.X, e.Bounds.Location.Y, e.Bounds.Height, e.Bounds.Height)
           If (e.SubItem.Text = e.SubItem.Text) Then
               e.Graphics.DrawImage(Image.FromFile(Application.StartupPath & "\Images\" + e.SubItem.Text + ".png"), imgs)
           Else
               e.DrawDefault = True
           End If
       Catch ex As Exception

       End Try
   End Sub
جربت فحص اذا تم اضافة item جديد يتم اضافة الصوره الخاصة بها لاكن عند الفحص يتم اذالة جميع الصور من subitems كلها علاشان الكود يحتوى على loop ليرسم على subitems و هو الذى يسبب التعليق فى الفورم حل يوجد حل لهذه المشكلة
سؤال : هل الأمر إجباري بالنسبة لك ان تكون الصور في فهرس المشروع؟
ان لم يكن هذا شرطا اجباريا هنا حاول ان تضع الصور في Resources المشروع أو في imageList و تقراها قبل بدء الفورم ثم ترسمها و لتري ما يحدث معك بعد ذلك
(07-08-16, 05:45 AM)silverlight كتب : [ -> ]سؤال : هل الأمر إجباري بالنسبة لك ان تكون الصور في فهرس المشروع؟
ان لم يكن هذا شرطا اجباريا هنا حاول ان تضع الصور في Resources المشروع أو في imageList و تقراها قبل بدء الفورم ثم ترسمها و لتري ما يحدث معك بعد ذلك

اجل الامر اجاريآ
لماذا لا تستخدم داتا جريد فيو؟
(07-08-16, 05:05 AM)أسامة كتب : [ -> ]جربت فحص اذا تم اضافة item جديد يتم اضافة الصوره الخاصة بها لاكن عند الفحص يتم اذالة جميع الصور من subitems كلها علاشان الكود يحتوى على loop ليرسم على subitems و هو الذى يسبب التعليق فى الفورم حل يوجد حل لهذه المشكلة

("" لاكن عند الفحص يتم اذالة جميع الصور"")
ماهو الفحص؟
وأين هي الـ loop التي ترسم subItems؟
وهل كتبت كود في حدث DrawItem ؟ إذا نعم أرنا إياه لعل المشكلة به
الأخ أسامة

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

المشكلة فى  e.SubItem.Text.Substring(0, 10) & "_" & e.SubItem.Text.Substring(11, 1)الكود يعمل بدون تعليق اذا كان عدد الصور فى المجلد صغير لماذا استخدم هذه الطريقة الان اسم الصور مثل هذا Ahmed_0 الاسم _ الرقم
عدد الصور فى مجلد الصور هو 8262 صورة تم ارفاق مثال صغير لاكن لا يوجد تعليق فى هذا المثلا بسبب يوجد 15 صورة فقط فى المجلد لا اعتقد انه يوجد حل لى 8262 صورة
بغض النظر عن الخطأ في رسم String لكن سبب المشكلة الأصلي هو ان عدد الصور ضخم جدا
ومع هذا العدد الضخم من الصور يكون امرا طبيعيا ان يأخذ الكمبيوتر وقتا لتنفيذ المطلوب منه
عليك ان تجد حلا لتفادي مشكلة Hanging او التعليق أثناء عملية الرسم

أنت تحتاج الي أن تقوم بعمل Caching  للصور أو بمعني أدق عليك أن  تقرأها علي مراحل و ليس علي مرة واحدة
وبشكل عمللي انت تحتاج الي قراءة الصور في بداية تشغيل البرنامج و تخزينها في مصفوفة او مصفوفات و ترسم فقط ما يظهر للمستخدم من ListViewSubItems

ربما قد يكون هناك حلول اخري و هي انك تخزن الصور في صورة Bytes

سؤالي لك هل عدد الصور سيتزايد ام سيكون ثابتا علي الرقم 8262 ؟
(07-08-16, 06:20 PM)silverlight كتب : [ -> ]بغض النظر عن الخطأ في رسم String لكن سبب المشكلة الأصلي هو ان عدد الصور ضخم جدا
ومع هذا العدد الضخم من الصور يكون امرا طبيعيا ان يأخذ الكمبيوتر وقتا لتنفيذ المطلوب منه
عليك ان تجد حلا لتفادي مشكلة Hanging او التعليق أثناء عملية الرسم

أنت تحتاج الي أن تقوم بعمل Caching  للصور أو بمعني أدق عليك أن  تقرأها علي مراحل و ليس علي مرة واحدة
وبشكل عمللي انت تحتاج الي قراءة الصور في بداية تشغيل البرنامج و تخزينها في مصفوفة او مصفوفات و ترسم فقط ما يظهر للمستخدم من ListViewSubItems

ربما قد يكون هناك حلول اخري و هي انك تخزن الصور في صورة Bytes

سؤالي لك هل عدد الصور سيتزايد ام سيكون ثابتا علي الرقم 8262 ؟

سيكون ثابتا علي الرقم 8262
أخي الفاضل أسامة

انت تحتاج الي استخدام اسلوب أخر لتخزين الصور في المشروع خاصة أن حجم الصور ضخم وكما لاحظت من مشروعك فإن الصور التي تستخدمها عبارة عن ايقونات

بشكل مبدئي فإن الحل الأمثل لك هو ان تقوم بتخزين الصور في مصفوفة أو في ملف و الفكرة هنا هي حفظ الصور بأسلوب أخر و الحفظ إما أن يكون علي هيئة Bytes او علي هيئة IntPtr
ثم وعند الحاجة تقوم بتحويل Bytes أو IntPtr الي صورة
و أهم مميزات هذا الأسلوب أن حجم مشروعك سيصبح أقل و لن تستهلك كثيرا من الذاكرة

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

لكن قبل هذا أرجو أن تجيب سؤالي التالي
لماذا تريد أن تملأ ListView بهذا الكم من الأيقونات ؟
إن أوضحت لي أسبابك في ذلك فلربما نجد حلا بديلا أسهل
الصفحات : 1 2