2017-10-10 8 views
0

文字列を含むチェックリストがあります。 チェックされた項目をチェックし、それらがまだ追加されていない場合のみmylistと呼ばれる文字列のリストに追加するループがあります。チェックリストボックスからリストに項目を追加して一部を削除する必要があります

私が必要とするのは、リストボックス内のチェックされていない項目をチェックし、mylistから項目をチェックボックスをオフにしてから削除することです。

Basicaly私はcheckedboxlistからマイリストに項目をチェックするものは何でも追加して、私はアイテムのチェックを外すたびマイリストから同じ文字列を削除する必要がマイリストと呼ばれるリストを持っています。

いくつかの解決策を提案してください。前もって感謝します 。

+1

どこコードはありますか? –

+0

コードスニペット –

+2

で質問を更新してください。コードはありませんが、 'foreach(checkboxListのvarボックス){if(box.IsChecked){myList.Add(box.Text;}}') –

答えて

0

以下のコードでは、CheckBoxのリストを繰り返し処理し、各項目がチェックされているかどうかをチェックします。チェックされていない場合、myListからその項目のインデックスを取得し、RemoveAtプロパティを使用して、インデックスを使用するリスト

foreach (var item in checkboxList) { if (!item.IsChecked) { int index = myList.IndexOf(item); if(index != -1) myList.RemoveAt(index); } }

0

、とても親切にして、次の質問(How to Ask)を確認してください...

は、イベントanyCheckedListBox.ItemCheckMSDN)を利用してください:

public class Form1 : Form { 

ListBox anyListBox; 
CheckedListBox anyCheckedListBox; 

public Form1() { 
anyListBox = new ListBox(); 
Controls.Add(anyListBox); 
anyCheckedListBox = new CheckedListBox(); 
anyCheckedListBox.Items.Add("test1"); 
anyCheckedListBox.Items.Add("test2"); 
anyCheckedListBox.Items.Add("test3"); 
anyCheckedListBox.ItemCheck += AnyCheckedListBox_ItemCheck; 
Controls.Add(anyCheckedListBox); 
} 

private void AnyCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    if (e.CurrentValue == CheckState.Unchecked) 
     anyListBox.Items.Add(anyCheckedListBox.Items[e.Index]); 
    else 
     anyListBox.Items.Remove(anyCheckedListBox.Items[e.Index]); 
} 
} 

が文字列ことに注意してくださいこの迅速で汚れたソリューションではユニークでなければなりません。

0

項目がチェックされていない場合は、ループ内にList.Removeの呼び出しを追加するのがいいでしょう。あなたがないを行う

注意項目がList.Removeを呼び出す前に存在しているかどうかを確認する必要があります:あなたが持っているコードを仮定すると、@ AustinFrenchさんのコメント、何かのように似ています。アイテムが存在しない場合は、単にfalseを返します。


さらに、これはO(n^2)操作です。チェックボックスリストの各項目について、myListの内容全体をチェックしている可能性があります。リストが長い場合は、最初にリストをソートし、ペアを1つだけ通過させて(または少なくともmyListをソートして、より効率的に検索できるようにする)、パフォーマンスが向上する可能性があります。

代わりに、myListの内容を完全に置き換えることを検討してください。これはあなたのCheckBoxListて単一パスのみを必要とします。

myList.Clear(); 
foreach (var box in checkboxList) 
{ 
    if (box.IsChecked) 
     myList.Add(box.Text); 
} 

または、LINQを使用してList.AddRangeを活かし:

myList.Clear(); 
myList.AddRange(checkboxList.Where(box => box.IsChecked).Select(box => box.Text)); 
関連する問題