Предотвратить повторное добавление элементов в ListBox - PullRequest
6 голосов
/ 23 февраля 2012

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

protected void btnAddSelectedItem_Click(object sender, EventArgs e)
{
    List<ListItem> itemsToAdd= new List<ListItem>();

    foreach (ListItem listItem in lstbxFromUserProjects.Items)
    {
        if (listItem.Selected)
            itemsToAdd.Add(listItem);
    }

    foreach (ListItem listItem in itemsToAdd)
    {
        lstBoxToUserProjects.Items.Add(listItem);
    }
}

EDIT: Вот что я в итоге использовал

protected void btnAddSelectedItem_Click(object sender, EventArgs e)
{
    List<ListItem> itemsToAdd= new List<ListItem>();

    foreach (ListItem listItem in lstbxFromUserProjects.Items)
    {
        if (listItem.Selected)
            itemsToAdd.Add(listItem);
    }

    foreach (ListItem listItem in itemsToAdd)
    {

        if (!lstBoxToUserProjects.Items.Contains(listItem)) 
        {
            lstBoxToUserProjects.Items.Add(listItem);
        }
    }
}

Ответы [ 5 ]

4 голосов
/ 23 февраля 2012

Если вы привяжете список lstBoxToUserProjects к источнику данных (HashSet), то вы можете выполнить простую проверку, чтобы убедиться, что элемент, предложенный для выбора, уже находится в месте назначения:

foreach(ListItem itemToAdd in itemsToAdd)
{
    if (selectedItems.Contains(itemToAdd)) continue;
    lstBoxToUserProjects.Items.Add(itemToAdd);
}

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

3 голосов
/ 23 февраля 2012

Вы должны просто вызвать ListBox.Items.Contains () в операторе if, чтобы проверить, был ли он уже добавлен.

foreach (ListItem listItem in itemsToAdd)
{
    if (!lstBoxToUserProjects.Items.Contains(listItem))
    {
        lstBoxToUserProjects.Items.Add(listItem);
    }
}
2 голосов
/ 23 февраля 2012

Попробуйте это:

protected void btnAddSelectedItem_Click(object sender, EventArgs e)
{
    lstBoxToUserProjects.Items.AddRange(lstbxFromUserProjects.Items.Where(li => !lstBoxToUserProjects.Items.Contains(li)).ToArray());
}

Это предполагает C # 3.5, по крайней мере.

0 голосов
/ 12 января 2015

Используйте

_items_Unique = _items.Distinct().ToList();

метод, он быстро сравнивает, где _items_Unique и _items - два списка

List<string> _items_Unique = new List<string>();
List<string> _items = new List<string>();
0 голосов
/ 23 февраля 2012

Изменить itemsToAdd с List на HashSet:

HashSet<ListItem> itemsToAdd= new HashSet<ListItem>();

...
itemsToAdd.Add(listItem) // Adds only new items.

Добавить MSDN :

Возвращаемое значение

Тип: System.Boolean Значение true, если элемент добавлен в объект HashSet (Of T);false, если элемент уже присутствует.(gdoron- и не вставляя элемент снова ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...