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

نسخة كاملة : رسالة خطأ في الداتا جريد فيو
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
مساء الخير شباب

تظهر عندي رسالة الخطأ التالية :



وتظهر رسالة الخطأ هذه عند النقر على أعمدة العناوين الموضحة في المستطيل الأحمر


فما هو حل هذه المشكلة لو سمحتم ؟
هذا الاستثناء من الطريقة التي تضبط بها قيم الخلية :

عند الضغط على رأس العامود تحدث عملية (فرز - تصاعدي أو تنازلي)
الـ DataGridView يحاول إستخدام الطريقة ( IComparer ) ضد خلايا تحتوي على أنواع مختلفة، ولأن العامود يحتوي على أنواع مختلفة، لا تستطيع الطريقة  ( IComparer ) إجراء فرز، فيحدث هذا الاستثناء
الطريقة ( IComparer  ) تأخد أول خلية من العامود وتحدد نوعها ( أول خلية مثلاً نوعها نصي String ) ولكن الخلية التالية في نفس العامود تحتوي على قيمة من نوع ( Integer ).
هنا تحدث المشكلة لأنه لا يمكن مقارنة نوع بنوع مختلف،
يجب أن تكون كل الخلايا في نفس العامود من نفس النوع



والرسالة التي تظهر لك الخطاء :
تقول ( يجب أن يكون الكائن من نوع String )

معنى الرسالة مغلوط، وهو ليس القصد بأن الكائن يجب أن يكون من نوع String، المعنى هو أن الكائن الذي سبب الخطاء هو من نوع String.

ومن النظرة الأولى على الـ DataGridView يتضح ان الخطاء بسبب ( عامود كلمة المرور ) 
لأن أول خلية عبارة عن رقم
والخلية التي تحتها عبارة عن نص
ولأن الخلية الأولى (رقم) والثانية (نص) هنا رسالة الخطاء تقول ( يجب أن يكون الكائن من نوع String )

لا توجد أي مشكلة في الفرز مع القيم الخالية ، عندما تكون القيمة Nothing أو NULL
 


الحل هو :
عند تعيين القيم للخلية ( يجب تحديد نوعها بشكل صريح )
لأن كل الخلايا في الـ DataGridView من نوع Object
لذلك يجب أن تكون القيمة صريحة 

إذا كان العامود عبارة عن أرقام من نوع Integer
إستخدم المحول CInt("547") لتحويل قيمة من نوع String إلى قيمة من نوع Integer بشكل صريح
لاحض القيمة بين القوسين نصية بسبب علامة التنصيص (") ، نريد تحويلها إلى Integer صريح

إذا كان العامود عبارة عن قيم نصية
إستخدم المحول CStr(547) لتحويل قيمة من نوع Integer إلى قيمة من نوع String بشكل صريح
لاحض القيمة بين القوسين Integer صريح بدون علامة التنصيص (") نريد تحويلها إلى نص صريح

وهكذا دواليك مع الأنواع الأخرى....

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


والآن ما هي الجملة البرمجية التي أضيفها لكي أحل المشكلة ؟

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

هل وضعت أكواد تحت الداتا جريدفيو : تتفعل بمجرد النقر على الداتا جريد ؟؟

اذا كان كذلك يجب بأن تضع أكواد لتجنب الوقوع بالخطأ مثلا :
تضع في البداية : 
- اذا كان عدد الاسطر أقل من واحد أنهي الاجراء (Exit Sub)
- اذا كان الرقم المرجعي للسطر الحالي (Index يعني) أقل من صفر (Exit Sub)

يفضل أن تجعل حقل الروابط من نوع نصي
وتجعل تشغيل الراوبط عن طريق الكود 
في حدث النقر المزدوج أو المفرد على الداتا جريد 
وتضع له الكودج التالي (طبعاً بعد التعديل لما يناسب برنامجك).:
كود :
If DataGridView1.Rows.Count < 1 Then Exit Sub
If DataGridView1.CurrentRow.Index < 0 Then Exit Sub

Process.Start(DataGridView1(3, DataGridView1.CurrentRow.Index).Value.ToString())
هذا الكود على اساس أن العمود الرابع فيه الرابط ..
هذا الكود تضعه تحت حدث الـ (Click) أو  الأفضل تحت الـ (DoubleClick)..
(15-04-23, 05:35 PM)أبو خالد الشكري كتب : [ -> ]م
ساء الخير أستاذ عبد الله الدوسري
شكرا جزيلا على شرحك لمشكلة وحلها
بصراحة ما قصرت
وأنا مبدئيا فهمت قصدك .
وحقيقة جميع الأعمدة من نوع Text ، إلا فقط عمود واحد نوعه Link وهو عمود رابط الموقع
وهذا يتضح من خلال الصورة التالية :


والآن ما هي الجملة البرمجية التي أضيفها لكي أحل المشكلة ؟

ولك خالص شكري ومحبتي .



أخي أبو خالد

يوجد فرق بين 
ColumnType
وبين
ValueType

نوع العامود ليس له علاقة بنوع البيانات الموجودة فيه

نوع العامود كما أشرت أخي ( هو نوع الكنترول الظاهر في الـ DataGridView 
مثلاً 
DataGridViewTextBoxColumn
DataGridViewCheckBoxColumn
DataGridViewImageColumn
DataGridViewButtonColumn
DataGridViewComboBoxColumn
DataGridViewLinkColumn

هذة أنواع الأعمدة وليس أنواع البيانات


والدليل أن كل أنواع الأعمدة هذة تحتوي على خاصية أسمها : ValueType
مثلاً : عامود من نوع ( DataGridViewTextBoxColumn )
يمكنك تعيين نوع البيانات فيه بهذا الشكل :
DataGridViewTextBoxColumn.ValueType = GetType(String)
بشكل صريح أن تعلن أن هذا العامود من نوع String

مثلاً :
DataGridViewTextBoxColumn.ValueType = GetType(Integer)
بشكل صريح أن تعلن أن هذا العامود من نوع Integer

مع ان العامودين من نفس النوع إلى أن البيانات تختلف



مثلاً : الأعمدة التالية تستطيع عرض بيانات نصية ولكن شكل الكنترول يختلف أما صندوق نص أو زر أو قائمة منسدلة أو على شكل رابط تفاعلي
DataGridViewTextBoxColumn
DataGridViewButtonColumn
DataGridViewComboBoxColumn
DataGridViewLinkColumn

كلها تحتوي على نوع بيانات نصية


المشكلة عند تعيين البيانات لهذة الأعمدة
خالص الشكر الجزيل للأستاذين
الأستاذ عبد الله الدوسري
والأستاذ /  Taha Okla

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

ولكن رغم أني طبقت جميع ما أشرتما إليه ، إلا أن المشكلة ما زالت موجودة للأسف !

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

أنت تضع البيانات هكذا : بدون تصريح
[attachment=28857]


يجب أن تصرح بنوع البيانات
[attachment=28858]






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





بداية صبحكم الله بالخير والنور والسرور
وتقبل الله صيامكم وجميع أعمالكم الحسنة وأثابكم الجنة

أما بعد ،

فإنه عندما يجتمع عمالقة البرمجة ، نحس نحن الصغار بالتقزم
ولا يسعنى التعليق إلا أن أقول سمعا وطاعة لما توجهونا إليه بأكوادكم البرمجية وأرائكم وخبراتكم الرائعة .





أولا : أشكر عملاق البرمجة الأستاذ Taha Okla 
فعلا كان حلك صحيحا 100% ونجحت التجربة ، بمجرد مسح السطر الأخير (الفارغ) من قاعدة البيانات ، اختفت المشكلة !


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

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