PDA

View Full Version : داشتن یک مقدار خالی(برای نشان دادن عدم انتخاب)در کامبوباکسی که به دیتابیس بایند شده



hanieh66
یک شنبه 13 مرداد 1387, 23:25 عصر
من چندتا کامبوباکس دارم که به مقادیری در دیتابیس بایند شدن و فقط مقادیری که در دیتابیس وجود داره رو نشون میدن.من میخام یک مقدار خالی توی این کامبوباکسها داشته باشم که اگه کاربر مثلا یک گزینه رو از داخلش انتخاب می کنه و بعد بخواد انتخاب مورد نظرش رو کنسل کنه بتونه.
و همونطور که می دونین وقتی که کامبوباکس رو به جایی بایند کنم دیگه نمی تونم مقداری رو خودم بهش اضافه کنم.

یک راهش اینه که توی بانکم مقداری مثل : -خالی- یا -عدم انتخاب- یا ...
داشته باشم. اما داده های موجود در بانک دست من نیست و من فقط به برنامه دسترسی دارم.

چیکار باید بکنم؟

mehdi.mousavi
دوشنبه 14 مرداد 1387, 00:19 صبح
من چندتا کامبوباکس دارم که به مقادیری در دیتابیس بایند شدن و فقط مقادیری که در دیتابیس وجود داره رو نشون میدن.من میخام یک مقدار خالی توی این کامبوباکسها داشته باشم که اگه کاربر مثلا یک گزینه رو از داخلش انتخاب می کنه و بعد بخواد انتخاب مورد نظرش رو کنسل کنه بتونه. و همونطور که می دونین وقتی که کامبوباکس رو به جایی بایند کنم دیگه نمی تونم مقداری رو خودم بهش اضافه کنم. یک راهش اینه که توی بانکم مقداری مثل : -خالی- یا -عدم انتخاب- یا ... داشته باشم. اما داده های موجود در بانک دست من نیست و من فقط به برنامه دسترسی دارم. چیکار باید بکنم؟


سلام.
اگر بعد از گرفتن Data از DALC مقدار مورد نظر (Empty) رو به Collection اضافه کنید و سپس داده های جدید رو به صورت یه ArrayList، List، DataView و ... به ComboBox بایند کنید، مشکل رفع میشه.

hanieh66
دوشنبه 14 مرداد 1387, 07:52 صبح
لطفا همینی که گفتین رو بیشتر توضیح بدین با یک کد کوچک.متوجه نشدم خوب

من از ویزارد خود ویژوال استودیو استفاده کردم توی فرم، کامبو باکس رو انتخاب می کنم و اون فلش کوچک سمت راست رو می زنم و به دیتاتیبلی که می خوام بایندش می کنم. در نتیجه کالکشنم ، یک دیتاتیبل هست.(البته بعضی ها هم با کمک bindingsource بایند شدن)
حالا شما منظورتون اینه که از این ویزارد استفاده نکنم و برم توی مثلا لود فرمم و دیتا تیبلی که با دیتاآداپتر fill می کنم رو به یک کالکشن بدم و سپس توی کالکشنم یک مقدار empty اضافه کنم و در اخر هم این کالکشن رو به کامبوباکسم بایند کنم؟

Mrs.Net
دوشنبه 14 مرداد 1387, 08:47 صبح
میتونی بعد از هربار پر کردن یک رکورد خالی به آبجکت بایندیگ (myTableBindingsource) اضافه کنی

ASKaffash
دوشنبه 14 مرداد 1387, 08:55 صبح
سلام
اینطوری :


private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
this.comboBox1.SelectedIndex = -1;
}

mehdi.mousavi
دوشنبه 14 مرداد 1387, 11:24 صبح
لطفا همینی که گفتین رو بیشتر توضیح بدین با یک کد کوچک.متوجه نشدم خوب

من از ویزارد خود ویژوال استودیو استفاده کردم توی فرم، کامبو باکس رو انتخاب می کنم و اون فلش کوچک سمت راست رو می زنم و به دیتاتیبلی که می خوام بایندش می کنم. در نتیجه کالکشنم ، یک دیتاتیبل هست.(البته بعضی ها هم با کمک bindingsource بایند شدن)
حالا شما منظورتون اینه که از این ویزارد استفاده نکنم و برم توی مثلا لود فرمم و دیتا تیبلی که با دیتاآداپتر fill می کنم رو به یک کالکشن بدم و سپس توی کالکشنم یک مقدار empty اضافه کنم و در اخر هم این کالکشن رو به کامبوباکسم بایند کنم؟

سلام.
منظورم اینه که کافیه جای اینکه ComboBox رو به DataTable متصل کنید، ابتدا از روی DataTable اتون یه DataView بسازید، بعد ComboBox رو به DataView ساخته شده Bind کنید:



DataView dv = new DataView(myDataTable);
DataRowView newRow = dv.AddNew();
newRow["whateverColumn"] = whateverData;

//Now bind the combobox to this DataView!

رضا عربلو
دوشنبه 14 مرداد 1387, 19:15 عصر
می تونی یک دکمه هم کنار کمبو باکس بگذاری که مقدار فیلد بایند شده را null کن (معمولاً اینکار را با کامپاننت های Third Part انجام می دهم.)

hanieh66
دوشنبه 14 مرداد 1387, 21:39 عصر
میتونی بعد از هربار پر کردن یک رکورد خالی به آبجکت بایندیگ (myTableBindingsource) اضافه کنی

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



سلام
اینطوری :


privatevoid comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
this.comboBox1.SelectedIndex = -1;
}



می تونی یک دکمه هم کنار کمبو باکس بگذاری که مقدار فیلد بایند شده را null کن (معمولاً اینکار را با کامپاننت های Third Part انجام می دهم.)

این روشها رو امتحان کرده بودم.به این صورت نباید باشه. ممکنه اصلا ندونه اون کاربر که باید حتما برای انتخاب empty دکمه del رو بزنه.
همینط.ر اینکه یک دکمه کنار هر کامبوباکس گذاشتن ظاهر فرمم رو نافرم می کنه. توی یک فرمم 8 تا کامبوباکس دارم.
بازم ممنون


سلام.
منظورم اینه که کافیه جای اینکه ComboBox رو به DataTable متصل کنید، ابتدا از روی DataTable اتون یه DataView بسازید، بعد ComboBox رو به DataView ساخته شده Bind کنید:



DataView dv = new DataView(myDataTable);
DataRowView newRow = dv.AddNew();
newRow["whateverColumn"] = whateverData;

//Now bind the combobox to this DataView!



اینطوری که با مثال گفتین متوجه شدم.ممنون
روش Mrs.net هم به کارم میاد

hanieh66
دوشنبه 14 مرداد 1387, 22:30 عصر
میتونی بعد از هربار پر کردن یک رکورد خالی به آبجکت بایندیگ (myTableBindingsource) اضافه کنی

می تونی با یه مثال برام بگی
myTableBindingSource ای که دارم برای اضافه کردن یک ابجکت می گیره. چی رو باید بهش پاس بدم.
مثلا جدولی که بایند می شه 2تا فیلد id, name داره که :
myComboBox.DisplayMember= name
,
myComboBox.ValueMember= id

باید باشه.باید آبجکت رو چه جوری پاس بدم به myTableBindingSource ؟؟

Mrs.Net
سه شنبه 15 مرداد 1387, 08:44 صبح
راه ساده اش اینه که بعد از خطی که با myTableDataAdapter دیتاست رو fill میکنی. با استفاده از دیتا ستی که پر شده یک myTableDataRow جدید اضافه کنی و برای فیلدها هر چی خواستی بگذاری که برای کار شما باید مقدار فیلد name خالی باشه.
الان پروژه ای ندارم که از ویزارد استفاده کرده باشم ولی چیزی که یادم میاد باید اینجوری باشه:

myTableDataAdapter.Fill(myMainDatabaseDataset1.myT able);
DataRow emptyrow=myMainDatabaseDataset1.myTable.AddNewRow( );
emptyrow["id"]=0;
emptyrow["name"]=string.empty;
myMainDatabaseDataset1.myTable.Rows.Add(
(myMainDatabaseDataset.myTable.DataRow)emptyrow);

این روش اصولی به نظر نمیاد اما کارآمد هست.