Перемещение элементов в ListBox - PullRequest
0 голосов
/ 10 августа 2011

У меня есть ListBox, в котором есть несколько элементов.Тем не менее, я хочу иметь возможность сортировать элементы в списке на основе совпадения в Item.

Так что, если бы у меня было несколько элементов, которые выглядели бы так в ListBox:

U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL  
FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL 
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 

Я хочу, чтобы все было одинаково, если только элемент не содержит «FID».В этот момент я хочу добавить их в верхнюю часть ListBox и в числовом порядке ... другими словами, NEW ListBox будет выглядеть так:

FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL 
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL 
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 
U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    

Я собиралсяоб этом, используя что-то вроде этого:

if (aListBox.Items.Contains("FID"))
{
    # I don't know what to put in here to make it grab the Item and move it
    # to the top of the List and also numerically ordering them.
}

- Кто-нибудь может помочь с этим?

Заранее спасибо:)

РЕДАКТИРОВАТЬ:

foreach (var item in listOneLines)
    if (item.Contains("FID "))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID0"))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID1"))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID2"))
        ListBox.Items.Add(item);
foreach (var item in listOneLines)
    if (item.Contains("FID3"))
        ListBox.Items.Add(item);
foreach (string item in listOneLines)
    if (!item.Contains("FID"))
        ListBox.Items.Add(item);

и new ListBox такие циклы:

FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL 
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL 
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 
U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    
FID2    FIDUCIAL    5.080    24.130   0    FIDUCIAL    #From here down is what
FID1    FIDUCIAL    5.080    189.818  0    FIDUCIAL    #I want to be removed.
FID3    FIDUCIAL    0        112.231  90   FIDUCIAL 

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Вы можете группировать или сортировать элементы разными способами, заполняя listBox.
Я привел несколько примеров ниже.Это не обязательно самые удивительные решения, но я полагаю, что вы узнаете больше, увидев некоторые из возможностей, чем предоставив загадочное или «умное» решение.Они также иллюстрируют, как вы можете вставить в разных местах в списке (как упомянуто в вопросе).

Простой способ разделить один список на два (несортированные) списки, добавляя в конец или вставляя вначало списка (не очень эффективный подход, но часто это не будет актуальной проблемой в коде пользовательского интерфейса, если у вас нет больших списков):

foreach (string item in itemList)
{
    if (item.Contains("FID"))
        listbox.Items.Insert(0, item);  // Add at start of list
    else
        listBox.Items.Add(item);        // Add at end of list
}

(Обратите внимание, что элементы FID будут отображаться вобратный порядок)

Или добавьте элементы в два прохода:

foreach (string item in itemList)
{
    if (item.Contains("FID"))
        listbox.Items.Add(item)    // Add all items with FID in them
}
foreach (string item in itemList)
{
    if (!item.Contains("FID"))
        listbox.Items.Add(item)    // Add all items without FID in them
}

Или найдите место вставки для каждого элемента:

foreach (string item in itemList)
{
    int insertPos = 0;
    bool itemIsFID = item.Contains("FID");
    while (insertPos < listBox.Items.Count)
    {
        // Primary sort - put FID items ahead of non-FID items
        bool boxItemIsFID = listBox.Items[insertPos].Contains("FID");
        if (itemIsFID && !boxItemIsFID)
        {
            // The new item must be inserted before the existing item
            break;
        }

        // Secondary sort - alphabetical
        if (item.CompareTo(listBox.Items[insertPos]) > 0)
        {
            // The new item must be inserted before the existing item
            break;
        }
    }

    // Insert the item at the location we've found
    if (insertPos < listBox.Items.Count)
        listBox.Items.Insert(insertPos, item);
    else
        listBox.Items.Add(item);
}

Или, наконец, вы можете предварительно-сортировать коллекцию предметов, внедрив свой собственный IComparer и используя метод Sort вашей коллекции:

itemList.Sort(MyComparer);
foreach (string item in itemList)
    listbox.Items.Add(item);
0 голосов
/ 10 августа 2011

Вы можете реализовать пользовательскую сортировку, используя IComparer

См. этот учебник в качестве примера или this one

Внутри вашего пользовательского метода сортировки вы можетелегко поставить ваши условия для сортировки

...