0

項目が複数ある場合、項目をあるリスト ボックスから別のリスト ボックスに移動しようとしていますが、移動できるのはごくわずかです。つまり、数より少ないことを意味します。for each および for ループも実装できません。

if (AdvLst.SelectedIndex > -1)
        {
            for (int i = 0; i <= AdvLst.Items.Count - 1; i++)
            {
                if (AdvLst.Items[i].Selected)
                {
                    string _value = AdvLst.SelectedItem.Value;
                    string _text = AdvLst.SelectedItem.Text;
                    ListItem item = new ListItem();
                    item.Text = _text;
                    item.Value = _value;
                    SelectedMortLst.Items.Add(AdvLst.Items[i]);
                    AdvLst.Items.Remove(AdvLst.Items[i]);
                }
            }

foreach ループ経由:

                foreach (ListItem li in AdvLst.Items)
            {
                if (li.Selected == true)
                {
                    SelectedMortLst.Items.Add(AdvLst.SelectedItem);
                    AdvLst.Items.Remove(AdvLst.SelectedItem);
                }

            }
4

2 に答える 2

2

解決策1

var selectedItems = AdvLst.Items.Cast<ListItem>().Where(m => m.Selected).ToArray();
SelectedMortLst.Items.AddRange(selectedItems);

//there's no removeRange, so...
foreach(var item in selectedItems)
    AdvLst.Items.Remove(item);

解決策2(ほぼ同じ)

var selectedItems = AdvLst.Items.Cast<ListItem>().Where(m => m.Selected).ToArray();
foreach(var item in selectedItems) {
   SelectedMortLst.Add(item);
   AdvLst.Items.Remove(item);
}

解決策3、修正されたループコード

for (int i = 0; i <= AdvLst.Items.Count - 1; i++)
    {
       if (AdvLst.Items[i].Selected)
           {
              string _value = AdvLst.SelectedItem.Value;
              string _text = AdvLst.SelectedItem.Text;
              ListItem item = new ListItem();
              item.Text = _text;
              item.Value = _value;
              SelectedMortLst.Items.Add(AdvLst.Items[i]);
              AdvLst.Items.Remove(AdvLst.Items[i]);
              i--;
            }
      }

forループでアイテムを削除すると、コレクションのカウントが変更され、アイテムをi+1削除したときに配置されていたアイテムのインデックスが作成されますi。を使用i--すると、forループがその変更に適応します

于 2013-01-31T07:48:17.470 に答える
0

一度に1つの操作を実行します。最初に削除するか、追加します。最初に宛先リストにアイテムを追加し、後でソースから削除することができます

List<ListItem> itemsToDelete=new List<ListItem>();
 foreach (ListItem li in AdvLst.Items)
            {
                if (li.Selected == true)
                {
                    SelectedMortLst.Items.Add(AdvLst.SelectedItem);
                    itemsToDelete.Add(AdvLst.SelectedItem);
//                    AdvLst.Items.Remove(AdvLst.SelectedItem);
                }

            }

foreach(ListItem item in itemsToDelete)
{
AdvLst.Items.Remove(item);
}
于 2013-01-31T07:47:27.453 に答える