winforms 删除列表框中所选项目下面的行

cetgtptt  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(138)

当我向列表框中添加一个项目时,我也会添加一个新行,因为我希望在添加的每个项目之间都有一个空行。当我删除一个选定的项目,我也要删除我添加的空行,否则我将最终得到2空行之间的每个项目,这是我的问题,所以我想,如果我可以删除选定的项目以及空行以上和以下选定的项目,这有没有更好的方法?

ListBox1.Items.Remove(ListBox1.SelectedItem);
bvjveswy

bvjveswy1#

我已经输入了项目,并区分什么是空白项目和什么是值项目。在删除的时候,我有这两个的参考。它工作正常,看看它是否有帮助。
下面是一个例子:

表格:

private void Form1_Load(object sender, EventArgs e)
    {
        Data data = new Data { description = "Test1" };
        listBox1.Items.Add(data);
        data.BlankLine = new BlankItem(); 
        listBox1.Items.Add(data.BlankLine);

        data = new Data { description = "Test2" };
        listBox1.Items.Add(data);
        data.BlankLine = new BlankItem();
        listBox1.Items.Add(data.BlankLine);

        data = new Data { description = "Test3" };
        listBox1.Items.Add(data);
        data.BlankLine = new BlankItem();
        listBox1.Items.Add(data.BlankLine);

        data = new Data { description = "Test4" };
        listBox1.Items.Add(data);
        data.BlankLine = new BlankItem();
        listBox1.Items.Add(data.BlankLine);

    }

单击时删除项目的事件:

private void listBox1_Click(object sender, EventArgs e)
    {
        if((listBox1.SelectedItem != null && listBox1.SelectedItem.GetType() != typeof(BlankItem)))
        {
            Data item = (Data)listBox1.SelectedItem;
            listBox1.Items.Remove(item);
            listBox1.Items.Remove(item.BlankLine);
        }
            
    }

对象数据

public class Data
{
    public string description { get; set; }
    public BlankItem BlankLine { get; set; }

    public override string ToString()
    {
        return description;
    }
}

对象空白项

public class BlankItem
{
    public override string ToString()
    {
        return Environment.NewLine;
    }
}
gijlo24d

gijlo24d2#

我想尝试实现上述功能,但使用了数据绑定的Listbox,这样我就可以对底层列表进行更改,而不是对Listbox进行更改。如果可能,请使用BindingList<T>而不是List<T>,因为它实现了特定于数据绑定的附加功能。
核心仍然是一样的,因为每增加一个项目之后都必须增加一个string.Empty项目。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        var list = new BindingList<string>();
        list.Add("ABC");
        list.Add(string.Empty);
        list.Add("GHK");
        list.Add(string.Empty);
        list.Add("OPQ");

        listBox1.DataSource = list;

        var binding = listBox1.BindingContext[list] as CurrencyManager;
        
        listBox1.KeyDown += (s, ev) =>
        {
            if (ev.KeyData == Keys.Delete)
            {
                if (listBox1.SelectedItem != null && !listBox1.SelectedItem.Equals(string.Empty))
                {
                    int index = listBox1.SelectedIndex;
                    if (index >= 0)
                    {
                        list.RemoveAt(index);
                        if (index < list.Count && list[index].Equals(string.Empty))
                        {
                            list.RemoveAt(index);
                        }
                        binding.Refresh();
                    }
                }
            }
            if (ev.KeyData == Keys.Insert)
            {
                int index = listBox1.SelectedIndex;
                if (index==-1 || list[index] == string.Empty)
                {
                    index++;
                }
                list.Insert(index, "NEW " + (index + 1).ToString());
                list.Insert(index+1, string.Empty);
            }
        };
    }
}

按[DEL]键删除项目,按[INS]键添加项目。

但是我对这个解决方案并不满意,我认为有一种方法可以创建一个实现IListSource的类,你直接添加/删除项,它会自动创建一个中间有空格的列表用于绑定。

相关问题