Home > OS >  Remove the line below the selected item in a listbox
Remove the line below the selected item in a listbox

Time:10-05

When I add an item into a listbox I also add a new line because I want there to be a blank line between each item added. When I remove a selected item I also want to remove the blank line I added otherwise I will end up getting 2 blank lines between each item this is the problem I am having so I thought if I could delete the selected item as well as the blank line above and below the selected item this would work. Is there a better approach to this?

ListBox1.Items.Remove(ListBox1.SelectedItem);

CodePudding user response:

I have typed the items and differentiate what is the blank item and what is the value item. At the time of deleting I have the reference of both. It worked fine, see if it helps.

Here's an example:

Form:

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

    }

Event to delete the item on click:

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

Object Data

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

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

Object BlankItem

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

CodePudding user response:

I wanted to try to implement the above functionality, but using a data-bound Listbox such that I make changes to the underlying list instead of the Listbox. If possible, use BindingList<T> instead of List<T> because it implements additional functionality specific to data binding.

The core is still the same, as each item added must also be followed by adding a string.Empty item. The same for removal, when an item is removed

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    protected override void onl oad(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);
            }
        };
    }
}

press the [DEL] key to remove an item, and the [INS] key to add an item.

fig

But I am not happy with this solution. I think there is a way to create a class that implements IListSource that you directly add/remove items and it creates a list with blanks in between automatically for binding.

  • Related