PDA

View Full Version : گفتگو: مشکل با رویداد CellValueChanged در دیتاگرید



mina.net
پنج شنبه 14 خرداد 1388, 13:19 عصر
سلام دوستان
من می خوام محاسباتی بین سلولهای دیتاگرید همزمان با تایپ عدد در هر سلول انجام بشه. اما رویداد CellValueChanged زمانی اجرا می شه که از یک سلول به یک سلول دیگه جا بجا بشه.
آیا فکر می کنید تو رویداد دیگری باید این دستورات رو قرار بدم.
اگه بخوام واضح تر بگم می خوام مثل رویداد textchenge در textbox عمل کنه همزمان با تغییر مقادیر.

anooshiran
پنج شنبه 14 خرداد 1388, 15:44 عصر
سلام دوست عزيز

براي اين منظور شما بايد خاصيت textchanged تكست باكس را به خاصيتهاي datagridview اضافه كني. براي اين كار بايد مطابق كد زير يك class بسازي و يك بار برنامه ات را اجرا كني.
در toolbox پروژه نام اين كلاس به عنوان يك كنترل ظاهر خواهد شد. اين كنترل همان datagridview است كه خاصيت textchanged را نيز داراست. پس از آن ميتواني اين كنترل را به جاي datagridview روي فرم خود drag كني.




Public Class mydgv
Inherits DataGridView
Protected Overloads Overrides Sub OnEditingControlShowing(ByVal e As DataGridViewEditingControlShowingEventArgs)
If TypeOf e.Control Is TextBox Then 'And Me.CurrentCell.ColumnIndex = 0 Then
Dim tb As TextBox = TryCast(e.Control, TextBox)
AddHandler tb.TextChanged, AddressOf text_chang
End If
MyBase.OnEditingControlShowing(e)
End Sub
Private Sub text_chang(ByVal sender As Object, ByVal e As EventArgs)

End Sub

End Class

mina.net
پنج شنبه 14 خرداد 1388, 20:53 عصر
سلام دوست عزیز
من از کد شما استفاده کردم ولی یک مشکلی هست متاسفانه کدی که در سایت paste می کنیم بعضی از قسمتهاش کلمات با هم می چسبن و این کارو سخت می کنهک
در سطر سوم On خطا می ده.
اگه می شه تو یک برنامه up کنید.

anooshiran
جمعه 15 خرداد 1388, 01:39 صبح
Public Class mydgv
Inherits DataGridView
Protected Overloads Overrides Sub OnEditingControlShowing(ByVal e As DataGridViewEditingControlShowingEventArgs)
If TypeOf e.Control Is TextBox Then'And Me.CurrentCell.ColumnIndex = 0 Then
Dim tb As TextBox = TryCast(e.Control, TextBox)
AddHandler tb.TextChanged, AddressOf text_chang
End If
MyBase.OnEditingControlShowing(e)
End Sub
Private Sub text_chang(ByVal sender AsObject, ByVal e As EventArgs)
EndSub

mina.net
جمعه 15 خرداد 1388, 12:11 عصر
سلام دوست عزیز
ممنون از کمکهای که انجام می دید.

من از این کلاس استفاده کردم. فقط نمی دونم کد های که محاسبات بین سلولها رو انجام می ده رو باید کجا قرار بدم. در رویداد زیر که شما قرار دادید


PrivateSub text_chang(ByVal sender AsObject, ByVal e As EventArgs)EndSub

قرار دادم. ولی درست اجرا نمی شه و مقادیر قبلی رو در خودش نگه میداره.یعنی معمولا یک کارکتر عقب هست.
در ضمن فکر کنم بدون ایجاد کلاس جدید هم بتونیم این کارو بکنیم. یعنی یک دیتاگرید معمولی رو به برنامه اضافه کنیم و سپس تغییرات مورد نظرمون رو اعمال کنیم. میشه ؟

anooshiran
جمعه 15 خرداد 1388, 14:24 عصر
دوست عزيز
دقيقا صورت مسئله را بگو تا ببينم چه ميخواهي انحام دهي با ذكر مثال

mina.net
جمعه 15 خرداد 1388, 22:05 عصر
دوست عزيز
دقيقا صورت مسئله را بگو تا ببينم چه ميخواهي انحام دهي با ذكر مثال
سلام دوست عزیز
من می خوام محاسباتی بین سلولهای دیتا گرید انجام بشه .
فرض کنید ما تو رویداد TextChanged سه تا textbox یک دستور می نویسیم که جمع اولی با دومی در textbox سوم قرار بگیره. این دستور همزمان با تایپ انجام می شه و هیچ گونه تاخیری ندارد ولی رویداد CellValueChanged یا کلاسی که شما گذاشتید تا موقعی که از سلول جاری که در آن تغییرات اعمال شد جابجا نشیم تغییرات اعمال نمی شه.

برای مثال این احتما وجود دارد که کاربر یک مقداری در یک سلول وارد کند و بدون اینکه سلول جاری رو عوض کند رو دکمه ثبت کلیک کند یعنی قبل از اینکه محاسبات انجام شود.
می دونم راهی وجود دارد ولی نمی دونم چطور باید این کار رو انجام داد.

بازم ممنون از توجهی که دارید.

anooshiran
جمعه 15 خرداد 1388, 22:56 عصر
سلام دوست عزيز
خوب مسئله را از ابتدا اگر همينگونه مطرح ميكردي بهتر به نتيجه مي رسيد.
مشكل شما با textvaluechange نيست بلكه با validated گريد ويو است.
يك راه خيلي ساده اين است كه مثلا وقتي براي ثبت دگمه اي را مي فشاريد در event از endedit استفاده كنيد مشكل حل مي شود



DataGridView1.EndEdit()

شما در هر evnt ي كه از اين كد استفاده كنيد يه عبارتي validate را انجام داده ايد.

راهكار ديگر اين است كه به جاي استفاده از value از
DataGridView1.CurrentCell.FormattedValue
استفاده كنيد.

و راه هاي گونااگون و متنوع ديگري هم در اين زمينه وجود دارد.

ولي كلاسي كه من براي شما نوشتم اين امكان را به شما ميدهد كه خاصيت textchange يك textbox را به datagridview اضافه كنيد. چون خودتان در سئوالتان اين را خواسته بوديد.

Ebrahim_Rayaneh
شنبه 21 خرداد 1390, 17:56 عصر
سلام دوست عزيز
من هم يه مشكلي با اين CellValueChanged دارم(شرح مختصر برنامه): يه ديتاگريدويو خالي دارم كه در رويداد لود فرم تنظيمات اوليه را انجام ميدم توجه داشته باشيد كه ديتاگريدويو unbound هستش.مشتري دلش مي خواد كه بعضي سلول ها رو دستي بنويسه و بعضي ديگه بايد به صورت اتوماتيك پردازش بشه(براساس داده هاي سلول هاي قبلي).اما مشتري در عين حال دلش مي خواد وقتي كه اينتر و مي زنه فوكوس به سلول سمت چپي بره در همان رديف (چون فرم فارسي هست و رايت تو لفت)، و وقتي مثلا به سلول چهارم ميرسه و اينتر رو مي زنه فوكوس به سلول پنجم نبايد بره ، بلكه بايد رديف جاري رو ترك كنه و بره به رديف بعدي در ضمن يادمون نره كه بايد به ستون دوم رديف بعدي بره چون ستون اول رديف هست و تنها كارش اينكه يه شماره رديف بندازه(read only هستش) .البته مشكل من در اينجا اينايي كه گفتم نيست.اين فقط يه شرح كلي بود.
مشكل من اينه كه وقتي فوكوس از يه سلول به سلول ديگه ميره ، خطاي NullReferenceException ميده.با اينكه من به اون سلول مقدار وارد كردم.من گيج شدم مگه اين رويداد وقتي فوكوس سلول رو ترك مي كنه اتفاق نمي افته؟ منكه كه به اون سلول مقدار وارد مي كنم ، پس چرا؟عكس اين خطا رو هم مي زارم .دوستان خواهشا كمكم كنيد من درمونده شدم:گریه:

Ebrahim_Rayaneh
شنبه 21 خرداد 1390, 21:24 عصر
با سلام دوباره
ميخواستم در مورد پست قبلي بيشتر توضيح بدم :در رويداد load فرم به اين صورت عمل كردم :به صورته تصويره :

Ebrahim_Rayaneh
شنبه 21 خرداد 1390, 21:26 عصر
كسي نبود به اين بنده ي حقير كمك كنه ؟:گریه:

barbodsoft.com
یک شنبه 22 خرداد 1390, 08:30 صبح
به تاپیک زیر پست 6 و 9 مراجعه کنید. به جای CellValueChanged از حالت دیگری استفاده شده است. امیدوارم مفید باشه.
http://barnamenevis.org/showthread.php?288119-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB%8C%D8%AF&p=1268325&posted=1#post1268325

roxe77
یک شنبه 22 خرداد 1390, 15:01 عصر
من که مشکلی ندارم با این قضیه