3 Stimmen

C# - Hinzufügen/Entfernen mit ListBoxen

Im Moment habe ich 3 RichTextBox(es) mit Text in ihnen. Ich nehme diesen Text aus diesen Boxen und teile jede Zeile auf und füge jede einzelne Zeile zu der entsprechenden ListBox hinzu. Hier ist mein Code für das:

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

Nach dem obigen Code enthält jede ListBox die angegebenen Daten in separaten Zeilen. Ich möchte jedoch Schaltflächen hinzufügen, die beim Anklicken das ausgewählte Listenelement in die angegebene ListBox verschieben.


VISUELLES LAYOUT VON LISTBOXEN:

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

Also, was ich zu tun versuche, ist eine Schaltfläche, die sagt "nach rechts bewegen" oder "nach links bewegen" und es nimmt das aktuell ausgewählte Element (vorzugsweise Artikel für Multiselektion) und verschiebt sie entweder zur linken oder zur rechten ListBox. Für die PlatzierungOneListBox funktioniert die Schaltfläche "move left" jedoch nicht und für die PlatzierungTwoListBox funktioniert die Schaltfläche "move right" nicht. Ich habe es auf die folgende Weise versucht (was nicht funktionierte):

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

Ich habe es auch auf diese Weise versucht (was auch nicht funktioniert hat):

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

DER GRUND, WARUM SIE NICHT FUNKTIONIEREN :

Immer wenn ich das Programm ausführe und auf die Schaltfläche "nach rechts verschieben" klicke (für beide obigen Code-Fälle), erhalte ich die folgende Fehlermeldung:

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

FRAGEN

  • Weiß jemand, was ich in diesem Fall falsch mache?
  • Kann jemand zeigen/erläutern, was mit der "DataSource-Eigenschaft" geschieht und wie ich es umgehen kann?

5voto

Icemanind Punkte 45603

Sie versuchen, den Datensatz zu ändern, während er an das Listenfeld gebunden ist. Stattdessen müssen Sie den Datensatz neu erstellen und dann den neuen Datensatz an das Listenfeld binden.

Tut mir leid, Colton, ich hatte eine Besprechung auf der Arbeit.

Ich bin nicht sicher, mit welcher Art von Daten Sie arbeiten, aber hier ist ein Beispiel für das Entfernen eines Namens und das Hinzufügen eines Namens zu einer 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";
}

Also, was ich tue, ist in der Form-Load-Ereignis, ich bin Populating meine Listbox mit neuen Namen und Einstellung der Datenquelle zu meinem List-Objekt. Wenn die Schaltfläche angeklickt wird, erstelle ich eine NEUE Liste und fülle sie mit denselben Namen auf, außer für die arme Mary. Sie ist nicht in der Liste enthalten. Dann füge ich Joe in die Liste ein und setze die Datenquelle erneut. Wichtig ist, dass Sie, sobald Sie eine Datenquelle mit einem Listenfeld verknüpft haben, diese Datenquelle in keiner Weise mehr ändern können. Sie müssen eine neue Datenquelle erstellen und dann erneut an die neue Quelle binden. Ergibt das jetzt mehr Sinn?

3voto

Pragnesh Patel Punkte 1448

1voto

Chris Lucian Punkte 1013

Funktioniert das?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X