PDA

View Full Version : یک سوال فوق العاده مهم از Linq



R_Rajaee_Rad
سه شنبه 19 بهمن 1389, 20:16 عصر
سلام..
اين سوال شايد پيش پا افتاده باشه اما واقعا خيلي سوال مهميه!!
================================================== ==
فرض کنيد بعد از انجام تغييرات در جدول(اضافه-حذف -ويرايش) ديتاگريد شما نيازمند Refresh هست تا اطلاعات جديد رو نشون بده اما چه طوري مهمه
من از اين تکه کد استفاده ميکنم


Dim qd = From p In db.tabel()
datagridview1.DataSource = qdاین کد دوباره به بانک وصل میشه و اطلاعات جدید رو وارد دیتاگرید میکنه
بعضی ها میگن نباید این کار رو بکنی چون اگر اطلاعات زیادی در جدول باشه و بخواد بخاطر مثلا حذف یک رکورد دوباره اطلاعات در گرید پر بشن باعث هنگ برنامه میشه
================================================== =
لپ کلام بهترین راه رو برای Refresh دیتاگرید بعد از انجام تغييرات در جدول(اضافه-حذف -ويرايش) رو میخوام (در linq to sql)
متشکر

R_Rajaee_Rad
چهارشنبه 20 بهمن 1389, 09:50 صبح
یعنی اینقدر سخته؟؟

R_Rajaee_Rad
چهارشنبه 20 بهمن 1389, 19:22 عصر
اینهمه برنامه نویس که با لینک کار میکنن!!
جواب این سوال رو نمیدونن؟؟:متعجب::گریه:

man_iran
چهارشنبه 20 بهمن 1389, 20:51 عصر
گویا شما اطلاعات را توی دیتابیس می ریزید و اطلاعات دیتاگردویو را از آنجا می خونید.
برای تغییر محتوای دیتاگردویو کافیه اطلاعات موجود توی دیتابیس را بروز کنید بعد دیتاگردویو را رفرش کنید.

ایمان اختیاری
پنج شنبه 21 بهمن 1389, 11:01 صبح
خب شما یه کاری کنید .. سعی کنید با ایجاد فیلترهای مختلف ( مثل where ) استفاده کنید که حجم دیتاهای رد و بدل شده کم بشه

R_Rajaee_Rad
پنج شنبه 21 بهمن 1389, 11:11 صبح
خب اگر بخوام کل اطلاعات یک تیبل رو نشون بدم چی؟؟

ایمان اختیاری
پنج شنبه 21 بهمن 1389, 13:37 عصر
خب اگر بخوام کل اطلاعات یک تیبل رو نشون بدم چی؟؟ ببینید .. شما به نظر من بهتره جوری با دیتاتون کار کنید که فقط اطلاعات ضروری رو از دیتابیس بخونید نه رکوردهایی که لازم نیست .. حالا اگه واقعا احتیاج هست که تموم جدول رو بازیابی کنید فک نکنم راهی جز بارگیریش باشه . ...

R_Rajaee_Rad
پنج شنبه 21 بهمن 1389, 14:19 عصر
تا اینجا درست
اما بعد از تغییرات توی جدول آیا درسته که من دوباره دیتاگرید رو برای اینکه تغییرات رو آنی نشون بده دوباره پر کنم؟؟(بالفرض کل اطلاعت یه جدول که نیازه همش نشون داده بشه)
آیا از لحاظ ساختاری مشکلی نداره؟؟باعث هنگ برنامه موقعی که اطلاعات زیاد باشن نمیشه؟؟؟
راه جلش چیه؟؟
متشکر!!

ایمان اختیاری
پنج شنبه 21 بهمن 1389, 14:30 عصر
تا اینجا درست
اما بعد از تغییرات توی جدول آیا درسته که من دوباره دیتاگرید رو برای اینکه تغییرات رو آنی نشون بده دوباره پر کنم؟؟(بالفرض کل اطلاعت یه جدول که نیازه همش نشون داده بشه)
آیا از لحاظ ساختاری مشکلی نداره؟؟باعث هنگ برنامه موقعی که اطلاعات زیاد باشن نمیشه؟؟؟
راه جلش چیه؟؟
متشکر!! خب.. اگه همه دیتا رو می خواید و می خواید برنامه تون هنگ نکنه می تونید یه Thread درست کنید و اطلاعات رو توسط اون از دیتابیس بخونید و توی گرید نشون بدین
این طوری برنامه هم هنگ نمی کنه .. یا از Background Worker استفاده کنید ( امیدوارم اسمش رو درست نوشته باشم )

R_Rajaee_Rad
پنج شنبه 21 بهمن 1389, 18:40 عصر
خب.. اگه همه دیتا رو می خواید و می خواید برنامه تون هنگ نکنه می تونید یه Thread درست کنید و اطلاعات رو توسط اون از دیتابیس بخونید و توی گرید نشون بدین
این طوری برنامه هم هنگ نمی کنه .. یا از Background Worker استفاده کنید ( امیدوارم اسمش رو درست نوشته باشم )

آقا من این Thread رو نوشتم که به جدول customer وصل میشه


Dim db As New DataClasses1DataContext()
Dim rs = From p In db.Customers()
Dim UpdateThread As Thread
Dim UpdateThreadStart As New ThreadStart(AddressOf QueryDataBase)
Dim CallDataBindToDataGrid As New MethodInvoker(AddressOf Me.DataBindToDataGrid)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
UpdateThread = New Thread(UpdateThreadStart)
UpdateThread.IsBackground = True
UpdateThread.Name = "UpdateThread"
UpdateThread.Start()
End Sub


Public Sub DataBindToDataGrid()
DataGridView1.DataSource = rs
End Sub
Public Sub QueryDataBase()

Me.BeginInvoke(CallDataBindToDataGrid)
End Sub
End Class

روی سیستم های تک هسته ای هم این ریسمان ها جواب میدن؟؟
از لحاظ فریز نشدن سیستم توی واکشی ها دیگه خاطر جمع باشم؟
ببخشید که زیاد شد!!:خجالت:
متشکر...

ایمان اختیاری
پنج شنبه 21 بهمن 1389, 19:31 عصر
آقا من این Thread رو نوشتم که به جدول customer وصل میشه


Dim db As New DataClasses1DataContext()
Dim rs = From p In db.Customers()
Dim UpdateThread As Thread
Dim UpdateThreadStart As New ThreadStart(AddressOf QueryDataBase)
Dim CallDataBindToDataGrid As New MethodInvoker(AddressOf Me.DataBindToDataGrid)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
UpdateThread = New Thread(UpdateThreadStart)
UpdateThread.IsBackground = True
UpdateThread.Name = "UpdateThread"
UpdateThread.Start()
End Sub


Public Sub DataBindToDataGrid()
DataGridView1.DataSource = rs
End Sub
Public Sub QueryDataBase()

Me.BeginInvoke(CallDataBindToDataGrid)
End Sub
End Classروی سیستم های تک هسته ای هم این ریسمان ها جواب میدن؟؟
از لحاظ فریز نشدن سیستم توی واکشی ها دیگه خاطر جمع باشم؟
ببخشید که زیاد شد!!:خجالت:
متشکر...

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

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

PetekDincos
جمعه 22 بهمن 1389, 10:25 صبح
با سلام
اینکه بخواهید تعداد رکورد زیادی را در یک دیتاگراید یه طور کامل نشون بدید به نظر من کار درستی نیست
اما برای این کار شما می تونید از Collectionviewها مثلا ListCollectionView به این صورت استفاده کنید بعد از اینکه برای اولین بار دیتاگراید رو پر کردید این View را نیز ار دیتاگراید پر کنید به این صورت


ListCollectionView View=(ListCollectionView)(CollectionViewSource.Get DefaultView(this.DataGrid.ItemsSource);

و بعد در هر جایی که می خواهید رکورد اضافه نمایید به دیتابیس تون بیایید یک View.AddNew() از همون نوعی که جدول دیتابیستون از اون نوع است اضافه کنید و برای ویرایش هم از IEditableCollectionView می تونید استفاده نمایید و بایستی اینها رو زمانیکه مطمئن شدید رکورد به دیتابیستون اضاقه شد یا ویرایش رکوردتون با موفقیت انجام شد در این View ها این ها رو هم نمایش بدید و ذیگه نیازی به واکشی از ذیتابیس نیست و این فقط یک راهکار و پیشنهاد به نظر منه برای این خواستتون با تشکر

R_Rajaee_Rad
جمعه 22 بهمن 1389, 18:58 عصر
دوست عزیز مشکل من نشون دادن داده های زیاد توی گرید نبود بلکه میخواستم بدونم
بالفرض مثال یه تیبل مثلا در اینجا tabel1 دارای حداکثر 30 یا 40 تا رکورد با 5 فیلد(نام-نام خانوادگی..)هست که کاربر بعد از حذف و اضافه و ویرایش میخواد به صورت آنی تغییرات رو توی گرید ببینه
من فقط میام دوباره دیتاگرید رو از اول پر میکنم (برای رفرش شدنش )به این صورت

Dim qd = From p In db.tabel1()
datagridview1.DataSource = qdحالا کار من درسته یا نه؟؟
که دوست عزیزمون گفتن با ریسمان این کارو انجام بده که برنامه فریز نشه
و گرنه fبا حجم زیادی داده سروکار نداریم
بازم متشکر...