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

[تنبيه - عنوان غير مناسب : ]أين المدافعين عن أداة Datagridview تنتظر20 ثانية لجلب بيانات

مغلق
بدأه qaher في 18 نوفمبر 2007 · 16 رد · 1,846 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندي جدول أصناف يحتوي على مائتي ألف سجل

عند عمل التعبئة للداتا قريد فيو تستغرق حوالي 20 ثانية حتى تستجيب وتأتي بالسجلات

صراحة لغات أقدم جابتها في لحظات

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

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

مع العلم البيانات من جدول واحد فقط

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

جربت التعامل مع backgroundworker

لكن ماعرفت استخدمها مع DataGridView

فما هو الحل برأيكم

تحياتي لكم

تم تعديل هذه المشاركة بواسطة qaher في 18 نوفمبر 2007 في 21:03

#2

العنوان غير مناسب

الرجاء اختيار عنوان مناسب أكثر في مواضيعك القادمة، وهذا بمثابة إشعار للأهمية.

وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!!

قواعد المشاركة

/index.php?showtopic=29343

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

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

ممكن تستخدم الطريقة اللى فى المثال دى مع ملاحظة انها بعيدة عن الوزارد فقط تعمل columns و تسميها زى ما انت عايز و تيجى بالكود تعمل row مع ملاحظة ترتيب الاعمده

المثال هنا لجلب مواعيد مسجلة فى قاعدة بيانات و انا عاملة مسبقا اعمدة ..الرقم واليوم و التاريخ و الساعة و المكان و تنبيه و كلهم textbox ماعدا الاخير فهو checkbox

SqlDataAdapter adapter = new SqlDataAdapter(GetInterviewscom);
				DataSet mydataset = new DataSet();
				adapter.Fill(mydataset);
				DataTable mydatatable = mydataset.Tables[0];
				int i = 1;
				foreach (DataRow datarow in mydatatable.Rows)
				{
					string num = i.ToString();
					string daystr = datarow["day_"].ToString();
					string datestr = datarow["date_"].ToString();
					string timestr = datarow["time_"].ToString();
					string placestr = datarow["place"].ToString();
					string alterstr = datarow["alter_"].ToString();
					string[] row ={ num, daystr, datestr, timestr, placestr, alterstr };
					this.interviewsdataGridView.Rows.Add(row);
					i++;
				}
#4

اخت heba_22

ألف شكر على ردك

حولته إلى فيجوال بيسك

عبر الموقع هذا

http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx

بهذه الطريقة

Private Sub FillBy_code_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	  'PRICESTableAdapter.Fill(Me.PricesDataSet.PRICES)

		Dim mydataset As New DataSet()
		'adapter.Fill(mydataset)>>>>>>>>>>>> يعطيني ايرور هنا
		Dim mydatatable As DataTable = PricesDataSet.Tables(0)
		Dim i As Integer = 1
		For Each datarow As DataRow In mydatatable.Rows
			Dim num As String = i.ToString()
			Dim daystr As String = datarow("SKU").ToString()
			Dim datestr As String = datarow("QTY").ToString()
			Dim timestr As String = datarow("DESC1").ToString()
			Dim row As String() = {num, daystr, datestr, timestr}
			Me.DataGridView1.Rows.Add(row)
			i += 1
		Next
	End Sub

لكن ما اشتغل خير شر

شباب ويش الحل

تم تعديل هذه المشاركة بواسطة qaher في 19 نوفمبر 2007 في 19:34

#5

أخوي محمد سامر

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

تم تعديل هذه المشاركة بواسطة qaher في 19 نوفمبر 2007 في 19:35

#6

انا اصلا الكود واخداه من جزء من برنامج طويل عريض انا عاملاه و مستخدمه stored procedure عاملاها فى قاعدة البيانات يعنى طبيعى يديك خطأ لانك لازم تعمل ال SqlCommand الاول اللى هوGetInterviewscom

و انا لما حطيت الكود كان قصدى انك تاخد الفكرة فقط يعنى بلاش تستخدم المعالج لوضع البيانات فى الداتا جرايد استخدم الكود افضل و انت ممكن تستغنى عن ال Adapter و تستخدم ExecuteNonQuery()

و متهيألى دى افضل لانها بتجيب البيانات سجل سجل مش تجيبهم كلهم و فى الاخر تظهرهم للمستخدم

و للعلم الكود اللى انا كتبته شغال عندى فقط انت لابد ان تتأكد انك معرف كل المتغيرات و منهم ال command

و عشان مزعلكش حكتب الكود الكامل هنا

public void GetInterviews()
		{
			this.interviewsdataGridView.Rows.Clear();
			SqlCommand GetInterviewscom = new SqlCommand("GetInterviews", this.mySqlconnection);
			GetInterviewscom.CommandType = CommandType.StoredProcedure;
			GetInterviewscom.Parameters.Add(new SqlParameter("@user_name", this.user_name));
			GetInterviewscom.Parameters.Add(new SqlParameter("@group_name", this.group_name));
			GetInterviewscom.Parameters.Add(new SqlParameter("@nick_name", this.contact_name));
			try
			{
				if (this.mySqlconnection.State == ConnectionState.Closed)
				{
					this.mySqlconnection.Open();
				}
				SqlDataAdapter adapter = new SqlDataAdapter(GetInterviewscom);
				DataSet mydataset = new DataSet();
				adapter.Fill(mydataset);
				DataTable mydatatable = mydataset.Tables[0];
				int i = 1;
				foreach (DataRow datarow in mydatatable.Rows)
				{
					string num = i.ToString();
					string daystr = datarow["day_"].ToString();
					string datestr = datarow["date_"].ToString();
					string timestr = datarow["time_"].ToString();
					string placestr = datarow["place"].ToString();
					string alterstr = datarow["alter_"].ToString();
					string[] row ={ num, daystr, datestr, timestr, placestr, alterstr };
					this.interviewsdataGridView.Rows.Add(row);
					i++;
				}
			}
			catch (SqlException ex)
			{
				MessageBox.Show(ex.Message);
			}
			finally
			{
				this.mySqlconnection.Close();
			}
#7

انا استعمل الأمر Fill

فهو سهل ويتكون من سطر واحد فقط

وبيجيب الداتا كلها

انا طبعا استخدم BindingNavigator1

بالويزارد

لكن كيف أخلي الداتا تيجي بالتدريج

وليس كلها دفعة واحدة

فما الحل

تحياتي1

#8

هذا الكود اللي أستخدمه لجلب البيانات في الحدث Form Load

Me.INVMSTTableAdapter.Fill(Me.InvmstDataSet.INVMST)
#9

يمكنك استخدام BackGroundWorker و عند الإنتهاء من تنفيد اجراء DoWork أن ترجع قيمة عبر متغير و تسندها ل Control الدي تريد .. و في هده الحالة يمكنك إرجاع DataTable و اسنادها ك DataSource ل Datagridview ... و هكدا ستتيح للمستخدم إمكنية مشاهدة نسبة تعبئة Datagridview عن طريق ReportProgress للعنصر BackGroundWorker ... وكدلك إمكانية التعامل مع Controls اللأخرى في نفس الوقت دون الحاجة إلى إنتظار Datagridview لكي تعبىء

تم تعديل هذه المشاركة بواسطة Fikou-sama في 29 نوفمبر 2007 في 23:34

مقالاتي في VB.NET وبرامجي على موقعي الجديد :

#10

شكراا أخي

لكن كيف أقوم بـ

اقتباس
إرجاع DataTable و اسنادها ك DataSource ل Datagridview

لأنه جربت التعامل مع BackGroundWorker

للداتا قريد فيوم لكن بيظهر خطأ دايما

هل لديك كود لهذا الموضوع

تحياتي لك

#11

إليك مثال بسيط و ممكن تطوره حسب حاجياتك

Dim DT As New DataTable

Private Sub BackGroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
	Dim Con As New SqlConnection("Connection String")
	Dim Com As New SqlCommand
	Dim DA As SqlDataAdapter
	Dim DS As New DataSet

	Com.CommandText = "Select * from Table1"
	DA = New SqlDataAdapter(Com)
	DA.Fill(DS,"Table")
	DT = DA.Tables("Table")
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGW.RunWorkerCompleted
DataGridView1.DataSource = DT
End Sub

مقالاتي في VB.NET وبرامجي على موقعي الجديد :

#12

اخي الكريم

انا اتعامل مع قاعدة بيانات اوراكل

هل تعدل الكود ليتعامل معها

أو يتعامل مع الداتا سيت

انا حاولت بالكود التالي لكن مانجحت

	Dim DA As INVMSTTableAdapter   'يطلع ايرور بهذا السطر
		Dim DS As New DataSet

		DA = New INVMSTTableAdapter	  'يطلع ايرور بهذا السطر
		DA.Fill(Me.InvmstDataSet.INVMST)
		DT = DA.Tables("Table")

وشكرا أخي الكريم على تفاعلك

#13

يبدو لي أنك قمت بسحب DataSet و المكونات الأخرى إلى الفورم ... أظن أنه عليك الإتصال بالقاعدة و سحب المعلومات عن طريق الكود حتى تتمكن من استغلال BackGroundWorker ... و أتمنى أن يعطيك المثال السابق فكرة عن ارجاع متغير عن طريق BackGroundWorker ...

و على فكرة يجب أن تغير Imports System.Data.SqlClient إلى Imports System.Data.OleDb إدا أردت العمل على قاعدة Oracle

Fikou-Sama

تم تعديل هذه المشاركة بواسطة Fikou-sama في 30 نوفمبر 2007 في 15:43

مقالاتي في VB.NET وبرامجي على موقعي الجديد :

#14

نصيحة: خذ كورس كامل في الـADO.NET. فالسؤال يدل أنك ما زلت تفكر بطريقة الـADO القديمة أو الـConnected Mode بدلاُ من الـDisonnected Mode

#15

أخي Fikou-Sama

أستفدت من الكود اللي اعطيتني اياه وعملت على نصيحتك

وأشتغلت معي 100%

لا غلط ليس 100%

بل مليون %

وشكرا... لك جزيل الشكر على التفاعل معي

===============================

أخي الكريم System Down

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

وإذا كنت تعرف الطريقة الجديده ياليت تدلنا عليها

تحياتي لك

تم تعديل هذه المشاركة بواسطة qaher في 2 ديسمبر 2007 في 05:39

#16

مرحبا

الكود التالي معي شغال 100%

لكن جربت أعبي الداتا قريد تدريجيا

فأستخدمت لووووب

لكن للأسف النتيجة اللي تظهر هي آخر دخول للووووب

فكيف ما أخلي الداتا السابقة تنمسح

الكود هو

Imports System.Data.OracleClient
Imports System.Data
Imports System.ComponentModel

Public Class Form7
	Dim cn As OracleConnection
	Dim dt As New DataTable
	Dim i As Integer

	Private Sub Form7_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		'===
		Me.Show()
		For i = 10000 To 21300 Step 100

			BGW.WorkerReportsProgress = True
			BGW.WorkerSupportsCancellation = True
			lblResultProcess.Text = "proccessing..."
			Try
				BGW.RunWorkerAsync(1000)
			Catch ex As Exception
			End Try

		Next i
	End Sub

	Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
		Dim worker1 As BackgroundWorker = CType(sender, BackgroundWorker)
		e.Result = Fill(e.Argument, worker1, e)
	End Sub

	Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BGW.ProgressChanged
		Me.ToolStripProgressBar1.Value = e.ProgressPercentage
		Me.lblResultProcess.Text = " Test " & e.ProgressPercentage & "%"
	End Sub

	Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGW.RunWorkerCompleted
		If Not e.Error Is Nothing Then
			Throw New Exception(e.Error.ToString)
		End If
		ToolStripProgressBar1.Value = 0
		DataGridView1.DataSource = dt

	End Sub

	Public Function Fill(ByVal count As Integer, ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As DataTable
		Dim cn As OracleConnection = Nothing

		Try
			worker.ReportProgress(30)
			cn = New OracleConnection(DBConnection.conStr)
			cn.Open()

			Dim Cmd As New OracleDataAdapter("Select * from invmst where (SKU > '" & i & "') AND (SKU < '" & i + 100 & "') order by sku", cn)
			Cmd.SelectCommand.CommandType = CommandType.Text
			Dim trans As OracleTransaction
			trans = cn.BeginTransaction
			Cmd.SelectCommand.Transaction = trans

			Try
				Cmd.Fill(dt)
				worker.ReportProgress(60)
				worker.ReportProgress(100)

			Catch ex As Exception
				trans.Rollback()
				MsgBox("nooo")
			End Try

		Catch ex As Exception
			Console.WriteLine(ex.Message)
		Finally
			cn.Close()
		End Try
		Return (dt)

	End Function

End Class
#17
qaher كتب:
أخي الكريم System Down

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

وإذا كنت تعرف الطريقة الجديده ياليت تدلنا عليها

تحياتي لك

هناك نيو هورايزن و معهد الألفية (كلاهما في جدة). أو يمكنك تعلم الـADO.NET من أي كتاب مناسب بالذات و أنت لديك خلفية برمجية.

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

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