2014-09-25 141 views
0

我不能讓在列表框中的所有選定的項目移動到第二個列表框,這裏是代碼:移動在列表框中多選所有選中的項目

void moveIn(ListBox inMoveOut, ListBox inMoveIn) { 
inMoveOut.setMultipleSelect(true); 
inMoveIn.setMultipleSelect(true); 
    // for each item in the listbox 
    for (int i = 0; i < inMoveOut.getItemCount(); i++) { 
     if (inMoveOut.isItemSelected(i)) { 
      // add item from the first listbox to the second lsitbox 
      inMoveIn.addItem(inMoveOut.getItemText(i), inMoveOut.getValue(i)); 
      // delete item from the first listbox 
      inMoveOut.removeItem(i); 
     } 
    } 

} 

我可以選擇多個項目,但只能移動拋一個項目,而不是所有選定的項目。任何建議請。

+0

什麼時候執行for循環?它是否拋出任何異常? – Mister 2014-09-25 12:22:14

回答

1

由於您要刪除循環中的項目,因此要更改循環限制。如果你開始在結束並移動到開始,這並不重要:

int size = inMoveOut.getItemCount() 
for (int i = size - 1; i >= 0 ; i--) { 
    if (inMoveOut.isItemSelected(i)) { 
     // add item from the first listbox to the second lsitbox 
     inMoveIn.addItem(inMoveOut.getItemText(i), inMoveOut.getValue(i)); 
     // delete item from the first listbox 
     inMoveOut.removeItem(i); 
    } 
} 

然而,這將增加它們以相反的順序。所以這裏有一個替代方案:

// First, copy them across 
for (int i = 0; i < inMoveOut.getItemCount(); i++) { 
    if (inMoveOut.isItemSelected(i)) { 
     // add item from the first listbox to the second lsitbox 
     inMoveIn.addItem(inMoveOut.getItemText(i), inMoveOut.getValue(i)); 
    } 
} 

// Then delete them 
for (int i = 0; i < inMoveOut.getItemCount(); i++) { 
    if (inMoveOut.isItemSelected(i)) { 
     // delete item from the first listbox 
     inMoveOut.removeItem(i); 
    } 
} 

這是一個效率稍低,但它會做的工作。

0

假設對於第一次迭代,將項目從「inMoveOut」到「inMoveIn」,但是,當下移動的線 - inMoveOut.removeItem(i)執行,列表框的大小被改變, (即inMoveOut.getItemCount()現在不得不一個不同的值),你的'循環'仍然會迭代inMoveOut.getItemCount()次,這實際上是有舊的項目數。

我認爲這可能是原因。

你可以看看使用'foreach'的一種東西,以便你擺脫索引和獲取物品。

for(ListBox item: inMoveOut) 
{ 
// logic here 
} 
+0

你不能迭代一個ListBox。而且你的迭代變量本身就是一個'ListBox',所以這也不起作用。 – Baz 2014-09-25 13:23:49

相關問題