移除列表框中的项目

3

我是初学者,已经尝试了一段时间。我正在尝试使用“删除”按钮从ListBox中删除项目。代码没有显示任何错误,但是项目未从列表中消失。 这是我正在努力解决的部分。

void taBort()
{
    listboxKontakter.SelectedItems.Remove(listboxKontakter.SelectedItems);
    textboxAnteckningar.Clear();
    textboxGatuadress.Clear();
    textboxNamn.Clear();
    textboxPostnummerOrt.Clear();
    textboxEmail.Clear();
    textboxFödelsedag.Value = DateTime.Now;
}

以下是完整的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace adressboken
{
    public partial class Form1 : Form
    {

        List<Kontakter> kontaktLista = new List<Kontakter>();
        Kontakter person;
        string path = "kontakter.txt";



        public Form1()
        {
            InitializeComponent();
        }

        private void LäggTill_Click(object sender, EventArgs e)
        {
            person = new Kontakter();
            person.FullständigtNamn = textboxNamn.Text;
            person.Gatuadress = textboxGatuadress.Text;
            person.PostnummerOrt = textboxPostnummerOrt.Text;
            person.Födelsedag = textboxFödelsedag.Value;
            person.Email = textboxEmail.Text;
            person.Anteckningar = textboxAnteckningar.Text;

            kontaktLista.Add(person);

            listboxKontakter.DataSource = null;
            listboxKontakter.DisplayMember = "FullständigtNamn";
            listboxKontakter.DataSource = kontaktLista;

            textboxAnteckningar.Clear();
            textboxGatuadress.Clear();
            textboxNamn.Clear();
            textboxPostnummerOrt.Clear();
            textboxEmail.Clear();
            textboxFödelsedag.Value = DateTime.Now;

            textboxAntal.Text = kontaktLista.Count.ToString();
        }

        private void Rensa_Click(object sender, EventArgs e)
        {
            textboxAnteckningar.Clear();
            textboxGatuadress.Clear();
            textboxNamn.Clear();
            textboxPostnummerOrt.Clear();
            textboxEmail.Clear();
            textboxFödelsedag.Value = DateTime.Now;
        }
        void taBort()
        {

            textboxAnteckningar.Clear();
            textboxGatuadress.Clear();
            textboxNamn.Clear();
            textboxPostnummerOrt.Clear();
            textboxEmail.Clear();
            textboxFödelsedag.Value = DateTime.Now;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            kontaktLista = new List<Kontakter>();
            string line = "";
            StreamReader sr = new StreamReader(path);
            while ((line = sr.ReadLine()) != null)
            {
                string[] listarray = line.Split(',');
                person = new Kontakter();
                person.FullständigtNamn = listarray[0];
                person.Gatuadress = listarray[1];
                person.PostnummerOrt = listarray[2];
                person.Email = listarray[3];
                person.Födelsedag = Convert.ToDateTime(listarray[4]);
                person.Anteckningar = listarray[5];
                kontaktLista.Add(person);
            }
            sr.Close();
            listboxKontakter.DataSource = kontaktLista;
            listboxKontakter.DisplayMember = "FullständigtNamn";
        }

        public void listboxKontakter_Click(object sender, EventArgs e)
        {
            person = (Kontakter)listboxKontakter.SelectedItem;
            textboxNamn.Text = person.FullständigtNamn;
            textboxGatuadress.Text = person.Gatuadress;
            textboxPostnummerOrt.Text = person.PostnummerOrt;
            textboxEmail.Text = person.Email;
            textboxFödelsedag.Value = person.Födelsedag;
            var selectedindex = listboxKontakter.SelectedItems;
        }

        private void Spara_Click(object sender, EventArgs e)
        {
            StreamWriter sw = new StreamWriter(path);
            foreach (Kontakter k in kontaktLista)
            {
                sw.WriteLine(k.FullInfo);
            }
            sw.Close();
        }

        private void taBortToolStripMenuItem_Click(object sender, EventArgs e)
        {
            taBort();
        }

        private void TaBort_Click(object sender, EventArgs e)
        {
            taBort();
        }


    }


}

哦,抱歉。是的,它是Windows窗体应用程序。 - grimsan55
3个回答

4
您的代码似乎移除了所有选定的项,但未进行刷新。
可以尝试如下方式:
listboxKontakter.SelectedItems.Remove(listboxKontakter.SelectedItem);
listboxKontakter.Refresh();

您只需删除所选项,然后刷新您的列表框。

如果您想删除所有项目,请尝试:

listboxKontakter.Items.Clear();

如果您使用 数据源(DataSource),请尝试:
listboxKontakter.DataSource = null;

如果其他方法都失败了,你可以循环遍历集合并使用RemoveAt

for(int i=listboxKontakter.Items.Count; i > -1; i--) {
{
    listboxKontakter.Items.RemoveAt(i);
}

根据一些聊天记录,这应该对你有用:

void taBort()
{
    var newList = (List<Kontakter>)listboxKontakter.DataSource;
    var ds = newList.Where(k => k.FullständigtNamn != ((Kontakter)listboxKontakter.SelectedItem).FullständigtNamn).ToList();
    listboxKontakter.DataSource = ds;
    listboxKontakter.DisplayMember = "FullständigtNamn";
    textboxAnteckningar.Clear();
    textboxGatuadress.Clear();
    textboxNamn.Clear();
    textboxPostnummerOrt.Clear();
    textboxEmail.Clear();
    textboxFödelsedag.Value = DateTime.Now;
}

如果您想一次删除多个项目,请尝试以下操作:

var ds = newList.Where(k => !listboxKontakter.SelectedItems.Contains(k.FullständigtNamn)).ToList();

你是否正在使用数据源来填充你的列表框? - crthompson
是的,没错。这是我的Form1.Load部分: listboxKontakter.DataSource = kontaktLista; listboxKontakter.DisplayMember = "FullständigtNamn"; - grimsan55
将您的数据源置空,参见我的编辑。您可能还需要进行一次刷新。 - crthompson
好的,现在当我按“删除”时,它会从列表框中删除所有项目,而不仅仅是选定的一个。 - grimsan55
我现在开始看到问题了。你只想删除一个项目,但它在数据源中。稍等片刻。 - crthompson
显示剩余11条评论

1
怎么样:
listboxKontakter.Items.Remove(itemthatneedstoberemoved)

listboxKontakter.Items.Clear();

我假设你称呼列表框为listboxKontakter?

:

看一下这个


那也不起作用,是的,我的列表框叫做listboxKontakter。 - grimsan55
@user2752375 你确定在提交按钮中写对了吗? - Loko
好的,这是在 "void taBort()" 中。我有上下文菜单工具和一个 "删除" 按钮,它们都调用了该方法,但都不起作用。 - grimsan55

1

.SelectedItems基本上只是一个你所选择的项的数组列表,因此你需要像这样访问它们.SelectedItems[0] .SelectedItems[1]。

然而,即使使用[0],[1]的上述代码仅会从选定的列表中移除它们,而不是实际的列表框。 如果你想要将它们从列表框中删除,你需要使用.Items.Remove调用。

while(listboxKontakter.SelectedItems.Count >0)
{
listboxKontakter.Items.Remove(listboxKontakter.SelectedItems[0]);
}

编辑:如果它是单选列表框,您只需要

listboxKontakter.Items.Remove(listboxKontakter.SelectedItem);

那个不起作用,而且listbox只允许选择单个目标,因此无法选择多个。 listbox中填充了从通过DataSource加载的文本文件中获取的内容。 - grimsan55
然后,您还需要从数据源中删除该项,因为下次重新加载表单时,它将通过数据源再次拉取该数据。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接