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

كيف اعمل تحديث للdatagridview من غير ما أجعل المؤشر يرجع إلى أول صف؟؟؟

بدأه atob في 17 يونيو 2008 · 15 رد · 4,252 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف اعمل تحديث للـ Datagridview من غير ما أجعل المؤشر يرجع إلى أول صف؟؟؟

وكيف اربط زرين بوتوم على الفورم لعمل كودين على ملف اكسيل ؟؟؟

طبعا الملف مربوط بملف اكسيل موجود على الامتداد ...\bin\debug يوجد في ملف الاكسيل كود لتشغيل ساعة لتحديث الجدول فيه وكود اخر لايقاف الساعة الغرض من هذين الكودين هو ايضاح تحديث البيانات في فورم vb.net عند الربط

في فورم vb.net اضفت اداة ال timer ووضعت كود الربط في حدث ال timer

الملاحظ عند تشغيل الفورم وتشغيل كود الساعه في ملف الاكسيل يعمل التحديث على الوجه المطلوب ولكن الداتاقريد لا يمكن تثبيتها على الصف الذي كنت عليه او تثبيتها بالوضع الذي هي عليه

وهو انني كل ما نزلت بالمؤشر للسجلات السفلى

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

وشئ اخر وهو هل استطيع ان اضع زرين بوتوم على الفورم تقوم هذين الزرين بتشغيل كود تشغيل الساعه وايقافها في ملف الاكسيل

الملف المرفق يوضح طلبي

فما الحل لهذه لمشكله ؟؟؟

تحياتي لكم

formexcel.zip

#2

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

#3

ما اريده هو تحديث البيانات كلما تغيرت في قاعده البيانات

او ان تبقى طريقه تحديث بيانات الداتا قريد فيو كما هي موجوده في الملف الذي ارفقته في مشاركتي السابقه ولكن تتفاعل الداتا قريد فيو معي بحيث بامكاني التحكم بها من ناحيه ترتيبها من الاعلى للادنى لكل عمود وايضا امكنيه استعمال السكرول وايضا الصف الموجود عليه زر الفأره

اخواني ارجو مساعدتي لاني والله في امس الحاجه للحل

#4

السلام عليكم

أخي atob

هذه طريقة منقولة من المشاركة التي كانت تخص ترتيب الأعمدة في الdatagridview بعد

إعادة تعبئتها في من قاعدة البيانات

موضوع سابق

لكن لطلبك الكود نظرا لإستخدامك vs2005

تفضل .......

في التصريح العام للform

 'تعريف متغيران رقمية لحفظ رقم العامود الذي تم ترتيبه + نوع الترتيب
	Dim sorted_col, sort_mode As Integer
	'DataSet تعريف متغير من نوع
	' لحفظ البيانات من القاعدة وعرضها 
	Dim ds As DataSet

إضافة الsub التالي:

Sub SORTDGV()
		If Me.sort_mode = -1 Then
			Exit Sub
		End If
		Me.DataGridView1.Sort(DataGridView1.Columns(sorted_col), sort_mode)
	End Sub

في حدث التحميل للبرنامج أضف الكود التالي:

 Me.sort_mode = -1 'جعل نوع ترتيب فارغ
		SORTDGV()

في حدث الترتيب DataGridView1_Sorted

للأداة DataGridView1

أكتب الكود التالي:

'إضافة متغيرات لحفظ العامود الذي تم الترتيبه ونوع الترتيب
		If Me.DataGridView1.RowCount = 0 Then
			Exit Sub
		Else
			sorted_col = DataGridView1.SortedColumn.Index
			If Me.DataGridView1.SortOrder = SortOrder.Ascending Then
				sort_mode = 0 'تصاعدي
			ElseIf Me.DataGridView1.SortOrder = SortOrder.Descending Then
				sort_mode = 1 'تنازلي
			Else
				sort_mode = -1 'لا يجوجد ترتيب
			End If
		End If

بعدإعادة تعبئة البيانات فقط إكتب الكود التالي

SORTDGV()

وأخيرا أرجو أن تكون الأكواد واضحة

تحياتي

البرمجه منطق وذوق وخدع .............والمعرفة طريق سهل وعذب

#5

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

وطبعا هذا ما كنت اتمناه وشكرا لك

لكن عندي طلب اخير هو ان الاكواد تعمل بطريقه ممتازه وتحفظ الترتيب بالشكل المطلوب

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

Dim Index As Int16 = DataGridView1.CurrentCell.RowIndex.ToString()

DataGridView1.CurrentCell = DataGridView1.Rows(Index).Cells(0)

وبعدها ساعدتني مشكورا بكود تثبيت الترتيب

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

ففكرت ان احفظ السكرول بار على وضعه الاخير في متغير فلم استطيع

فهل من حل واشكرك

تم تعديل هذه المشاركة بواسطة atob في 7 يوليو 2008 في 14:48

#6

السلام عليكم

أولا بارك الله فيك على الدعاء

أما بخصوص ترتيب الصف فإليك هذه الطريقة:

في التصريح العام للكود أضف :

 'تعريف متغيران رقمية لحفظ رقم الصف الحالي والعامود
	Dim row_id, col_id As Integer

في حدث CurrentCellChanged للأداة datatgridview أضف:

  If Me.DataGridView1.SelectedRows.Count = 0 Then
			Exit Sub
		End If
		Try
			row_id = DataGridView1.CurrentCell.RowIndex
			col_id = DataGridView1.CurrentCell.ColumnIndex
		Catch ex As Exception

		End Try

وأخيرا بعد جلب البيانات أكتب الكود :

Me.DataGridView1.CurrentCell = Me.DataGridView1.Item(col_id, row_id)

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

البرمجه منطق وذوق وخدع .............والمعرفة طريق سهل وعذب

#7

اخي مقرن اشكرك جزيل الشكر على ردك الجميل

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

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

#8

السلام عليكم

تفضل هذه طريقة سهلة لحفظ قيمة ال Scrollbar للDataGridView

في التصريح العام:

	  Dim v_scrol, h_scrol As Integer

عند تعبئتة البيانات في الTimer:

  v_scrol = Me.DataGridView1.FirstDisplayedScrollingRowIndex
		h_scrol = Me.DataGridView1.FirstDisplayedScrollingColumnIndex

		'Fill تعبئتة البيانات 

		Me.DataGridView1.FirstDisplayedScrollingRowIndex = v_scrol
		Me.DataGridView1.FirstDisplayedScrollingColumnIndex = h_scrol

وأتوقع هذا هو حل مشكلتك إن شاء الله

:)

البرمجه منطق وذوق وخدع .............والمعرفة طريق سهل وعذب

#9

بسم الله الرحمن الرحيم

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

أخي بالنسبة لمشكلتك واجهتني ذاتا مرة ...... وإليك الحل : تابع الخطوات التالية ....

1- قام المستخدم بإضافة صف إلى الدتا جرايد سميه updaterow

2- عملية ترجيع المؤشر لأخر صف قام المستخدم بإضافته + تلوين الصف الذي قمتنا بتعديله ( إختيارية ) كم ترد هذا في سؤالك لكن أضفتها للعلم بالشيء فقط :

  int updaterow = dataGridView1.CurrentRow.Index; // متغير يحفظ لنا قيمة الصف الحالي 



				dataGridView1.CurrentCell = dataGridView1[0, updaterow];  // نجبر الدتا جرايد لتحريك المؤشر للسطر الذي قمنا بالتعديل فيه  بعد التحديث



				dataGridView1.CurrentRow.DefaultCellStyle.SelectionBackColor = Color.Red;  // تلوين الصف الذي قمنا بتعديله

3- أخيرا ضع هذا الكود تحديث قاعدة البيانات ...

هذا والله أعلم وصلى اللهم على نبينا محمد وعلى آله وصحبه وسلم ....

أخوك زيدان

#10

اشكرك اخي مقرن وايضا اشكرك اخي زيدان على ردودكم الرائعه

ولكن اسمحوني كثرت اسئلتي قليلا لكن ثقوا تمام الثقه ان هناك اشخاص غيري سوف يستفيدون من هذه المعلومات الرائعه التي تقدمونها

اخي مقرن بعد تطبيق الكود عمل بشكل رائع تشكر عليه ولكن عند الضغط على زر السكرول البار الذي ينزله للاسفل او الاعلى يختفي الزر ويصبح غير مفعل وعند الضغط عليه للمرة الثانيه تتكبر الداتا قريد فيو بمل الشاشه وهذا لا اريده ........فكيف الحل

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

#11

السلام عليكم أخ atob

لم أفهم مشكلتك في إختفاء زر الScroll و تكبيرة الأداة لملئ الشاشة .

* هل تستخدم Thread في تعبئتة البيانات ؟

وبخصوص توع البيانات التي تعرضها يمكنك التأكد من خلال عملية Test وعرض صف كامل في رسالة (Msgbox) للتـأكد من جلب الحقول كاملة قبل ربطها بال DataGridview

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

سلام

البرمجه منطق وذوق وخدع .............والمعرفة طريق سهل وعذب

#12

اشكرك اخي مقرن والحقيقة اخجلتني منك

هذا هو المثال على تساؤلي طبعا الداتا قريد فيو مرتبطه بجدول اسمه addresses موجود في ملف اكسيل nasserموجود في ملف bin طبعا ملف الاكسيل يوجد فيه زرين مايكرو مهمتها تشغيل وايقاف الساعه في ملف الاكسيل لاجل اعرف ان البيانات تتحدث في فورم الفيجوال بيسك دوت نت بعد الربط طبعا لم اجد طريقه حسب علمي تحدث البيانات بين جدول الاكسيل والداتا قريد فيو في الفورم الا عن طريق التايمر لكن عندما يعمل التايمر تعبأ البيانات في الداتا قريد لكن تثبت على الخليه الاولى فيها ولا يمكني الانتقال الي اسفلها

فقمت بحل هذه المشكله بأن حفظت رقم الصف الحالي في متغير يرجع اليه الكود عند كل تحديث

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

المشكله التي طلبتها اخيرا هي انني عند النقر على سهم تحريك السكرول للاسفل تتكبر الداتا قريد او ان يصبح السهم غير فاعلا

والشئ الاخر هو كيف اكون زرين بوتوم على الفورم تكون مهمه الاول تشغيل مايكرو عمل الساعه في ملف الاكسيل المذكور سابقا والبوتوم الثاني لايقاف مايكرو ايقاف الساعه في ملف الاكسيل

اخي مقرن اعط نظره على المثال المرفق واعطني رائك ...........واخيرا لك مني كل الاحترام

excel_vb.net1.rar

#13

السلام عليكم أخي atob

لقد حملت المشروع ولأنني استخدم VS2008

لقد تمت ترقية المشروع وقد تم تعديل بعض الترتيبات في الكود ليس أكثر وحذف بعض

الزوائد. ويمكن كتابة الكلاس الخاص بالForm من الكود التالي:

نظرا لإستخدمك VS2005

Imports System.Data
Imports System.Data.OleDb
Public Class Form1
	'تعريف متغيران رقمية لحفظ رقم العامود الذي تم ترتيبه + نوع الترتيب
	Dim sorted_col, sort_mode As Integer
	Dim v_scrol, h_scrol As Integer
	Dim Index As Int16
	Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

		Label1.Text = CStr(TimeOfDay)
		Dim nasser As String = "data\ExcelData.xls"

		Dim strConn As String = "Provider=Microsoft.Jet.OleDb.4.0;" _
		& "data source=nasser.xls;" _
		& "Extended Properties=Excel 8.0;"

		Dim objConn As New OleDbConnection(strConn)

		Try
			Dim strSql As String = "Select * From addresses"
			Dim objCmd As New OleDbCommand(strSql, objConn)
			Dim ds As DataSet = New DataSet
			Dim da As OleDbDataAdapter = New OleDbDataAdapter(objCmd)
			index = DataGridView1.CurrentCell.RowIndex.ToString()
			v_scrol = Me.DataGridView1.FirstDisplayedScrollingRowIndex
			h_scrol = Me.DataGridView1.FirstDisplayedScrollingColumnIndex
			da.Fill(ds)
			Me.DataGridView1.DataSource = ds.Tables(0)
			DataGridView1.CurrentCell = DataGridView1.Item(0, Index)
			Me.DataGridView1.FirstDisplayedScrollingRowIndex = v_scrol
			Me.DataGridView1.FirstDisplayedScrollingColumnIndex = h_scrol
			SORTDGV()
			Me.Text = "Connection Up"
		Catch exc As Exception
			MsgBox(exc.Message)
			Me.Text = "Connection Down"
		Finally
			objConn.Dispose()
		End Try
	End Sub

	Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
		Me.sort_mode = -1 'جعل نوع ترتيب فارغ
		Dim strConn As String = "Provider=Microsoft.Jet.OleDb.4.0;" _
		& "data source=nasser.xls;" _
		& "Extended Properties=Excel 8.0;"

		Dim objConn As New OleDbConnection(strConn)
		Try
			Dim strSql As String = "Select * From addresses"

			Dim objCmd As New OleDbCommand(strSql, objConn)
			Dim ds As DataSet = New DataSet
			Dim da As OleDbDataAdapter = New OleDbDataAdapter(objCmd)

			da.Fill(ds)
			Me.DataGridView1.DataSource = ds.Tables(0)
			SORTDGV()
		Catch exc As Exception
			MsgBox(exc.Message)
		Finally
			objConn.Dispose()
		End Try

	End Sub


	Sub SORTDGV()
		If Me.sort_mode = -1 Then
			Exit Sub
		End If
		Me.DataGridView1.Sort(DataGridView1.Columns(sorted_col), sort_mode)
	End Sub


	Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
		Dim p As String
		p = Me.DataGridView1.CurrentCell.RowIndex.ToString()
		Me.DataGridView1.Rows(p).Selected = True
	End Sub


	Private Sub DataGridView1_Sorted(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.Sorted
		'إضافة متغيرات لحفظ العامود الذي تم الترتيبه ونوع الترتيب
		If Me.DataGridView1.RowCount = 0 Then
			Exit Sub
		Else
			sorted_col = DataGridView1.SortedColumn.Index
			If Me.DataGridView1.SortOrder = SortOrder.Ascending Then
				sort_mode = 0 'تصاعدي
			ElseIf Me.DataGridView1.SortOrder = SortOrder.Descending Then
				sort_mode = 1 'تنازلي
			Else
				sort_mode = -1 'لا يجوجد ترتيب
			End If
		End If
	End Sub
End Class

وأخيرا تعديل بسيط على خصائص Datagridview

إما عن طريق الDesign Mode أو Run Mode وهي :

'جعل الأعمدة تأخذ الوضع الممتلئ لحجم الأداة مما يؤدي لإخفاء ال
			'Horizontal Srollbar 
			Me.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
			'جعل نوع التحديد لأداة كصف كامل
			Me.DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
			'إخفاء رؤوس الصفوف
			Me.DataGridView1.RowHeadersVisible = False
			'جعل الإداة للقراءة فقط وغير قابلة للتعديل من قبل المستخدم
			Me.DataGridView1.ReadOnly = True

مع إمنياتي لك بالتوفيق والنجاح

البرمجه منطق وذوق وخدع .............والمعرفة طريق سهل وعذب

#14

السلام عليكم

على فكرة بخصوص ال Timer الموجود في ملف ال Excel

يمكنك الإستغناء عنه إذا كان فقط لمعرفة أن البيانات تم نقلها

وذلك لإضافتي في الكود حالة الإتصال والتي سوف تعرض في عنوان ال form

Connection up

أو

Connection Down

:)

البرمجه منطق وذوق وخدع .............والمعرفة طريق سهل وعذب

#15

اخي مقرن فعلت في معروف ولن ستطيع ان اجازيك الا بالدعاء

كانت ردودك على مثل الماء البارد بعد عطش فقد كنت منتظر اي اجابه على تساؤلاتي وقمت انت بالرد على كل مايدور في خاطري من استفسارات فلك مني جزيل الشكر والتقدير

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

http://www.codeproject.com/KB/cs/DataGridView_paging.aspx

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

#16

السلام عليكم

آسف على التأخير في الرد وأحييك على أخلاق أخوي atob

بخصوص المثال الموجود في مشاركتك, إطلعت عليه لكن لا أظن أن الحل يوجد بهذه الطريقة من وجهة نظري وذلك لأن مشكلة فقدان الصفوف واردة حتى ولو أِضفت Scrollbar

خارجي وتم ربطه من الDataGridView

طبعا مافي شي مستحيل ولكن وجهة نظر...

تحياتي لك عزيزي atob

البرمجه منطق وذوق وخدع .............والمعرفة طريق سهل وعذب

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