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

مشكلة في ال combobox وبالتحديد في SelectedValue

مغلق
بدأه الشهاب الحارق في 22 فبراير 2005 · 7 رد · 983 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي combo box مستخدم بطرقة complex binding مثلاً اسماء الدول فيه

كقيمة Display Member و أرقام المتعارف عليها كقيم في الـ Value Member

مع أخذ هذه القيمة من الـ DataSet بلا شك . كذلك الـ Column لدي في SQL

لا يقبل NULL

الان كل شيء ماشي تمام إذا قام المستخدم بإختيار قيمة اسم بلد ما

لكن إذا كانت القيمة الأولى هي المطلوبة لنقل ارمينيا وبما أنها مختار كقيمة أولى

فإنه ليس من المنطق أن يقوم المستخدم بإخيارها لانه تحصيل حاصل

لكن المشكله لو لم يقوم بعملية الأختيار و مضى إلى التحديث تظهر رسالة تقول

ان عامود الدول لا يقبل قيمة null فكيف استطيع التعامل مع هذه المشكلة بشكل

منطقي . بحيث إذا لم يتم استخدام الcombo box فهذا يدل على أن المستخدم

قبل القيمة الأولى فيه

علماً أنني حاولت بهذا النص البرمجي فهو يعمل مع معظم الطرق إلا الـ complex binding

لانني لا أعرف كيف أسند القيمة بعد معرفة أن العمود فيه قيمة Null

النصوص البرمجية بهذا الشكل

If Me.DsMain1.MainSuspicion.Columns("Nationality").DefaultValue Is DBNull.Value Then

Me.DsMain1.MainSuspicion.Columns("Nationality").DefaultValue = Me.cboxNationality.SelectedValue

End If

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

في المثال يتضح المقال

#2

وعليكم السلام

أخي الكريم

أرى أن مشكلتك ليست التغلب على مسألة ال Null فالمستخدم كما تقول يحدد قيمة للدولة لذا لا يجب أن نتخطى هذا الأمر والقيمة هي Null فلا بد طبعاً أن نحدد المفتاح الأساسي للدولة حتى يتم تخزينه في جدول الحالي وليكن العملاء مثلاً ..

فحسبما فهمت منك أن ال في SelectedValue ترجع القيمة Null فكيف ذلك !!

الخطأ إذاً يرجع إلى تصميم قاعدة البيانات فالمفروض ألا تسمح لقيمة تستخدمها كقيمة أساسية في جدول آخر أن تكون Null ، مثلا كود الدولة يكون هو المفتاح الأساسي والذي سيكون بدوره مخزن فيValueMember وبالتالي أيضاً لا يمكن للـ SelectedValue أن ترجع قيمة خالية

هذا ما حاولت استخلاصه من كلامك لإن كان مقصدك غير ذلك فوضح حتى نناقش الأمر

والله الموفق

تم تعديل هذه المشاركة بواسطة محمد النحراوي في 22 فبراير 2005 في 08:51

#3

السلام عليكم جزاك الله خير على المشاركة

إن كنت تقصد مفتاح أساسي هو Primary Key فأنا لا اقصد هذا أبداً لانه ليس من

المنطق أن يكون المفتاح الأساسي هو اسماء الدول , لكي لا نقع في مشكلة الـ

duplicate value المهم كل ماأقصده هو كالتالي لفترض أن لدينا نموذج به خانات

منها المتطلب ومنها دون ذلك , من هذه الخانات المتطلبة خانة الجنسيات

وهذه الخانة مرتبطة بقائمة منسدلة combo box تأخذ قيمها من جدول الجنسيات

كــlookup table وهذا الـ lookup table فيه عامودين الاول Nationality_ID يتصمن ارقام الدول

والثاني Nationality يتضمن اسماء الدول

الان ربطي يكون كالتالي

لدي الجدول الرئيسي اسم tb مثلاً

cboxNationality.DataSource = Ds1

cboxNationality.DisplayMember = "Nationality.Nationality"

cboxNationality.ValueMember = "Nationality.Nationality_ID"

cboxNationality.DataBindings.Add( _

New Binding("SelectedValue", Ds1, "tb.Nationality"))

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

لذلك قام المستخدم مباشرتاً بعملية الـ update كون البيانات الإفتراضية هي البيانات

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

الان تظهر رسالة الخطأ تقول أن العامود Nationality في الجدول tb عامود متطلب Not Null

لذلك لابد من إختيار قيمة له , طيب القيمة مختارة الان كونها هي تمثل ال index 0

في القائمة المنسدلة , على كل حال هذا مثال مرفق جرب بعد عملية الـ loading

أن تقوم بالتحديث مباشرتاً دون إختيار القائمة المنسدلة

علماً أن القائمة المنسدلة لا تبدأ من القيمة -1 بل 0 وهذا يعني أن بها اسم دولةِ ما

complexbinding.rar

في المثال يتضح المقال

#4

السلام عليكم

المشكلة عندك تكمن هنا

        Me.BindingContext(Ds1, "tb").AddNew()

فهذا الأمر يقوم بإفراغ القيم الحالية وينتظر قيم جديدة ، لذا حتى وإن كان اسم الدولة ظاهر أمامك إلا أن خاصية SelectedValue مفرغة تماماً

والحل هنا إحدى أمرين : الأول أن تفرغ القيمة النصية أيضاً للComboBox وبهذا تجبر المستخدم على أن يختار قيمة معينة ، وبذلك يعاد تعبئة الSelectedValue ولعمل هذا نستخدم الكود التالي :

cboxNationality.SelectedIndex = -1

ضعه مباشرة بعد AddNew

أما الحل الثاني فهو أن تعيد أنت برمجياً إختيار القيمة الأولى في القائمة المنسدلة ، ولكن لو استخدمنا أمر

cboxNationality.SelectedIndex = 0

مباشرة فلن يحدث تغيير لأنه فعلاً في هذا الIndex والحل يكون كم يلي :

cboxNationality.SelectedIndex = -1
cboxNationality.SelectedIndex = 0

ويكون أيضاً بعد AddNew

وهكذا تختفي مشكلتك بإذن الله

والله الموفق

#5

السلام عليكم

أحسن الله إليك أخي محمد وشكراً جزيلاً لك والله يزيدك من علمه

وبالتوفيق أخي , أشتغلت تمام 100%

في المثال يتضح المقال

#6

السلام عليكم

أشكر والله من كل قلبي أخي محمد , فقط إضافة واحدة لو سمحت

العمل تمام مع data table لكن مع الdataview المشكلة حاصلة ولا تنفع معها

الطريقة السابقة و إليك نفس المثال مرفق لكن مع إضافة الـ DataView ك مصدر للجدول

الرئيسي وشاكر لك جهودة الجبارة و ااسف على هدر وقت الثمين

السلام عليكم

ComplexBindingDataViewApp.rar

في المثال يتضح المقال

#7

وعليكم السلام

لا تقل هذا أخي فنحن هنا إخواناً يساعد بعضنا بعضاً ونتعلم من بعضنا البعض

المشكلة عندك أوضحها في الكود الآتي :

  Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
        Try
            'DV(B.Position).EndEdit() ' <<<< خطأ
            Me.BindingContext(DV).EndCurrentEdit()
            updateDataSet()
            MsgBox("update successfully")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub


    Private Sub btnAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddNew.Click
        ' DV(B.Position).EndEdit() ' <<<<< خطأ
        Me.BindingContext(DV).EndCurrentEdit()

        Me.BindingContext(DV).AddNew()

        UpdateDisplay()
        Me.cboxNationality.SelectedIndex = -1
        Me.cboxNationality.SelectedIndex = 0
    End Sub

ستجد أنني استبدلت السطر

DV(B.Position).EndEdit()

بالآخر :

Me.BindingContext(DV).EndCurrentEdit()

وسيعمل معك بشكل صحيح إن شاء الله

ولكن أخي أحب أن أنصحك نصيحة (ولا تغضب :) )

طريقة كتابتك للكود غير منظمة بالمرة ، حاول تنظيم الأكود وأسماء المتغيرات والدوال وما إلى ذلك ..

أيضاً أسماء الجداول في قاعدة البيانات لا يفترض أن تتشابه أبداً مع أسماء الحقول حتى لا يحدث لبس في تنقيحك للبرنامج

أحببت التوضيح فقط

والله الموفق

#8

السلام عليكم

جزاك الله خير وشاكرلك هذا الجهد الجبار حقيقتً

ونصائحك أقبلها بصدر رحب وإن شاء الله يكون هذا المجهود الطيب في ميزان حسناتك

السلام عليكم

في المثال يتضح المقال

هذا الموضوع مغلق.

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