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

اظهار محتوى datagridcell حسب شرط معين

مغلق
بدأه moh1983 في 18 يونيو 2006 · 23 رد · 3,758 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلم عليكم

عندي datagrid كالعادة ;) تحتوي على حقلين من قاعدة البيانات هما

1- اسم المستودع من جدول store

2-اسم الصنف من جدول item

طبعا الجدولين مربوطين ب pk fk

المهم

في الداتاجريد اسم المستودع على شكل datagridcomboboxtext

و كذلك اسم الصنف

الان عندما اختار اسم المستودع من الداتاجريد اريد ان يظهر لي الاصناف المتوفرة في ذلك المستودع المختار من datagridcomboboxو ليس كل الاصناف

ارجو الرد للضرورة

#2

لا يوجد ولا رد ؟!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

لم اتوقع ذلك :(

تم تعديل هذه المشاركة بواسطة moh1983 في 19 يونيو 2006 في 04:12

#3

السلام عليكم

أخي احسن الله إليك , لو أرفقت مثال لكان أفضل, بسبب أن هنالك أكثر من طريقة لتضمين قائمة منسدلة في الـ DataGrid , بشكل مختصر في حدث تغير فهرس قائمة المستودع SelectedIndexChangeتقوم مثلاً بمناداة storedProcdure ويكون له ممرر parameter تمرر من خلالة قيمة الـ Index أو الـ Item

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

ننتظر مثال أخي... السلام عليكم.

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

#4

السلام عليكم اخي الغملاسي و لكني ذكرت مثال على ما اريده

لم افهم ما قصدك بالضبط ؟

اقتباس

عندي datagrid كالعادة تحتوي على حقلين من قاعدة البيانات هما

1- اسم المستودع من جدول store

2-اسم الصنف من جدول item

طبعا الجدولين مربوطين ب pk fk

المهم

في الداتاجريد اسم المستودع على شكل datagridcomboboxtext

و كذلك اسم الصنف

الان عندما اختار اسم المستودع من الداتاجريد اريد ان يظهر لي الاصناف المتوفرة في ذلك المستودع المختار من datagridcomboboxو ليس كل الاصناف

و هذه صورة ااتوضيح

sales.JPG

هل بالامكان عمل مثال بسيط اخي الغملاسي و بكون ممنونك :)

#5

السلام عليكم

اخي الغملاسي قمت بالاتي

CREATE proc Get_index_item @no int as
select item_name from item
where store_id=@no
GO

بعد عمل هذا ال sp قمت باستدعائه في datagridcurrent cell changeed و كتبت فيها ما يلي :

Dim cols As Int16 = NDataGrid1.CurrentCell.ColumnNumber
		Dim rows As Int16 = NDataGrid1.CurrentCell.RowNumber
		Dim dr2 As SqlClient.SqlDataReader
		SqlConn.Open()
		getitem_index.Parameters("@no").Value = NDataGrid1.Item(rows, 0)
		dr2 = getitem_index.ExecuteReader
		If dr2.Read Then
			NDataGrid1.Item(rows, 1) = dr2(0).ToString
		End If
		dr2.Close()
		SqlConn.Close()

لكني عندما اختار اسم المستودع لا تظهر لي الأصناف في الخلية اعرف ان هناك خطا ما و انتظر منك المساعدة :)

#6

السلام عليكم

بالنسبة للكود المعروض , فبطبيعة الحال لن تحصل على قيم المستودع, كونك في الـ sp طلبت فقط قيم الـ items

على كل حال إذا كانت هنالك علاقة بين الجدولين فهذا إن شاء الله سهل للغاية حيث عند تحميل النموذج تقوم بربطهم عبر Relation Object

فلن تعرض القائمة المنسدلة للصنف إلا عندما تكون قيمة في القائمة المنسدلة للمستودع.

أقصد بمثال اي مشروع مصغر يحاكي المشروع الاصلي لإجراء الاختبار عليه.

بالتوفيق إن شاء الله.

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

#7

السلام عليكم

مشكور اخي الغملاسي و طمنتني بكلامك والله :)

سوف ارفق لك مشروع مصغر ولكنه على 2003 لاني ما زلت ابحث على 2005 و قريب احصلها إن شاء الله

المشروع في المرفقات

ارجو المتابعة :)

moh.rar

#8

عزيزي أرفق قاعدة البيانات من فضلك.

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

#9

قاعدة البيانات مرفقة مع المشروع في ملف مضغوط واحد :)

#10

database name is test im waiting u reply

#11

اخي احسن الله إليك هذه قاعدة بيانات أو ملف مضغوط ؟

فإن كان ملف مضغوط فما هو البرنامج الذي تم الضغط به؟؟؟

السلام عليكم

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

#12

الملف test ليس مضغوط !!! و هو قاعدة البيانات لكني اعتقد انك لم تنتبه انها قاعدة sql server

الحمد لله ال 2005 professional متوفرة الان

بانتظارك :)

تم تعديل هذه المشاركة بواسطة moh1983 في 20 يونيو 2006 في 16:57

#13

بانتظار رد واحد على الاقل :(

#14

عفوا و لكن اين انت يا غملاسي !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#15

up

#16

السلام عليكم

تفاجأت في الحقيقة عندما عرفت من خلال المرفق لديك ان الجداول الملحقة , هي اصلاً الجداول نفسها التي تريد ربطها بـ DataGrid

فهذا خطأٌ فادح , ولا اعتقد ان مشروعك الاصلى كذلك. لانه لا يمكن ان يتم تصميم مشروع بهذا الشكل إطلاقاً .

على كل حال انا قمت مؤقتاً بإنشاء جدول ثالث ليتضمن كِلا الجدولين المستودع و الصنف.

أليك النصوص البرمجية على 2005 و أعتقد انك تملكه الان.

في بادئ الامر عرفنا عنصرين وهما كالتالي

'Binding source when EndCell fired 
	Private unfilteredItemBS = New BindingSource()

	'Bool var check if the user select child comboboxcell before parent.
	Private ISParentNotSelected As Boolean = False

تقريباً كل المنشورات و المقالات التي قراءتها بشأن العلاقة بين قائمتين منسدلتين , كانت تنوه على هذه المشكلة

المشكلة كالتالي: بما أن هنالك علاقة بين الجدولين, وان قيمة الجدول المتصل بـ DataGridView يستورد القيمة من Item table

فلن يحصل على اكثر من قيمة كون العلاقة تعمل عملية تصفية filter للجدول Item وفقاً لما في الجدول store .

حل المشكلة كالتالي: نقوم بإنشاء عنصر من نوع BindingSource وهذا العنصر لن يتضمن العلاقة وسيسند للجدول الذي يستضيف القائمتين

في الحدث EndCellEdit

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

#Region " Variables Declaration "

	'Binding source when EndCell fired 
	Private unfilteredItemBS = New BindingSource()

	'Bool var check if the user select child comboboxcell before parent.
	Private ISParentNotSelected As Boolean = False

#End Region

#Region " Loading Form event "

	Private Sub Form1_Load( _
	ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles MyBase.Load

		'load Data
		Me.StoreTableAdapter.Fill(Me.DSMain.store)
		Me.ItemTableAdapter.Fill(Me.DSMain.item)
		Me.MyDataTableAdapter.Fill(Me.DSMain.MyData)

		'Binding un filtered Bindingsource.
		unfilteredItemBS.DataSource = Me.DSMain.item

		'Customize datagridview.
		CustomizeMyDataDataGridView()

		'Establish the relationship between 2 tables.
		BindDataRelation()

	End Sub
#End Region

#Region " Cell Begin & End Edit Events "

	Private Sub MyDataDataGridView_CellBeginEdit( _
	ByVal sender As Object, _
	ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs _
	) Handles MyDataDataGridView.CellBeginEdit
		Try


			'Check that if we are on Item Column.
			If MyDataDataGridView.Columns( _
			e.ColumnIndex).Name = "ItemColumn" Then

				'Creat new ComboboxCell & Get current value 
				Dim dgcb As DataGridViewComboBoxCell = _
				CType(MyDataDataGridView(e.ColumnIndex, e.RowIndex _
				), DataGridViewComboBoxCell)


				'Check that if there's a valid value.
				If dgcb.Value IsNot Nothing Then

					'Creat second ComboBox for parent(store table)
					Dim dgcb1 As DataGridViewComboBoxCell = _
					CType(MyDataDataGridView(e.ColumnIndex - 1, e.RowIndex _
					), DataGridViewComboBoxCell)

					'check if the parent is null.
					If dgcb1.Value Is System.DBNull.Value Then

						'Notify user that he must select parent first.
						MsgBox("Please enter a data into store combobox.")

						'Indicate the EndCell event to remove current value.
						ISParentNotSelected = True

						'Exit savely..
						Return
					End If

					If dgcb1.Value IsNot DBNull.Value Or _
					dgcb1.Value IsNot Nothing Then

						'Reload the PK Value to the parent comboBoxCell
						StoreBindingSource.Filter = "store_id = " & _
						 MyDataDataGridView(e.ColumnIndex - 1, e.RowIndex).Value.ToString()
						dgcb1.DataSource = StoreBindingSource

					End If

				End If

				'Filter the Child Cell to display the related Rows.
				ItemBindingSource.Filter = "store_id = " & _
				MyDataDataGridView(e.ColumnIndex - 1, e.RowIndex).Value.ToString()
				dgcb.DataSource = ItemBindingSource


			End If
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try
	End Sub


	Private Sub MyDataDataGridView_CellEndEdit( _
	ByVal sender As Object, _
	ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
	Handles MyDataDataGridView.CellEndEdit
		Try
			'Check that if we are on Item Column.
			If MyDataDataGridView.Columns(e.ColumnIndex).Name = "ItemColumn" Then

				'If the user select child before parent comboboxcell.
				If Me.ISParentNotSelected Then

					'Assign unknown value to the current cell.
					MyDataDataGridView(e.ColumnIndex, e.RowIndex).Value = -1

					'Reset the flag variable.
					ISParentNotSelected = False

					'Exit without executing the below scripts.
					Return

				End If

				Dim dgcb As DataGridViewComboBoxCell = _
				CType(MyDataDataGridView(e.ColumnIndex, e.RowIndex) _
				, DataGridViewComboBoxCell)

				'Reload the FK value to the child comboBoxCell
				dgcb.DataSource = unfilteredItemBS

				'Remove child & parent filters.
				Me.ItemBindingSource.RemoveFilter()
				Me.StoreBindingSource.RemoveFilter()

			End If

			'Ensure that the filter will removed when stuck with Store comboBoxCell.
			If MyDataDataGridView.Columns(e.ColumnIndex).Name = "StoreColumn" Then
				Me.StoreBindingSource.RemoveFilter()
			End If


		Catch ex As Exception
			MsgBox(ex.Message)
		End Try

	End Sub

#End Region

#Region " Binding Data RelationShip "
	Private Sub BindDataRelation()
		Try

			'Clear any relation if exist.
			Me.DSMain.Relations.Clear()

			'Create relation object.
			Dim Rel As DataRelation

			'Create parent column.
			Dim ParentColumn As DataColumn = _
			DSMain.Tables("store").Columns("store_id")

			'Create child column.
			Dim childColumn As DataColumn = _
			DSMain.Tables("item").Columns("store_id")

			'Instantiate relation object.
			Rel = New DataRelation("StoreItem", ParentColumn, childColumn)

			'Add the relation to dataset's relation property.
			Me.DSMain.Relations.Add(Rel)

			'Rebind datasources.
			Me.StoreBindingSource.DataSource = Me.DSMain
			Me.StoreBindingSource.DataMember = "store"
			Me.ItemBindingSource.DataSource = Me.StoreBindingSource
			'Assign the relationship name to the item's datamember.
			Me.ItemBindingSource.DataMember = "StoreItem"
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try
	End Sub
#End Region

#Region " Data Grids Binding "

	Private Sub CustomizeMyDataDataGridView()
		Try
			'Create 2 columns.
			Dim StoreColumn As New DataGridViewComboBoxColumn
			Dim ItemColumn As New DataGridViewComboBoxColumn

			'Assign datagridview properties.
			With MyDataDataGridView
				.DataSource = Me.MyDataBindingSource
				.RowHeadersWidth = 20
				.RowTemplate.Height = 25
				.AllowUserToDeleteRows = False
				.Columns.Clear()
				.Columns.AddRange( _
							New System.Windows.Forms.DataGridViewColumn() { _
						   StoreColumn, ItemColumn})
			End With

			'Assign store column properties.
			With StoreColumn
				.DataPropertyName = "myStore"
				.HeaderText = "المستودع"
				.Name = "StoreColumn"
				.Width = 150
				.DataSource = Me.StoreBindingSource
				.DisplayMember = "stora_name"
				.ValueMember = "store_id"
				.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
			End With

			'Assign item column properties.
			With ItemColumn
				.DataPropertyName = "myItem"
				.HeaderText = "الصنف"
				.Name = "ItemColumn"
				.Width = 150
				.DataSource = unfilteredItemBS
				.DisplayMember = "item_name"
				.ValueMember = "item_no"
				.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
			End With
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try
	End Sub

#End Region

#Region " Save Items "


	Private Sub MyDataBindingNavigatorSaveItem_Click( _
	ByVal sender As System.Object, ByVal e As System.EventArgs) _
	Handles MyDataBindingNavigatorSaveItem.Click
		Try
			Me.Validate()
			Me.MyDataBindingSource.EndEdit()
			Me.MyDataTableAdapter.Update(Me.DSMain.MyData)
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try
	End Sub
#End Region

#Region " DataGridView Data Error "


	Private Sub MyDataDataGridView_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles MyDataDataGridView.DataError

		'Handle the convert error when attempt to convert comboboxcell value

		If (e.Context = DataGridViewDataErrorContexts.Commit) _
			Then
			MessageBox.Show("Commit error")
		End If
		If (e.Context = DataGridViewDataErrorContexts _
			.CurrentCellChange) Then
			MessageBox.Show("Cell change")
		End If
		If (e.Context = DataGridViewDataErrorContexts.Parsing) _
			Then
			MessageBox.Show("parsing error")
		End If
		If (e.Context = _
			DataGridViewDataErrorContexts.LeaveControl) Then
			MessageBox.Show("leave control error")
		End If

		If (TypeOf (e.Exception) Is ConstraintException) Then
			Dim view As DataGridView = CType(sender, DataGridView)
			view.Rows(e.RowIndex).ErrorText = "an error"
			view.Rows(e.RowIndex).Cells(e.ColumnIndex) _
				.ErrorText = "an error"

			e.ThrowException = False
		End If

	End Sub
#End Region

كما تلاحظ اننا استخدمنا الحدثين CellBeginEdit و CellEndEdit

وفيهما نقوم بالتالي: اولاً نتحقق هل نحن على خلية من خلايا العامود ItemColumn

ثانياً : ننشئ عنصر من نوع DataGridViewComboBoxCell

سيأخذ المكان الحالي للخلية كعامود و صف ثم يقوم بعملية فلترة للجدول store ليأخذ منه القيم المناسبة التي يفترض ان تظهر في القائمة المنسدلة item

كذلك نتحقق في نفس الحدث الاول هل العامود store فيه قيمة قبل الشروع في تصفية العامود الثاني item

في الإجراء BindDataRelation نقوم بعملية ربط بين الجدول Store مع الجدول Item بما ان بينهم مفتاح ربط.

في الحدث DataError يحدث هذا كون القيمة في اي خلية من العامود myItem في الجدول myData قد لا تكون على نفس الـ Position الموجود فيه حالياً

العامود Store لذلك لا يستطيع ان يقوم بعملية التحويل فيتم تفعيل هذا الحدث , وبهذا تلاحظ اننا لا نرسل رسالة بموجب ذلك.

بالتوفيق إن شاء الله.

StoreItemApp.rar

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

#17

مشكرو اخي الغملاسي و لكنه يظهر لي خطأ متعلق بالداتابيز

login feild for user ....

حيث لم يسبق لي التعامل مع قاعدة بيانات sql بامتداد .mdf

حاولت اعمل قاعدة بنفس الاسم و من ثم restore و لكنها لم تنجح

ما السبب ؟؟؟

#18

إذا انت لا تعمل على قاعدة بيانات SQL Server ربما تكون mySQL او غير ذلك ؟

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

#19

عفوا اخي

انا اعمل على قاعدة sql server 2000 و لكن كان سؤالي عن قاعدة البيانات اذ يظهر لي خطأ عند تشغيل برنامجك و هو متعلق ب database connection

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

قمت بعمل attach لقاعدة البيانات اللي قمت بأرفاقها و لكن دون جدوى

:) و مشكور اخي الغملاسي لكني لم ارى ما قمت به للان , ارجو ارشادي على كيفية التعامل مع قاعدة البيانات هذه او ربما يكون الخطأ في app.config في connection string ما الحل برأيك ؟

ارجو المتابعة

تم تعديل هذه المشاركة بواسطة moh1983 في 24 يونيو 2006 في 00:52

#20

يا اخي لوكنت استطيع ان اتعامل مع قاعدة البيانات التي ارفقتها انت , لما سألتك عنها !!

قم بإنشاء جدول بهذه المواصفات المعروضة في الصورة فقط لا غير

إذا كانت الصورة غير مرئية أتبعها بهذا الرابط

التالي

بالتوفيق إن شاء الله.

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

#21

يعني قمت بالامر الصعب و تجاهلت الامر السهل :)

شكرا اخي سأحاول و اخبرك بالنتيجة

#22

لا فائدة و يبدو انك قمت بعمل قاعدة البيانات على sql server 2005 صح ؟

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

اعذرني اخي و لكن اعتقد ان هناك طريقة اخرى اسهل من هذه :)

شكرا على المتابعة

تم تعديل هذه المشاركة بواسطة moh1983 في 26 يونيو 2006 في 00:37

#23

السلام عليكم

لا شكر على واجب احسن الله إليك,

نعم أتفق معك ان الكود طويل , لكن بدء بفكرة الفلترة و مضى في عرض القيمة بعد الفلترة ثم تابع إلى ان تحقق من مدخلات المستخدم

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

أتمنى لك التوفيق و السداد.

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

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

#24

السلام عليكم

ربما الرد متأخر ، لكني حاولت القيام بعملية Attach لقاعدة البيانات StoreItemDB

فلم أستطع في البداية هذا لعدم وجود الملف المكمل *.ldf ; و لتجاوز هذا قمت بحذف هذا الملف من الجزء

DataBase Alias التابع لعملية Attach .

ونجح الأمر وأستطعت تتبع المثال الرائع

شكرا لكما

تم تعديل هذه المشاركة بواسطة prosed75 في 1 يونيو 2007 في 14:33

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

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