C # - Добавить / Удалить с помощью списков - PullRequest
3 голосов
/ 13 июля 2011

Прямо сейчас у меня есть 3 RichTextBox (ов) с текстом в них. Я беру этот текст из этих блоков и разбиваю каждую строку и добавляю каждую отдельную строку в соответствующий ListBox. Вот мой код для этого:

private void listFormatHelper()
{
    // Splits the lines in the rich text boxes
    var listOneLines = placementOneRichTextBox.Text.Split('\n');
    var listTwoLines = placementTwoRichTextBox.Text.Split('\n');
    var listUserLines = userDefinedRichTextBox.Text.Split('\n');

    // Resest the text in the listboxes
    placementOneListBox.ResetText();
    placementTwoListBox.ResetText();
    userDefinedListBox.ResetText();

    // Set the selection mode to multiple and extended.
    placementOneListBox.SelectionMode = SelectionMode.MultiExtended;
    placementTwoListBox.SelectionMode = SelectionMode.MultiExtended;
    userDefinedListBox.SelectionMode = SelectionMode.MultiExtended;

    // Shutdown the painting of the ListBox as items are added.
    placementOneListBox.BeginUpdate();
    placementTwoListBox.BeginUpdate();
    userDefinedListBox.BeginUpdate();

    // Display the items in the listbox.
    placementOneListBox.DataSource = listOneLines;
    placementTwoListBox.DataSource = listTwoLines;
    userDefinedListBox.DataSource = listUserLines;

    // Allow the ListBox to repaint and display the new items.
    placementOneListBox.EndUpdate();
    placementTwoListBox.EndUpdate();
    userDefinedListBox.EndUpdate();
}

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


Визуальный макет списков:

placementOneListBox                userDefinedListBox                placementTwoListBox
|                 |                |                 |               |                 |
|                 |                |                 |               |                 |
|                 |                |                 |               |                 |
|                 |                |                 |               |                 |
|_________________|                |_________________|               |_________________|

Итак, я пытаюсь сделать так, чтобы у меня была кнопка с надписью «двигаться вправо» или «двигаться влево», которая берет выбранный в данный момент элемент (предпочтительно items для множественного выбора) и перемещает его либо в влево или вправо ListBox. Однако для размещения OneListBox кнопка «переместить влево» не будет работать, а для размещения с двумя списками кнопка «переместить вправо» не будет работать. Я попробовал этот способ ниже (который не работал):

private void placementOneMoveRightButton_Click(object sender, EventArgs e)
{
    var currentItemText = placementOneListBox.SelectedValue.ToString();
    var currentItemIndex = placementOneListBox.SelectedIndex;

    userDefinedListBox.Items.Add(currentItemText);
    placementOneListBox.Items.Remove(currentItemIndex);
    placementOneListBox.Items.RemoveAt(placementOneListBox.Items.IndexOf(placementOneListBox.SelectedItem));
}

Я тоже попробовал этот способ (который тоже не работал):

private void placementOneMoveRightButton_Click(object sender, EventArgs e)
{
    string str;
    str = placementOneListBox.SelectedItems.ToString();
    placementOneListBox.Items.Remove(placementOneListBox.SelectedItems);
    userDefinedListBox.Items.Add(str);
}

ПРИЧИНА, ПОЧЕМУ ОНИ НЕ РАБОТАЮТ :

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

"Items collection cannot be modified when the DataSource property is set."

ВОПРОСЫ

  • Кто-нибудь знает, что я делаю не так в этом?
  • Может кто-нибудь показать / объяснить, что происходит со «свойством DataSource» и как я могу обойти это?

Ответы [ 3 ]

5 голосов
/ 13 июля 2011

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

Извините, Колтон, у вас была встреча на работе.

Я не уверен, какие данные выработаем, но вот пример удаления имени и добавления имени в ListBox:

private class Names
{
    public string Name { get; set; }

    public Names(string name)
    {
        Name = name;
    }
}

private void Form1_Load(object sender, EventArgs e) // Form Load Event
{
    List<Names> names = new List<Names>();

    names.Add(new Names("John"));
    names.Add(new Names("Suzy"));
    names.Add(new Names("Mary"));
    names.Add(new Names("Steve"));

    listBox1.DataSource = names;
    listBox1.DisplayMember = "Name";
    listBox1.ValueMember = "Name";
}

private void button1_Click(object sender, EventArgs e)
{
    List<Names> names = new List<Names>();
    foreach (var item in listBox1.Items)
    {
        Names name = (Names)item;
        if (name.Name.Equals("Mary")) // Remove Mary
            continue;

        names.Add(name);
    }

    names.Add(new Names("Joe")); // Add Joe

    listBox1.DataSource = names;
    listBox1.DisplayMember = "Name";
    listBox1.ValueMember = "Name";
}

Итак, что я делаю, это событие Form Load, я заполняю свой список с помощьюсвежие имена и установка источника данных для моего объекта List.Когда кнопка нажата, я создаю НОВЫЙ список и заполняюсь теми же именами, за исключением бедной Мэри.Ее нет в списке.Затем я добавляю Джо в список, а затем снова устанавливаю источник данных.Важно помнить, что после привязки источника данных к списку вы НЕ МОЖЕТЕ каким-либо образом изменять этот источник данных.Вы должны создать новый источник данных, а затем выполнить повторную привязку к новому источнику.Теперь это имеет больше смысла?

3 голосов
1 голос
/ 13 июля 2011

Работает ли это:

private void placementOneMoveRightButton_Click(object sender, EventArgs e)
{
    for(int i = 0; i < placementOneListBox.SelectedItems.Count(); i++)
    {
        var item = placementOneListBox.Items[i];
        if(item.Selected)
        {
            placementOneListBox.Items.RemoveAt(i);
            userDefinedListBox.Items.Add(item);
        }
    }
}
...