PDA

View Full Version : سوال: عدم كاركرد صحيح Progress Bar



oranoos
دوشنبه 20 اردیبهشت 1389, 07:34 صبح
سلام ،من در برنامه ای که نوشتم از progress bar استفاده می کنم ؛در این برنامه رکوردها رو یکی یکی می خونه بعد فیلدهایی رو که کاربر انتخاب کرده رو با هم جمع و میانگین رو محاسبه بعد در جدول update میشه تعداد این رکوردها 26000 تاست من عملکرد progress bar رو بعد از عمل درج هر رکورد گذاشتم ولی درست عمل نمی کنه میشه بگید این مشکل رو چطور میشه حل کرد؟

ACorvinus
یک شنبه 02 خرداد 1389, 12:43 عصر
سلام رفیق.

MaximumRange مربوط به ProgressBar.Value برابر با Integer.MaxValue هستش و چون تعداد رکورهای شما از این Range کمتره (خوشبختانه) پس با این بخش مشکلی نداریم و شما در ابتدای برنامه باید ProgressBar.Max رو برابر با 26000 ست کنین!

حالا در حلقه ای که یکی یکی رکوردهارو میخونین (بعد از هربار Read کردن از Database) باید یکی به Value اضافه کنین. اینجوری:



ProgressBar.Value += 1



موفق باشین.

ashkan209
یک شنبه 02 خرداد 1389, 13:12 عصر
همون Loopی که نوشتی و پروگرس بارت توش Value میگیره را اینجا بذار ، تا بازبینی کنیم

nima898
یک شنبه 02 خرداد 1389, 13:43 عصر
حالا در حلقه ای که یکی یکی رکوردهارو میخونین (بعد از هربار Read کردن از Database) باید یکی به Value اضافه کنین. اینجوری:



view source (http://barnamenevis.org/forum/showthread.php?t=219906#viewSource)
print (http://barnamenevis.org/forum/showthread.php?t=219906#printSource)? (http://barnamenevis.org/forum/showthread.php?t=219906#about)

1.
2.ProgressBar.Value += 1



مگه حد اکثر مقدار progressbar عدد 100 نیست
فکر کنم باید عدد 100 تقسیم بر 26000 هر دفعه اضافه بشه

kasra_khan2003
یک شنبه 02 خرداد 1389, 14:17 عصر
من همیشه با این Progressbar مشکل داشتم! کسی یه sample ازش داره؟ واسه زمانی که یه رکورد رو insert میکنیم...

oranoos
دوشنبه 03 خرداد 1389, 09:35 صبح
سلام دوستان ممنونم از راهنمایی خوبتون من این کارهارو انجام دادم ولی نمی دونم مشکل کارم کجاست ،کد برنامه رو میذارم تا با راهنمایی شما اشکال کارمو پیدا کنم.

Dim countlb2 As Integer = ListBox2.Items.Count
If countlb2 = 1 Then
MessageBox.Show("محاسبه میانگین برای یک دوره مفهمومی ندارد")
ElseIf countlb2 > 1 Then
'mohasebe miangin
Dim strlistb2 As String
Dim strselect As String = "select * from tbl"
Dim daselect As New SqlClient.SqlDataAdapter(strselect, con)
Dim dsselect As New DataSet
daselect.Fill(dsselect, "tbl")
Dim count As Integer
count = dsselect.Tables("tbl").Rows.Count
'==
pBar1.Visible = True
pBar1.Maximum = count
pBar1.Value = 0
pBar1.Step = 1
'==
Dim j As Integer
For j = 0 To count - 1
strtel = dsselect.Tables("tbl").Rows(j).Item(0).ToString
For i = 0 To countlb2 - 1
strval = dsselect.Tables("tbl").Rows(j).Item(strlistb2).ToString
If ((strval <> "0") And (Not IsDBNull(strval))) Then
strsum = strsum + Val(strval)
End If

If strval = "0" Or strval = "" Then
sumzero = sumzero + 1
End If
pBar1.Value += 1
Next

If sumzero6 = 0 Then
avgsumnz = 0
Else
avgsumnz = CInt(strsum / sumzero6)
End If

Dim stru As String = "update tbl set avgsum='" & avgsumnz & "' where tel_no='" + strtel + "'"
Dim dau As New SqlClient.SqlDataAdapter(stru,con)
Dim dsu As New DataSet
dau.Fill(dsu, "tbl")
strsum = 0
sumzero = 0
avgsum = 0
avgsumnz = 0
sumzero6 = 0
'pBar1.Value += 1
Next
pBar1.Visible = False

MessageBox.Show("میانگین کارکرد دوره های انتخابی گرفته شد")
'===
End If

ACorvinus
دوشنبه 03 خرداد 1389, 11:34 صبح
مگه حد اکثر مقدار progressbar عدد 100 نیست
فکر کنم باید عدد 100 تقسیم بر 26000 هر دفعه اضافه بشه
[/left]


جواب منو یه بار دیگه بخونین!!!



Rem Integer.MaxValue = 2147483647
ProgressBar.Maximum = Integer.MaxValue



باور نمی کنی امتحانش کن. موفق باشی.
و دوستمون Oranoos کدهاتونو بزارین داخل تگ SOURCE که وقتی کسی میخواد جوابتونو بده حوصله اش بکشه کدهاتونو بخونه.

موفق باشین.

oranoos
سه شنبه 04 خرداد 1389, 07:49 صبح
دوست عزیز ممنون از راهنمایی خوبتون
من این کد رو در ابتدای برنامه که بیشترین مقدار رو بهش میدیم گذاشتم ولی با خط اولش مشکل داشت، در ضمن من دقیقا متوجه منظور شما از اینکه، هر دفعه 260000تقسیم بر 100 به progress اضافه بشه نشده ،آیا عددی که به عنوان ماکسیمم در نظر گرفتید مرتبط با همین موضوع میشه؟
ممکن خواهش کنم بیشتر توضیح بدید و اینکه این کد باید کجا اضافه بشه؟

oranoos
شنبه 08 خرداد 1389, 07:37 صبح
دوست عزیز ممکنه خواهش کنم بیشتر توضیح بدین؟

Hossein Bazyan
شنبه 08 خرداد 1389, 12:30 عصر
مگه حد اکثر مقدار progressbar عدد 100 نیست
فکر کنم باید عدد 100 تقسیم بر 26000 هر دفعه اضافه بشه
[/left]

سلام
نه درست نیست . پیش فرض مقدار max عدد 100 است که میتوانید تغییر دهید هم در کدنویسی و هم در هنگام طراحی
من مشکلی با Progressbar ندارم . در مورد سوال شما ، راههای مختلفی وجود داره که یکیش اینه : شما باید تعداد رکوردها رو به دست بیارید و مقدار ماکزیمم پروگرس را برابر اون قرار بدید


Dim RecCount as decimal = Record numer
Prog1.max = RecCount


حال میتوانید با خیال آسوده هر بار یک واحد به پروگرس بار اضافه کنید . در ضمن یادت نره در داخل حلقه بنویسی


My.Application.DoEvents


نکته آخر اینکه با فرض اینکه شما 2600 رکرود داشته باشید پروگرس هم باید 2600 بار مقدار دهی بشه که شاید برای این تعداد رکورد زیاد ملموس نباشه اما برای رکوردهای زیاد خیلی وقت گیره که من معمولا همیشه یه تناسب میذارم که بعد از خواندن مثلا n رکورد مقدار پروگرس زیاد بشه
مثلا در مثال زیر بعد از خواندن هر 10 رکورد پروگرس بار مقدار دهی میشه


if Counter mod 10 =0 Then Prog1.Value += Counter

غلامرضا شریفی
شنبه 08 خرداد 1389, 17:45 عصر
به نظر من بهتره در دستوري كه داديد كه يكي يكي ركوردها را از بانك بخواند تجديد نظر كنيد و از دستورهاي sql مثل sum جهت جمع كردن استفاده نماييد اين عمل باعث افزايش سرعت برنامه مي شود
اگر پروگرس را بصورت me.ProgressBar1 .Style =ProgressBarStyle.Marquee تنظيم كنيد ديگر مشكل عدم كاركرد صحيح حل ميشود

oranoos
یک شنبه 09 خرداد 1389, 07:55 صبح
ممنون از پاسخ های شما دوستان ،دوست عزیز من نمی تونم از sum استفاده کنم چون در اون صورت نمی تونم تعداد رکوردهایی رو که صفر یا تهی وارد شده اند را به دست بیارم

kasra_khan2003
یک شنبه 09 خرداد 1389, 10:18 صبح
دوستان لطف کنن یه نگاه به این بندازن.

من خیلی راحت میتونم تو ListView رکوردها رو نمایش بدم و Progressbar هم کار میکنه، اما نمیتونم بجای ListView از DataGrid استفاده کنم چون خطای Cross-thread میده.

در واقع اگر کد رو به این شکل دست کاری کنم، این خطا رو میده

For index As Integer = 0 To iCount - 1

Dim lvi As New ListViewItem

' Bejaye ListView
'lvi.Text = dtTable.Rows(index).Item("name")
'lvi.Text = dt.Rows(index).Item("name")

dtGrid.DataSource = dtTable.Rows(index).Item("Name")

worker.ReportProgress((index / (iCount - 1) * 100), lvi)

Next

kasra_khan2003
یک شنبه 09 خرداد 1389, 18:51 عصر
دوستان کسی نمیتونه کمک کنه؟!