2010-03-13 109 views
1

我有2個列表框,希望能夠將所選項目從一個項目複製到另一個項目中,並且我想要多次。我設法做到這一點,但我有第二個列表框上的按鈕,允許我去上下。現在,當第二個列表框中的項目是相同的(例如「鰓」和「鰓」),它不會行爲正常並崩潰。在列表框中克隆項目c#

有沒有一種方法可以讓他們在第二個列表框中充當獨立項目?

代碼

private void buttonUp_Click(object sender, EventArgs e) 
    { 
     object selected = listBox2.SelectedItem; 
     int index = list2.Items.IndexOf(selected); 

     listBox2.Items.Remove(selected); 
     listBox2.Items.Insert(index - 1, selected); 
     listBox2.SetSelected(index - 1, true); 
    } 

    private void buttonAdd_Click(object sender, EventArgs e) 
    {   
     DataRowView selected = (DataRowView)listBox1.SelectedItem;    
     string item = selected["title"].ToString(); 
     listBox2.Items.Add(item); 

    } 

它正常工作時,我havnt有重複,但是當我這樣做,他們只是跳來跳去隨機當我按下向上/向下。

(IVE不包括辭去其幾乎一樣了)

+0

什麼是它崩潰時的錯誤? – Turnkey 2010-03-13 17:20:22

+0

它「崩潰」......方式太籠統。什麼是異常和堆棧跟蹤?發佈您的按鈕事件處理代碼。 – 2010-03-13 17:20:30

+0

您還沒有發佈足夠的信息來獲得確定的答案。我猜你是在根據實際的字符串進行處理的情況下,你應該更多地依賴列表中的項目索引。 – 2010-03-13 17:21:26

回答

0

只需將代碼,因爲答案的其餘部分覆蓋它反正:

private void buttonAdd_Click(object sender, EventArgs e) 
    { 

     DataRowView selected = listBox1.SelectedItem as DataRowView; 
     if (selected != null) 
     { 
      string item = selected["title"].ToString(); 
      listBox2.Items.Add(item); 
     } 
    } 

    private void buttonUp_Click(object sender, EventArgs e) 
    { 
     string selected = listBox2.SelectedItem as string; 
     int oldIndex = listBox2.SelectedIndex; 
     int newIndex = oldIndex; 

     if (!string.IsNullOrEmpty(selected) && listBox2.Items.Count > 1 && oldIndex > 0) 
     { 
      listBox2.SuspendLayout(); 

      listBox2.Items.RemoveAt(oldIndex); 
      newIndex = oldIndex - 1; 
      listBox2.Items.Insert(newIndex, selected); 
      listBox2.SelectedIndex = newIndex; 

      listBox2.ResumeLayout(); 

     } 
    } 
+0

我最後一次編輯還爲時過早。 – 2010-03-13 18:29:57

0

可以使用的SelectedIndex代替的SelectedItem當你有多個項目都是平等的。我還建議檢查它不是-1。

0

上行情況的問題是下面的一組代碼。

object selected = listBox2.SelectedItem; 
int index = list2.Items.IndexOf(selected); 

只有在列表中有唯一項目時,此代碼才能正常工作。一旦有重複項目,值index將成爲列表中第一個實例gills的索引,而不一定是所選值的索引。

看起來像你鏡像listBox2list2中的項目。如果是這種情況,那麼你可以直接在listBox2上使用SelectedIndex屬性,因爲索引在兩個liss中都是相等的。

int index = listBox2.SelectedIndex; 
0

如果您嘗試使用對象列表,請嘗試實施Iclonnable。這將通過&覆蓋同一項目的副本。另外請注意,要將項目移到頂部或底部,您不必刪除列表&中的項目,然後將其重新插入。但是你可以改變物品的索引。希望這可以幫助。

+0

「將項目移動到頂部或底部,則不必刪除列表中的項目並將其重新插入,但可以更改項目的索引。如何通過更改項目索引來移動ListBox中的項目?沒有財產或方法可以做我知道的。至少,不是這樣綁定的。 – 2010-03-13 18:22:15

1

看起來你正在世界各地旅行,做一些簡單的事情。我會用List和數據綁定列表來處理這個問題。

// Add code 
     DataRowView selected = listBox1.SelectedItem as DataRowView; 
     if (selected != null) 
     { 
      _myList.Add(selected); // Adds at end 
      BindList2(); 
     } 

// Move up code 
    int selectedIndex = listBox2.SelectedIndex; 
    if(selectedIndex > 0) 
    { 
     var temp = _myList[selectedIndex]; 
     _myList.Remove(temp); 
     _myList.InsertAt(selectedIndex - 1, temp); 
     BindList2(); 
    } 

// BindList2 
public void BindList2() 
{ 
    listBox2.DataSource = _myList; 
    listBox2.DataBind(); 
}