【问题标题】:Remove items from ListBox when DataSource is set设置 DataSource 时从 ListBox 中删除项目
【发布时间】:2013-04-16 03:11:36
【问题描述】:

请参阅我有一个包含多个值的 HashSet,这些值可以包含例如 414123456742412345674261234567 等数字。我在我的 UserControl 中放了一个 radioButton1,当我单击它时,我希望只有 414 和 424 的数字保留在我的 ListBox 中,为此我编写了以下代码:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        var bdHashSet = new HashSet<string>(bd);

        if (openFileDialog1.FileName.ToString() != "")
        {
            foreach (var item in bdHashSet)
            {
                if (item.Substring(1, 3) != "414" || item.Substring(1, 3) != "424")
                {
                    listBox1.Items.Remove(item);
                }
            }
        }
    }

但是当我运行代码时,我得到了这个错误:

设置 DataSource 属性时无法修改项目集合。

从列表中删除不需要的项目而不从 HashSet 中删除它们的正确方法是什么?我稍后会为以 0416 和 0426 开头的数字添加一个 optionButton 以及一个 optionButton 来用原始值填充 listBox ,有什么建议吗?

【问题讨论】:

  • 您可以删除分配给DataSource的对象中的项目,而不是删除ListBox中的项目,并调用该对象的Bind()方法。
  • @lexeRoy 我不是 C# 专家,所以我需要你的帮助,你能不能写一小段代码让我明白它应该是怎样的问
  • 在下面查看我的答案。不会有删除项,因为我们正在创建新的 HashSet 复制一个名为 bd 的私有对象并选择我们要应用的过滤器。

标签: c# listbox listboxitem


【解决方案1】:

试试

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    var bdHashSet = new HashSet<string>(bd);

    listBox1.Datasource = null;
    listBox1.Datasource =  bdHashSet.Where(s => (s.StartsWith("414") || s.StartsWith("424"))).ToList();
}

【讨论】:

  • 它也会从 bdHashSet 中删除,我不希望这样,因为我有另一个按钮可以再次显示所有值,包括 426 和其他的数字
  • 我也尝试了您的解决方案并收到此错误Complex DataBinding accepts as a data source either an IList or an IListSource.
  • 显然它可以工作,没有出现错误但它没有删除任何内容,不知道 Substring 是否正确或其他但所有值仍然存在
【解决方案2】:

试试这个:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    var bdHashSet = new HashSet<string>(bd);
    listBox1.Datasource = bdHashSet.Select(s => (s.Substring(1, 3) == "414" || s.Substring(1, 3) == "424"));

    //After setting the data source, you need to bind the data
    listBox1.DataBind();
}

【讨论】:

  • 我收到错误消息Can not resolve symbol DataBind(),而且您的解决方案将从 HashSet 中删除项目,我需要所有这些,因为我将允许稍后使用其他 optionButton 显示它们
  • 现在,如果您不想通过再次绑定来更改其 DataSource,请参阅此链接 stackoverflow.com/questions/1419930/…
【解决方案3】:

我认为您可以使用 linq 选择元素,然后将结果重新分配给 listBox。这样你就不需要从列表中删除元素,你可以保留 HashSet 的元素。

【讨论】:

  • 但是使用 LINQ 选择元素并不意味着从 HashSet 中删除元素?不一样吗?
  • 不,不一样。因为您只是选择项目并分配给列表。您没有从 HashSet 中删除项目,因此对象仍然存在并且仍然保持与 HashSet 的关系。
  • 所以基本上 damith 和 lexeroy 想要做什么?
  • 是的,他们发布的代码与我写的想法很接近。
【解决方案4】:

您可以使用BindingSource 对象。将其与 DataSource 绑定,然后使用RemoveAt() 方法。

【讨论】:

    【解决方案5】:

    试试这个:

    DataRow dr = ((DataRowView)listBox1.SelectedItem).Row;
    ((DataTable)listBox1.DataSource).Rows.Remove(dr);
    

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多