PDA

View Full Version : (ListBox --->( Items & DataSource



saman_itc
سه شنبه 02 بهمن 1386, 23:13 عصر
با سلام خدمت دوستان
مشکل من تو listbox هست.
تا وقتی بدون dateset , datemembers از listbox استفاده میکردم مشکلی نواشتم
یه جا مجبور شدم از dateset , datemembers استفاده کنم
ولی حالا میخوام با item ها listbox کار کنم این خطا رو میده

Items collection cannot be modified when the DataSource property is set.
چه طور میتونم یه هر وقت خواستم با DataSource لیت بکس پر کنم و بعد بتونم item هاشو add or remove کنم
پیشاپیش تشکر میکنم
__________________

saman_itc
پنج شنبه 04 بهمن 1386, 06:04 صبح
تا حالا کسی با این مشکل بر نخورد؟

visual_sadegh
پنج شنبه 04 بهمن 1386, 11:34 صبح
بهترین کار به نظر من استفاده از datareader هست

maryam_vb
پنج شنبه 04 بهمن 1386, 11:49 صبح
چندتا سوال واسم پیش اومد، وقتی لیست پر شد معادل عملیات اضافه و حذف آیتم های لیست در بانک هم صورت بگیره؟اونوقت جدول مورد نظر چند تا فیلد داره؟با حذف یک آیتم کل سطر رو پاک کنه یا فقط فیلد مربوط رو خالی کنه؟
یا با افزودن به لیست تکلیف فیلد های دیگه چی میشه؟

سوالاتم رو پاسخ بدین تا بتونم بهتون کمک کنم.

saman_itc
جمعه 05 بهمن 1386, 21:42 عصر
من قبل اینکه با listbox.DataSource کار کنم مشکل نداشتم.
شما یه برنامه دانش آموزی در نظر بگیرین
مشخصات فردی دانش آموز + نمرات دانش آموز
وقتی به وارد کردن نمرات دانش آموز میرسیدمم مشکل نداشتم
تو لیست باکس حذف و اضافه و ...
بعد موقع ثبت کردن تو یه for همه مقدار نمره رو با id تو یه جدول دیگه ثبت میکردم(تعداد مثلان این نمرات معلوم نیست .معدود هم نیست میتونه 100 تا باشه مثلا
تا این جا هیچ مشکلی وجود نداره
ولی وقتی اطلاعات قبلا seve شده آورده میشه
همع فیلد ها select میشه و فقط یه فیلد به listbox.DataSource ربط داده میشه و اونم مشکل نداره
مشکل از اینجا شروع میشه که وقتی listbox.DataSource فعال شد دیگه نمیشه مثل قبل item های listbox کم یا زیاد کرد و این خطا رو میده

Items collection cannot be modified when the DataSource property is set

saman_itc
جمعه 05 بهمن 1386, 21:44 عصر
بهترین کار به نظر من استفاده از datareader هست

دوست عزیز شما مشکل منو متوجه شدی؟
میشه بیشتر توضیح بدی؟

miladr
شنبه 06 بهمن 1386, 01:36 صبح
شما باید به datasource اضافه کنی تا مشکلت حل بشه.

saman_itc
شنبه 06 بهمن 1386, 01:47 صبح
تو بانکن نمی تونم.چون شاید کاربر نخواد رکورد ذخیره کنه
جوره دیگه هم میشه به datasource اضافه کرد؟

saman_itc
شنبه 06 بهمن 1386, 09:50 صبح
ListBox modify Item Collection Error?
file:///C:/Documents%20and%20Settings/Administrator/Desktop/msdn/ListBox%20modify%20Item%20Collection%20Error%20-%20MSDN%20Forums_files/AnsweredQuestionIcon.gif file:///C:/Documents%20and%20Settings/Administrator/Desktop/msdn/ListBox%20modify%20Item%20Collection%20Error%20-%20MSDN%20Forums_files/Spacer.gif Was this post helpful ?
file:///C:/Documents%20and%20Settings/Administrator/Desktop/msdn/ListBox%20modify%20Item%20Collection%20Error%20-%20MSDN%20Forums_files/newpost_en_US.gif (http://forums.microsoft.com/MSDN/persona.aspx?ep=0&SiteID=1&fu=%2fMSDN%2fAddPost.aspx%3fPostID%3d966900%26Site ID%3d1%26ReturnUrl%3d&LCID=1033&ed=true) file:///C:/Documents%20and%20Settings/Administrator/Desktop/msdn/ListBox%20modify%20Item%20Collection%20Error%20-%20MSDN%20Forums_files/quote_en_US.gif (http://forums.microsoft.com/MSDN/persona.aspx?ep=0&SiteID=1&fu=%2fMSDN%2fAddPost.aspx%3fPostID%3d966900%26Site ID%3d1%26Quote%3dTrue&LCID=1033&ed=true)
I'm binding items to a listBox from an array in a windows (http://www.csharphelp.com/board2/post.html#) Form and this works fine and the list box is populated:

ArrayList al = MyStepsClass.Steps;
listBox1.DataSource = al;
listBox1.DisplayMember = "_Name";
listBox1.ValueMember = "_StepID";


I have a button where I want to remove the selected item from the list box:
Btn_Click(object sender, EventArgs e)
{
MyStepsClass item = (MyStepsClass)listBox1.SelectedItem;
listBox1.Items.Remove(item);
}


When I click the button to remove the selected I get the following error:

"Items collection cannot be modified when the DataSource property is set."

Any ideas..???

Once I get this working I'm going to extend it so that the item is added to a second listBox

Thanks




"If you use the DataSource property to add items to a ListBox, you can view the items in the ListBox using the Items property but you cannot add or remove items from the list using the methods of the ListBox.ObjectCollection".
Use may make changes directly on the ArrayList class.




Wang Chi


مثل اینکه این مشکل ما بیخ داره
اینو تو فروم MSDN گرفتم.ظاهرا مشکل طرف حل نشد

saman_itc
یک شنبه 07 بهمن 1386, 08:33 صبح
دوستان (http://barnamenevis.org/forum/member.php?u=19175) من واقعا مشکل دارم.

visual_sadegh
یک شنبه 07 بهمن 1386, 09:06 صبح
دوست عزیز شما مشکل منو متوجه شدی؟
میشه بیشتر توضیح بدی؟
اگه اشتباه نکرده باشم شما می خوای لیست باکست از رکورد های یک جدول پر بشه
تا اینجا مشکلی نداری ، مشکلتون از اینجا شروع می شه که می خوای بعضی از رکورد ها رو از لیست باکس حذف کنی.
اگه مشکلت این باشه
می تونی با استفاده از دیتاریدر لیست باکست رو پر کنی البته فیلد های display member و Value Member مثل قبل باید مقدار دهی بشه فقط دیتا سورس خالی می مونه.

maryam_vb
یک شنبه 07 بهمن 1386, 13:38 عصر
وقتی اطلاعات قبلا seve شده آورده میشه
همع فیلد ها select میشه و فقط یه فیلد به listbox.DataSource ربط داده میشه و اونم مشکل نداره
مشکل از اینجا شروع میشه که وقتی listbox.DataSource فعال شد دیگه نمیشه
مثل قبل item های listbox کم یا زیاد کرد
خوب شما از روش listbox.datasource جهت پر کردن لیست استفاده نکنید،یا از datareader که دوستمون پیشنهاد دادن استفاده کنید یا از همون dataset :


adap.Fill(ds)
For i = 0 To ds.Tables(0).Rows.Count - 1
ListBox1.Items.Add(ds.Tables(0).Rows(i).Item(0))
Next

این جوری بین listboxو dataset هیچ ارتباطی وجود نداره ، و براحتی میتونین مقادیر رو حذف یا اضافه کنید. در زمان حذف آیتم ، با توجه به اینکه چه آیتمی حذف شده متناظرا فیلد مربوط رو در بانک خالی کنید و ...

saman_itc
دوشنبه 08 بهمن 1386, 01:43 صبح
این جوری بین listboxو dataset هیچ ارتباطی وجود نداره ، و براحتی میتونین مقادیر رو حذف یا اضافه کنید. در زمان حذف آیتم ، با توجه به اینکه چه آیتمی حذف شده متناظرا فیلد مربوط رو در بانک خالی کنید و ...

با سلام
تشکر می کنم که وقت گذاشتین این روش جواب میده.اما به نظر خودت این روش منطقی؟
ما میتونیم هر جا دور بزنیم اما فکر میکنم روش اصلیش این نباشه که ما هر جا گیر کردیم یه For بزاریم.
نظر بقیه دوستان چیه؟

__H2__
دوشنبه 08 بهمن 1386, 10:43 صبح
سلام


مشکل من تو listbox هست.
تا وقتی بدون dateset , datemembers از listbox استفاده میکردم مشکلی نواشتم
یه جا مجبور شدم از dateset , datemembers استفاده کنم
ولی حالا میخوام با item ها listbox کار کنم این خطا رو میده

بله صحیح است.


چندتا سوال واسم پیش اومد، وقتی لیست پر شد معادل عملیات اضافه و حذف آیتم های لیست در بانک هم صورت بگیره؟اونوقت جدول مورد نظر چند تا فیلد داره؟با حذف یک آیتم کل سطر رو پاک کنه یا فقط فیلد مربوط رو خالی کنه؟
یا با افزودن به لیست تکلیف فیلد های دیگه چی میشه؟

در حالت معمول DataSource معادل Add عادی نیست و یک نوع لینک پویا است
یعنی اگر شما مورد جدیدی به منبع اضافه کنید یا از آن حذف کنید کنترلر مورد نظر هم فوراً متوجه شده و Refresh میشود.

یعنی بعد از استفاده از Datasource دیگر برای اضافه و کم کردن موارد باید به خود DataSource مراجعه کنید.
اگر نمیتوانید و نمیخواهید آیتم های موجود در DataSource را دستکاری کنید میتوانید با متد Clone یک کپی از آنها تهیه کنید و از آن برای اتصال به کنترلر استفاده کنید و به راحتی آیتم های آنرا کم و زیاد کنید.

ولی DataReader هم بد نیست و پر سرعت تر هم است (خیلی خیلی سریعتر از DataTableو DataSet است).
البته تا حالا تست نکرده ام و بعید میدانم بشود آنرا یکراست به DataSource خوراند ولی چیزی که واضح است آن است که به راحتی با یک حلقه While میتوان موارد را خواند و Add است و مطمئن باشید مشکلی با سرعت هم نخواهید داشت و همچنان از DataSet سریعتر خواهد بود.

نمونه کد:


Dim orgDataSet As New System.Data.DataSet
'...
'Fill
'....
Dim copyDataSet As System.Data.DataSet = DirectCast(orgDataSet.Clone, System.Data.DataSet)

Me.ComboBox1.DataSource = copyDataSet
'Me.ComboBox1.DisplayMember = ...





Me.ComboBox1.Items.Clear()

Using dbDr As System.Data.SqlClient.SqlDataReader = dbCom.ExecuteReader
If (dbDr IsNot Nothing) AndAlso (Not dbDr.IsClosed) AndAlso (dbDr.HasRows) Then
Do While dbDr.Read
Me.ComboBox1.Items.Add(TryCast(dbDr(0), String))
Loop
End If
End Using

visual_sadegh
دوشنبه 08 بهمن 1386, 10:58 صبح
بعید میدانم بشود آنرا یکراست به DataSource خوراند
دوست عزیز
اگه منظور شما از دیتاسورس همون دیتاسته ، که می شه
ولی اگه منظورتون اینه که مستقیما به دیتاسورس کنترل لیست باکس بدیم ابتدا باید یک دیتاست مشابه با متد clone ایجاد کنیم و اونو با دیتاریدر پر کنیم و بعد دیتاست پرشده رو به لیست باکس بدیم
ولی اینجوی مشکل دوستمون دوباره تکرار می شه
به نظر من همون کد
Me.ComboBox1.Items.Clear()

Using dbDr As System.Data.SqlClient.SqlDataReader = dbCom.ExecuteReader
If (dbDr IsNot Nothing) AndAlso (Not dbDr.IsClosed) AndAlso (dbDr.HasRows) Then
Do While dbDr.Read
Me.ComboBox1.Items.Add(TryCast(dbDr(0), String))
Loop
End If
End Using
تقریبا بهتره ، تقریبا به این دلیل که شما رکورد رو به لیست باکس اضافه نکردید فقط یک فیلد اضافه شده.
برای اینکار بهتره یک سطر رو با کد نویسی بسازیم بعد اونو تو حلقه به لیست باکس اضافه کنیم

maryam_vb
دوشنبه 08 بهمن 1386, 14:22 عصر
راه حل1- از طریق dataset - for و یا datareader - while باید مقادیر فیلد خاص رو در listbox اد (add) کرد .
ولی این راه برخلاف چیزی است که دوستمون میخواد ،اینکه از طریق datasource ارتباط بین listو dataset باقی بمونه .

در حالت معمول DataSource معادل Add عادی نیست و یک نوع لینک پویا است
یعنی اگر شما مورد جدیدی به منبع اضافه کنید یا از آن حذف کنید کنترلر مورد نظر هم فوراً متوجه شده و Refresh میشود.
یعنی بعد از استفاده از Datasource دیگر برای اضافه و کم کردن موارد باید به خود DataSource مراجعه کنید.

راه حل2- اگه درست متوجه شده باشم :یعنی برای حذف و اضافه مقادیر به لیست نباید باروش items.add or remove عمل کرد بلکه مقدار جدید باید در بانک اضافه شود و برای حذف هم از بانک حذف شود و ...
ولی در این حالت هم نیاز هست که دیتا ست مجددا با مقادیر جدید بانک fill شه!

من فکر میکنم روش غیر listbox.datasource مناسب تر هست و دردسر کمتری داره.

saman_itc
سه شنبه 09 بهمن 1386, 09:17 صبح
استاد __H2__ (http://barnamenevis.org/forum/member.php?u=35296) از این که لطف کردین ممنونم
یه سوال
میشه یه بار listbox.datasource پر کرد و وبعد listbox.datasource غیر فعال کرد؟

__H2__
چهارشنبه 10 بهمن 1386, 15:41 عصر
جناب آقای ،saman_it
همانطور که گفتم خصوصیت DataSource پویا است و هر زمان خالی شود محتویات کنترلر هم خالی خواهد شد.
یک بار دیگر حالات موجود را بررسی میکنیم:
- - - - - - - - - - - - - - -
-a اگر با خصوصیت DataSource و بدون خصوصیت Items انجام شود. (دینامیک)
در این حالت برای اضافه و کم کردن موارد باید مستقیماً DataTable یا DataSet را دستکاری کنید،
(مثلاً اگر خواستید آیتمی را به کنترلر اضافه کنید، آیتم را به DataTable اضافه کنید)
در اصل در این حالت به نوعی کنترلر لیست آیتم های موجود خود را DataSource قرار میدهد

-b اگر بدون خصوصیت DataSource و با خصوصیت Items انجام شود. (استاتیک)
در این حالت برای اضافه و کم کردن موارد باید مستقیماً Items را دستکاری کنید،
- - - - - - - - - - - - - - -
1- (با DataSource) استفاده از یک DataTable یا DataSet و دادن آن به DataSource

2- (با DataSource) اگر حالت قبلی مشکلتان را حل میکند ولی از DataTable یا DataSet مذکور در بخش دیگر هم استفاده میکنید و شاید اضافه کردن و کم کردن موارد در بخش دیگر دردسر ساز شود، میتوانید یک کپی از DataTable یا DataSet تهیه کنید و از آن برای تغذیه DataSource کنترلر استفاده کنید.

3- (با DataSource) استفاده از DataReader و ریختن مقدار بازگشتی در یک ساختار Class یا Structure و سپس Add کردن به یک نوع Collection و سپس خوراندان به DataSource
این حالت فقط زمانی بدرد میخورد که بخواهید اطلاعاتی بیش از یک String که برای نمایش است را داشته باشید و گرچه از Fill یک DataTable یا DataSet سریعتر عمل میکند ولی در ذات با آن برابر است.
در اصل کاری که که با Fill دات نت انجام میدهد و داده ها را در Row میریزد ما به طور دستی در حلقه انجام داده ایم و در Class یا Structure مطلوب خود جا دادیم.


4- (با DataSource) آیتم هایی که باید در کنترلر نشان دهند و تغییر کنند چندان هم پویا نیستند و به موارد معمدودی خلاصه میشود.
مثلاً یک کنترلر در مرتبه اول دارید که "کشور" را مشخص میکند و میخواهید با تغییر آن کنترلر دوم که "استان" را قرار است نمایش دهد، خودکار از لیست استان های آن شهر پر شود.....
در این حالت آیتم ها از قبل مشخص است و چیزی قرار نیست یک دفعه اضافه شود و فقط زمان نمایششان تغییر میکند، در این حالت بدون شک بهترین راه حل استفاده از تلفیق یک DataTable یا DataSet با یک DataView است.
(اگر بدردتان میخورد بیشتر توضیح دهم ؟؟؟؟؟؟؟ .....)

5- (بدون DataSource) استفاده از یک DataTable یا DataSource و قرار دادن در حلقه و پر کردن Items به طور دستی.
این حالت اگر از DataTable یا DataSet در جای دیگر استفاده ای نمیکنید، خوب نیست!
چون Fill کردن یک DataTable یا DataSet و بعد خواندن محتویات پر شده در یک حلقه به شدت کندتر از DataReader عمل میکند. (خیلی کندتر)
در نتیجه فقط زمانی باید از این روش استفاده کرد که مجبوریم برای کار دیگری DataTable یا DataSet را پر کنیم و فقط صرف انجام این تک کار نبوده.

6- (بدون DataSource) استفاده از DataReader و اجرای SQL برای برگرداندن فقط یک مقدار و ریختن دستی آیتم ها در Items
کل این عملیات فقط از Fill کردن DataTable یا DataSet سریعتر است.

saman_itc
چهارشنبه 10 بهمن 1386, 16:56 عصر
تشکر فراوان
ولی یه سوال دیگه دارم از خدمت تون که بعد که کالمش کردم می پرسم.
از همه دوستان ممنونم