【问题标题】:C# - Add/Remove with ListBoxesC# - 使用列表框添加/删除
【发布时间】:2011-07-13 15:43:01
【问题描述】:

现在我有 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 都在不同的行中包含指定的数据。但是,我想要做的是添加按钮按钮,当单击时将选定的列表项移动到指定的 ListBox。


列表框的视觉布局:

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

所以,我想做的是有一个按钮,上面写着“向右移动”或“向左移动”,它将当前选定的项目(最好是 items 用于多选)并将其移动到左侧或右侧 ListBox。但是,对于placementOneListBox,“向左移动”按钮将不起作用,对于placementTwoListBox,“向右移动”按钮将不起作用。我在下面尝试了这种方式(没有用):

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 属性”发生了什么以及如何解决它?

【问题讨论】:

  • 哪个 UI 框架?赢表格?网络表单? WPF?银光? XNA?电话?
  • 我正在做这个表格。不是网络表单
  • 您没有回答问题,但由于您使用的是“表单”一词,我将假设您的意思是 WinForms,并在此问题中添加适当的标签。
  • 对不起,我的意思是 WinForms。哎呀:/
  • 这样做是 Visual Studio 2010

标签: winforms listbox add move


【解决方案1】:

您正在尝试修改绑定到列表框的数据集。您需要做的是重新创建数据集,然后将该新数据集绑定到列表框。

对不起,科尔顿,上班开会了。

我不确定您使用的是哪种数据,但这里有一个删除名称并将名称添加到 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";
}

所以我正在做的是在表单加载事件中,我正在用新名称填充我的列表框并将数据源设置为我的列表对象。单击按钮时,我正在创建一个新列表并使用相同的名称填充,但可怜的 Mary 除外。她不在名单之列。然后我将 Joe 添加到列表中,然后再次设置数据源。重要的是,一旦将数据源绑定到列表框,就不能以任何方式修改该数据源。您必须创建一个新数据源,然后重新绑定到新源。这现在更有意义了吗?

【讨论】:

  • 我该怎么做?
  • @Colton - 一秒钟,我会发布一个例子
  • cemanind 是对的。他的意思是使用 listOneLines,listTwoLines,listUserLines 而不是从 lstbox 控件中添加/删除。
  • @arjunshetty2020 - 我怎样才能正确地解决这个问题?
  • 没问题:)。是的,这更有意义。我使用的数据是一个占据整行(大约 320 像素宽)的字符串。我不是像您在“names.Add(new Names("John"));”上面那样手动添加数据而是来自按行分割的 RichTextBox。我会用你给我的东西工作!如果我能弄清楚一些事情,我会告诉你的。谢谢冰人! :)
【解决方案2】:
【解决方案3】:

这行得通吗:

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

【讨论】:

  • 将模式更改为多选。此外,当您点击按钮时,您必须在列表框中选择一个项目...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多