Клонирование элементов в списке c # - PullRequest
1 голос
/ 13 марта 2010

У меня есть 2 списка и я хочу иметь возможность копировать выбранные элементы из одного в другой сколько угодно раз. Мне удалось это сделать, но у меня есть кнопки во 2-м списке, которые позволяют мне идти вверх и вниз .. Теперь, когда во втором списке есть одинаковые элементы (например, "жабры" и "жабры"), это не ведет себя нормально и вылетает.

Есть ли способ заставить их действовать как отдельные элементы во втором списке?

код

 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);

    }

Он отлично работает, когда у меня есть дубликаты, но когда я это делаю, они просто случайно прыгают, когда я нажимаю вверх / вниз.

(я не включил вниз, так как он почти такой же, как и вверх)

Ответы [ 5 ]

1 голос
/ 13 марта 2010

Кажется, вы путешествуете по миру, чтобы сделать что-то простое. Я бы подошел к этому, используя 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();
}
0 голосов
/ 13 марта 2010

Если вы пытаетесь использовать список объектов, попробуйте реализовать Iclonnable. Это сделает копии одного и того же элемента снова и снова. Также обратите внимание, что для перемещения элемента вверх или вниз вам не нужно удалять элемент в списке и вставлять его обратно. Но вы можете изменить индекс элемента. Надеюсь, это поможет.

0 голосов
/ 13 марта 2010

Вы можете использовать SelectedIndex вместо SelectedItem, когда у вас есть несколько одинаковых элементов. Я также рекомендую проверить, что это не -1. ​​

0 голосов
/ 13 марта 2010

Проблема для случая up - следующий набор кода.

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

Этот код будет работать правильно только в том случае, если в списке есть уникальные элементы. Если у вас есть повторяющиеся элементы, значение index будет индексом первого экземпляра, скажем, gills в списке, а не обязательно индексом выбранного значения.

Похоже, вы зеркально отражаете предметы в listBox2 и list2. Если это так, то вы можете просто использовать свойство SelectedIndex непосредственно на listBox2, так как индекс будет одинаковым в обоих случаях.

int index = listBox2.SelectedIndex;
0 голосов
/ 13 марта 2010

Просто код, потому что остальные ответы все равно его охватывают:

 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();

        }
    }
...