Как скопировать выбранные элементы из одного списка в другое по нажатию кнопки в c # net? - PullRequest
3 голосов
/ 26 февраля 2010

Как я могу скопировать выбранные элементы из одного списка в другое по нажатию кнопки .. ?? без какой-либо избыточности также я могу дать возможность множественного выбора элементов и добавления их в массе без использования ctrl с клавиатуры ?? сделать его удобным для пользователей, можем ли мы использовать флажки и как они будут работать? Приведенный ниже код используется для копирования записей для отдельного выбора элемента, а также дает повторяющиеся записи при повторном выборе этого элемента ... пожалуйста, помогите мне устранить недостатки ...

private void btn_Add_Click(object sender, EventArgs e)        
{        
    CopySelectedItems(source_name, target_name);     
}

private void CopySelectedItems(ListView source, ListView target) 
{        
    foreach (ListViewItem item in source.SelectedItems) {
        target.Items.Add((ListViewItem)item.Clone());
    }
}

Ответы [ 4 ]

5 голосов
/ 26 февраля 2010

Есть несколько способов.

Если вы хотите скопировать элементы из a в b:

private static void CopySelectedItems(ListView source, ListView target)
{
    foreach (ListViewItem item in source.SelectedItems)
    {
        target.Items.Add((ListViewItem)item.Clone());
    }
}

Если вы хотите переместить элементы из a в b:

private static void MoveSelectedItems(ListView source, ListView target)
{    
    while (source.SelectedItems.Count > 0)
    {
        ListViewItem temp = source.SelectedItems[0];
        source.Items.Remove(temp);
        target.Items.Add(temp);
    }            
}

Обновление
Вы упоминаете, что хотите сохранить порядок, в котором элементы расположены в элементе управления ListView. Я предполагаю, что они появляются там в каком-то отсортированном порядке? Если это так, вы можете создать функцию, которая использует то же правило сортировки, чтобы выяснить, куда вставить элемент в цель ListView (в моем примере используется значение во втором столбце:

private static void CopySelectedItems(ListView source, ListView target)
{
    foreach (ListViewItem item in source.SelectedItems)
    {
        ListViewItem clone = (ListViewItem)item.Clone();
        target.Items.Insert(GetInsertPosition(clone, target), clone); ;
    }
}

private static int GetInsertPosition(ListViewItem item, ListView target)
{
    const int compareColumn = 1;
    foreach (ListViewItem targetItem in target.Items)
    {
        if (targetItem.SubItems[compareColumn].Text.CompareTo(item.SubItems[compareColumn].Text) > 0)
        {
            return targetItem.Index;
        }
    }
    return target.Items.Count;
}

Трудно дать более точный ответ, не зная более подробной информации.

0 голосов
/ 26 февраля 2010

Я рискну предположить, что это будет что-то простое: сохранить все выбранные элементы из первого listView в список правильного типа, а затем перебрать этот список, чтобы добавить их во второй listView?

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

0 голосов
/ 26 февраля 2010

В обработчике нажатия кнопки найдите выбранные элементы в списке источников и добавьте их в список целей. как то так:

            var insertPos = 0;
            foreach ( ListViewItem s in sourceList.SelectedItems )
            {
                s.Remove ( );
                var copyCode = Int32.Parse ( s.Text );
                while ( insertPos < destinationList.Items.Count )
                {
                    var itemAtCandidate = Int32.Parse ( destinationList.Items [ insertPos ].Text );
                    if ( itemAtCandidate > copyCode )
                        break;
                    insertPos++;
                }
                destinationList.Items.Insert ( insertPos, s );
            }

Это переместит все выбранные элементы из «sourceList» в «destinationList» и сохранит их в отсортированном порядке.

0 голосов
/ 26 февраля 2010

Вы должны перебрать SelectedItems и создать новые элементы ListView во втором ListView.

Псевдокод:

foreach(var item in lst1.SelectedItems)
{
    var lvi = lst2.Items.Add(item.Text);
    lvi.ImageIndex = item.ImageIndex;
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...