یکی از راه های اجازه دادن به کاربر برای انتخاب موارد از لیست ، استفاده از ListBox یا CheckedListBox است. کاربر می تواند برای انتخاب برخی از موارد در لیست ، با کلیک ، Ctrl + کلیک ، Shift + کلیک و سایر ترکیبات صفحه کلید و ماوس استفاده کند.
روش دیگر استفاده از دکمه ها است تا به کاربر اجازه دهید موارد را بین دو ListBox حرکت دهد. یک ListBox شامل مواردی است که انتخاب نشده و دیگری شامل مواردی است که انتخاب شده اند.
این برنامه برای انتقال موارد از یک ListBox به دیگری از روش MoveSelectedItems استفاده می کند.
private void MoveSelectedItems(ListBox lstFrom, ListBox lstTo) { while (lstFrom.SelectedItems.Count > 0) { string item = (string)lstFrom.SelectedItems[0]; lstTo.Items.Add(item); lstFrom.Items.Remove(item); } SetButtonsEditable(); }
اگر آیتمی انتخاب شده باشد انتقال پیدا می کند . حال در صورتی که آیتم موردنظر در حالت انتخاب نباشد ، برای انتقال کامل لیست از قطعه کد زیر استفاده کنید .
قطعه کدی که در زیر مشاهده می کنید توسط برنامه کامپایلر به جهت تست آزمایش شده و خروجی صحیح مدنظر را بدست آورد.
private void button2_Click_1(object sender, EventArgs e) { MoveListBoxItems(listbox , lstActivity); }
همچنین روش دیگری نیز وجود دارد که نسخه کاملتر شده ی قطعه کد بالاست با این تفاوت که از یک لیست باکس موقت جهت جا به جایی استفاده شده است .
1-تمام آیتم های لیست اول انتخاب می شوند
2-آیتم های انتخاب شده به لیست موقت انتقال داده می شوند
3-لیست اول پاکسازی می شود
4-تمام آیتم های لیست دوم انتخاب می شوند
5-تمام آیتم های لیست دوم به لیست اول انتقال داده می شود
6-لیست دوم پاکسازی می شود
7- تمام آیتم های لیست موقت به لیست دوم انتقال داده می شود
8- لیست موقت پاکسازی می شود
قطعه کدی که در زیر مشاهده می کنید توسط برنامه کامپایلر به جهت تست آزمایش شده و خروجی صحیح مدنظر را بدست آورد.
private void button1_Click_(object sender, EventArgs e) { temp_move.Items.Clear(); co_word1.SelectionMode = SelectionMode.MultiSimple; co_word1.BeginUpdate(); for (int i = 0; i < co_word1.Items.Count; i++) co_word1.SetSelected(i, true); co_word1.EndUpdate(); MoveListBoxItems(co_word1, temp_move); co_word1.Items.Clear(); co_word2.SelectionMode = SelectionMode.MultiSimple; co_word2.BeginUpdate(); for (int i = 0; i < co_word2.Items.Count; i++) co_word2.SetSelected(i, true); co_word2.EndUpdate(); MoveListBoxItems(co_word2, co_word1); co_word2.Items.Clear(); temp_move.SelectionMode = SelectionMode.MultiSimple; temp_move.BeginUpdate(); for (int i = 0; i < temp_move.Items.Count; i++) temp_move.SetSelected(i, true); temp_move.EndUpdate(); MoveListBoxItems(temp_move, co_word2); temp_move.Items.Clear(); co_rank1.SelectionMode = SelectionMode.MultiSimple; co_rank1.BeginUpdate(); for (int i = 0; i < co_rank1.Items.Count; i++) co_rank1.SetSelected(i, true); co_rank1.EndUpdate(); MoveListBoxItems(co_rank1, temp_move); co_rank1.Items.Clear(); co_rank2.SelectionMode = SelectionMode.MultiSimple; co_rank2.BeginUpdate(); for (int i = 0; i < co_rank2.Items.Count; i++) co_rank2.SetSelected(i, true); co_rank2.EndUpdate(); MoveListBoxItems(co_rank2, co_rank1); co_rank2.Items.Clear(); temp_move.SelectionMode = SelectionMode.MultiSimple; temp_move.BeginUpdate(); for (int i = 0; i < temp_move.Items.Count; i++) temp_move.SetSelected(i, true); temp_move.EndUpdate(); MoveListBoxItems(temp_move, co_rank2); }
می توانید بر اساس قطعه کد زیر اطلاعات آیتم ها را بر اساس دو دکمه درج شده در در 2 مرحله انتقال دهید.
private void buttonMoveToListBox1_Click(object sender, EventArgs e) { if(listBox1.SelectedIndex != -1) { listBox2.Items.Add(listBox1.SelectedValue); listBox1.Items.Remove(listBox1.SelectedValue); } } private void buttonMoveToListBox2_Click(object sender, EventArgs e) { if(listBox2.SelectedIndex != -1) { listBox1.Items.Add(listBox2.SelectedValue); listBox2.Items.Remove(listBox2.SelectedValue); } }
آخرین روش انتقال آیتم ها را با قطعه کد زیر بررسی می کنیم :
با قطعه کد زیر همه موارد انتخاب شده از listbox2 به listbox1 انتقال داده می شوند. لیست itemsToRemove به عنوان ذخیره سازی موقت استفاده می شود. ما فقط ارجاعات را به موارد اضافه شده در لیست موقت اضافه می کنیم ، سپس آن لیست را تکرار می کنیم و موارد را حذف می کنیم.
قطعه کدی که در زیر مشاهده می کنید توسط برنامه کامپایلر به جهت تست آزمایش شده و خروجی صحیح مدنظر را بدست آورد.
List<object> itemsToRemove = new List<object>(); foreach (var item in listbox2.SelectedItems) { listbox1.Items.Add(item); itemsToRemove.Add(item); } foreach (var item in itemsToRemove) { listbox2.Items.Remove(item); }
به منظور بررسی مواردی که هیچ موردی انتخاب نشده باشد، ما یک رویداد کنترل کننده برای رویداد SelectedIndexChanged تنظیم کرده ایم.
theButton.Enabled = (listbox2.SelectedItems.Count > 0);
روش انتقال لیست باکس از طریق دیگر متد ها
برای Listbox1 از SelectedItemChanged Event استفاده کنید و از EventArgs ارائه شده برای دریافت مورد انتخاب شده استفاده کنید -> سپس به listbox2 اضافه کنید.
اگر هیچ موردی انتخاب نشده باشد button.enbabled = false خواهد شد .
private void buttonMove_Click(object sender, EventArgs e) { foreach (var item in listBox1.SelectedItems.OfType<object>().ToArray()) { listBox1.Items.Remove(item); listBox2.Items.Add(item); } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { buttonMove.Enabled = listBox1.SelectedItems.Count > 0; }
private void move(ListBox source, ListBox destination) { for (int i = 0; i <= source.Items.Count-1; i++) { destination.Items.Add(source.Items[i]); } source.Items.Clear(); }
private void button1_Click(object sender, EventArgs e) { foreach (var item in listBox1.SelectedItems) { listBox2.Items.Add(item); } for (int s = 0; s < listBox1.Items.Count; s++) { for (int t = 0; t < listBox2.Items.Count; t++) { if (listBox1.Items[s].ToString().Equals(listBox2.Items[t].ToString())) { listBox1.Items.RemoveAt(s); } } }
if (listbox1.SelectedItems.Count == 0) { return; } // Do this if you want to clear the second ListBox listbox2.Items.Clear(); foreach (object obj in listbox1.SelectedItems) { listbox2.Items.Add(obj); }