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

سؤال فى تحويل Combox من خلال Datagrid

بدأه shosho842000 في 16 نوفمبر 2009 · 47 رد · 3,411 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

يوجد لدى مشكله فى عرض combox من خلال datagrid

حيث استخدمت هذا الكود ولكن فشل الامر

  If cn.State = ConnectionState.Open Then cn.Close()
		cn.ConnectionString = "Data Source=SSSSS;Initial Catalog=employee company;Integrated Security=True"
		cn.Open()
		cmd.Connection = cn
		cmd.CommandText = "select * from job"
		tb.Clear()
		tb.Load(cmd.ExecuteReader)
		DataGridView1.DataSource = tb
		Dim cmb As DataGridViewComboBoxCell
		If cn.State = ConnectionState.Open Then cn.Close()
		cn.Open()
		For x As Integer = 0 To DataGridView1.Rows.Count - 1
			cmd.CommandText = "select id,name from job_group"
			tb = Nothing
			tb = New DataTable
			tb.Load(cmd.ExecuteReader)
			cmb = CType(DataGridView1.Rows(x).Cells(2), DataGridViewComboBoxCell)
			cmb.DataSource = tb
			cmb.DisplayMember = "name"
			cmb.ValueMember = "id"
		Next

يظهر هذا الخطا

Unable to cast object of type 'System.Windows.Forms.DataGridViewTextBoxCell' to type 'System.Windows.Forms.DataGridViewComboBoxCell'.

#2

استبدلي هذا الكود :

			cmb = CType(DataGridView1.Rows(x).Cells(2), DataGridViewComboBoxCell)
			cmb.DataSource = tb
			cmb.DisplayMember = "name"
			cmb.ValueMember = "id"

بهذا :

		Dim clmn As DataGridViewComboBoxColumn = DirectCast(DataGridView1.Columns(2), DataGridViewComboBoxColumn)
		clmn.DataSource = tb
		clmn.DisplayMember = "name"
		clmn.ValueMember = "id"

عملية الربط مع الجدول تتم عبر كائن العمود و ليس الخلية.

العمود المراد ربط الجدول معه يجب أن يكون قد هيئ بصفة DataGridViewComboBoxColumn و ليس DataGridViewTextBoxColumn

#3

عملت الكود الاتى

		If cn.State = ConnectionState.Open Then cn.Close()
		cn.Open()
		cmd.Connection = cn
		cmd.CommandText = "select * from job"
		tb.Clear()
		tb.Load(cmd.ExecuteReader)
		DataGridView1.DataSource = tb

		For x As Integer = 0 To DataGridView1.Rows.Count - 1

			Dim clmn As DataGridViewComboBoxColumn = DirectCast(DataGridView1.Columns(2), DataGridViewComboBoxColumn)
			cmd.CommandText = "select id,name from job_group"
			tb.Load(cmd.ExecuteReader)
			clmn.DataSource = tb
			clmn.DisplayMember = "name"
			clmn.ValueMember = "id"
		Next

ويظهر نفس الخطا

#4

الحل الذي أرفقت في ردي السابق صالح عندما يكون العمود المراد ربط الجدول معه قد هيئ بصفة DataGridViewComboBoxColumn و ليس DataGridViewTextBoxColumn في وضع Design.

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

		' إنشاء عمود جديد
		Dim clmn As DataGridViewComboBoxColumn = New DataGridViewComboBoxColumn()
		' ربطه بالجدول كما كان العمود الأصلي
		clmn.DataPropertyName = DataGridView1.Columns(2).DataPropertyName
		' حذف العمود القديم
		DataGridView1.Columns.RemoveAt(2)
		' زيادة العمود الجديد
		DataGridView1.Columns.Insert(2, clmn)
		' ربط الكومبوبوكس بالجدول
		clmn.DataSource = tb
		clmn.DisplayMember = "name"
		clmn.ValueMember = "id"

لا داعي لوضع الكود داخل For.

إذا لم يشتغل الكود المرجو إرفاق المشروع.

#5

هذا هو المشروع وشكرا

هو حضرتك تفضلت وقولتلى ان الكود السابق بيشتغل لو انا مش عاملا comboxcolumn فى وضع الdesin

وهذا لم يحصل حيث اننى لم اقوم بوضع اى خليه من الخلايا فى design

وشكراااااااااااا

6.txt

WindowsApplication12.rar

#6

الخطأ كان في استعمالك لنفس كائن الداتاتابل tb في تحميل البيانات للداتاجريدفيو و بعد ذلك تقومين بالكتابة عليه و تحميل بيانات أخرى فيه. الكود الذي أرفقت في ردي السابق يعمل و لكن يحتاج لكائن DataTable خاص بالعملية حتى يعمل بنجاح :

		' استعمال كائن داتاتابل خاص بالكومبوبوكس
		Dim tb1 As New DataTable() ' تحرير
		' إنشاء عمود جديد
		Dim clmn As DataGridViewComboBoxColumn = New DataGridViewComboBoxColumn()
		' ربطه بالجدول كما كان العمود الأصلي
		clmn.DataPropertyName = DataGridView1.Columns(2).DataPropertyName
		' حذف العمود القديم
		DataGridView1.Columns.RemoveAt(2)
		' زيادة العمود الجديد
		DataGridView1.Columns.Insert(2, clmn)
		cmd.CommandText = "select id,name from job_group"
		tb1.Load(cmd.ExecuteReader)
		' ربط الكومبوبوكس بالجدول
		clmn.DataSource = tb1
		clmn.DisplayMember = "name"
		clmn.ValueMember = "id"
#7

هل يوجد حل ؟؟؟؟

#8

الحل هو الذي أرفقت لك في ردي السابق. تمت زيادة تعريف كائن DataTable خاص بالكومبوبوكس

جربيه.

#9

كدا نقول اننا وصلنا لنصف الحل والحمد الله

حيث ان ظهر الcombox والحمد الله ولكن يبقى مشكله بسيطه ان شاء الله

وهى اظهار الحقول مكرره بمعنى ان الجدول بيه 3 حقول وهما id,name,group

يقوم باظهار الاتى id,name,group ,id,name,group

حيث ان group فى العرض الاول يتم اظهار كموبوبس ولكن عن عرضه فى تانى مرة يتم اظهار الرقام المسجله فقط

لماذا ذلك علما باننى قمت باضافه textbox and combox column فى design

وشكراااااااااا

#10

الحقلين id و group1 للجدول job يجب أن يكونا أعدادا طبيعية مثلا BIGINT لأنه عندما تختارين عنصرا من الكومبوبوكس يتم حفظ مرجع التسجيل المرتبط بالعنصر المختار أي id التسجيل الذي يظهر محتوى حقله name.

تم تعديل هذه المشاركة بواسطة محمد رضى في 17 نوفمبر 2009 في 02:09 — السبب: زيادة في الشرح

#11

تمام بس هو ليه سبب التكرار فى الاعمده كما ذكرت لك انه يوجد فى الجدول الاساسى 3 اعمده يتم اظهار 6 اعمده كالاتى

id,name,group فى العرض الاول يتم اظهار الgroup كاكموبوكس

ويتم اظهارهم مرة اخرى ولكن فى المرة الثانيه يتم اظهار الgroup كالارقام المسجله

ما السبب ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

#12

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

لأنه في حالتها الراهنة لا يمكن تفسير هذا التصرف الغير عادي لعمود الكومبوبوكس.

#13

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

لقد قمت بعمل المطلوب كما ذكرت ولكن لم يتاثر اى شىء

ما العمل

وشكرا

#14

جربت المشروع على الجدولين Job و Job_groups بالبنية التالية وهو يعمل بكفاءة :

الجدول job :

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

id bigint

name1 varchar(50)

group1 bigint

الجدول job_groups :

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

id bigint

name varchar(50)

جربي و ردي علي

#15

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

لقد قمت بعمل المطلوب كما ذكرت ولكن لم يتاثر اى شىء ايضا

ارفقت البرنامج مع قاعده البيانات

وشكرا

WindowsApplication12.rar

New_Text_Document.txt

#16

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

قومي بمحو كل البييانات من الجدولين ثم جربي بهذا السيناريو.

ملاحظة : قد تحتاجين إلى تحرير الكود ليتلائم و البنية الجديدة للجدولين.

New_Text_Document_1.txt

#17

للاسف لم يحصل اى شىء

الوضع كما هو ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

للاسف لم يحصل اى شىء

الوضع كما هو ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

#18

ممكن ترفقي مثال في عدة أسطر للمعلومات المرفقة على الجدولين؟ كل جدول على حدة

#19

معلش مش فاهما ارفق ايه مش فاهما قصد حضرتك ايه

#20

عذرا, قمت بإعادة قراءة ما كتبت في ردي السابق و لم أفهم أيضا :D

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

#21

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

ممكن ترفق لى المثال الى حضرتك جربته يمكن يكون لدى شىء خطا

وشكرااااااااااااا

يعمل جيدا من غير تكرارا فى اسماء الحقول فى datagrid

#22

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

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

وشكرا

#23

المشروع الذي أرفقت في هذا الرد قمت بتجربته باستعمال بنية الجدولين التي أرفقت لك و يعمل جيدا

مثال :

الجدول job
--------------------------------------
id	name1	group1
1		Test1			1
2		Test2			2

الجدول job_groups
--------------------------------------
id	 name
1	group1
2	group2

تم تعديل هذه المشاركة بواسطة محمد رضى في 19 نوفمبر 2009 في 02:01 — السبب: تنسيق النص

#24

شكرا الوضع يسير كما طلبت وشكرا

ولكن لدى سؤال صغير حول تغير البنيه التحيه للجدول هو لازم اخليها bigint ولا ممكن اخليها int عادى

#25

لا ليس بالضرورة BIGINT و لكن المتعارف عليه و المعمول به و المنصوح به أن مراجع التسجيلات IDs تكون دائما من هذا النوع و خصوصا إذا كان سيتم استعماله كمفتاح رئيسي للجدول.

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