C#-列表框删除部分行 [英] C# - Listbox Remove part of line

查看:95
本文介绍了C#-列表框删除部分行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个列表框,其内容如下所示:

C44     EXCLUDES    237.910  193.469  0    0603_5    
C45     EXCLUDES    244.102  193.387  0    0603_5    
R47     EXCLUDES    226.935  179.519  90   0402_2    
C18     CAP-00129G  230.960  190.619  0    0402_4    
C17     CAP-00129G  250.085  198.569  90   0402_3     
C25     CAP-00130G  255.635  189.669  90   0402_3    
C56     EXCLUDES    229.430  189.374  0    0402_4    
R42     EXCLUDES    241.010  192.194  90   TANT3216  
R10     EXCLUDES    246.560  203.894  0    0402_9    

单击按钮,我要删除结尾" ,然后将其重新上传到列表框. 因此,新的ListBox将如下所示:

C44     EXCLUDES    237.910  193.469  0 
C45     EXCLUDES    244.102  193.387  0
R47     EXCLUDES    226.935  179.519  90
C18     CAP-00129G  230.960  190.619  0
C17     CAP-00129G  250.085  198.569  90
C25     CAP-00130G  255.635  189.669  90
C56     EXCLUDES    229.430  189.374  0
R42     EXCLUDES    241.010  192.194  90
R10     EXCLUDES    246.560  203.894  0

所有可能的结尾都在此REGEX中: Regex placementOneRegex = new Regex(@"(RES|0402|0201|0603|0805|1206|1306|1608|3216|2551|1913|1313|2513|5125|2525|5619|3813|1508|6431|2512|1505|2208|1005|1010|2010|0505|0705|1020|1812|2225|5764|4532|1210|0816|0363|SOT)");

代码:

    private void removeEndingsButton_Click(object sender, EventArgs e)
    {
        string[] items;
        System.Windows.Forms.ListBox.ObjectCollection contents = placementOneListBox.Items;

        foreach (string str in contents)
        {
            Regex placementOneRegex = new Regex(@"(RES|0402|0201|0603|0805|1206|1306|1608|3216|2551"
                + @"|1913|1313|2513|5125|2525|5619|3813|1508|6431|2512|1505|2208|1005|1010|2010|0505|0705"
                + @"|1020|1812|2225|5764|4532|1210|0816|0363|SOT)");
            items = str.Split(' ');
            items[5].Replace(placementOneRegex.ToString(), "");
            placementOneListBox.Items.Equals(items);
        }

您可能会说..这不是最好的解决方法.我认为最简单的方法是string.Split()然后只是 join split[5]以外的所有split ...除了我不知道该怎么做. /p>

  • 我的代码不起作用

问题:

  • 如何抓住列表框中的每一行并删除(使用string.Split())的最后一条数据?
  • 有更简单的方法吗?

解决方案

虽然不完美,但实际上可以满足您的需求.您必须对Join进行调整,以使其按您希望的方式输出.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Remove_Click(object sender, EventArgs e)
    {
        ListBox.ObjectCollection collection = placementOneListBox.Items;
        // New collection to store our modified data
        List<string> newCollection = new List<string>();
        // We need regex to account for 0 or more spaces between items in the array.
        Regex r = new Regex(" +");

        foreach (string item in collection)
        {
            // use the regex we created to split the item into an array, it splits it based on any number of spaces.
            string[] splitItem = r.Split(item);
            // We had to write an extension method that "removes" at a particular index.
            splitItem = splitItem.RemoveAt(5);
            // Put it back together again. might have to mess with this to make it output correctly
            string updatedItem = String.Join("    ", splitItem);
            // add new item to collection
            newCollection.Add(updatedItem);
        }
        // clear the existing stuff in the listbox collection
        placementOneListBox.Items.Clear();
        // we can use a List<T> as a data source so that's what were doing here.
        placementOneListBox.DataSource = newCollection;
    }


}

按原样将此代码放入其自己的类中.

public static class ExtensionMethods
{
    // An extension method to remove an index from an array, it works with any value type
    public static T[] RemoveAt<T>(this T[] source, int index)
    {
        if (source == null)
            throw new ArgumentNullException();

        if (index < 0 || index > source.Length)
            throw new IndexOutOfRangeException();

        T[] dest = new T[source.Length - 1];

        if (index != 0)
            Array.Copy(source, 0, dest, 0, index - 1);

        if (index != source.Length)
            Array.Copy(source, index + 1, dest, index, source.Length - index - 1);

        return dest;
    }
}

不要使用我的上一个方法,我必须修复扩展方法,当要删除的指定索引为0或数组的长度时,该方法不起作用.

I have a listbox that has contents that look like this:

C44     EXCLUDES    237.910  193.469  0    0603_5    
C45     EXCLUDES    244.102  193.387  0    0603_5    
R47     EXCLUDES    226.935  179.519  90   0402_2    
C18     CAP-00129G  230.960  190.619  0    0402_4    
C17     CAP-00129G  250.085  198.569  90   0402_3     
C25     CAP-00130G  255.635  189.669  90   0402_3    
C56     EXCLUDES    229.430  189.374  0    0402_4    
R42     EXCLUDES    241.010  192.194  90   TANT3216  
R10     EXCLUDES    246.560  203.894  0    0402_9    

On the click of a button, I would like to "REMOVE ENDINGS" and re-upload it to the ListBox. So the new ListBox would look like this:

C44     EXCLUDES    237.910  193.469  0 
C45     EXCLUDES    244.102  193.387  0
R47     EXCLUDES    226.935  179.519  90
C18     CAP-00129G  230.960  190.619  0
C17     CAP-00129G  250.085  198.569  90
C25     CAP-00130G  255.635  189.669  90
C56     EXCLUDES    229.430  189.374  0
R42     EXCLUDES    241.010  192.194  90
R10     EXCLUDES    246.560  203.894  0

All of the possibly endings are in this REGEX: Regex placementOneRegex = new Regex(@"(RES|0402|0201|0603|0805|1206|1306|1608|3216|2551|1913|1313|2513|5125|2525|5619|3813|1508|6431|2512|1505|2208|1005|1010|2010|0505|0705|1020|1812|2225|5764|4532|1210|0816|0363|SOT)");

CODE:

    private void removeEndingsButton_Click(object sender, EventArgs e)
    {
        string[] items;
        System.Windows.Forms.ListBox.ObjectCollection contents = placementOneListBox.Items;

        foreach (string str in contents)
        {
            Regex placementOneRegex = new Regex(@"(RES|0402|0201|0603|0805|1206|1306|1608|3216|2551"
                + @"|1913|1313|2513|5125|2525|5619|3813|1508|6431|2512|1505|2208|1005|1010|2010|0505|0705"
                + @"|1020|1812|2225|5764|4532|1210|0816|0363|SOT)");
            items = str.Split(' ');
            items[5].Replace(placementOneRegex.ToString(), "");
            placementOneListBox.Items.Equals(items);
        }

As you can probably tell.. this is not the best away to go about it. I think it would be easiest to string.Split() and then just join all the split's except the split[5]... except I do not know how to go about doing this..

  • My code does not work

QUESTIONS:

  • How do I grab each line in the listbox and remove the last piece of data (using string.Split())?
  • Is there an easier way to do this?

解决方案

Not perfect, but it does what you are looking for essentially. You have to tweak the Join to make it output how you want.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Remove_Click(object sender, EventArgs e)
    {
        ListBox.ObjectCollection collection = placementOneListBox.Items;
        // New collection to store our modified data
        List<string> newCollection = new List<string>();
        // We need regex to account for 0 or more spaces between items in the array.
        Regex r = new Regex(" +");

        foreach (string item in collection)
        {
            // use the regex we created to split the item into an array, it splits it based on any number of spaces.
            string[] splitItem = r.Split(item);
            // We had to write an extension method that "removes" at a particular index.
            splitItem = splitItem.RemoveAt(5);
            // Put it back together again. might have to mess with this to make it output correctly
            string updatedItem = String.Join("    ", splitItem);
            // add new item to collection
            newCollection.Add(updatedItem);
        }
        // clear the existing stuff in the listbox collection
        placementOneListBox.Items.Clear();
        // we can use a List<T> as a data source so that's what were doing here.
        placementOneListBox.DataSource = newCollection;
    }


}

EDIT: Put this code in it's own class as is.

public static class ExtensionMethods
{
    // An extension method to remove an index from an array, it works with any value type
    public static T[] RemoveAt<T>(this T[] source, int index)
    {
        if (source == null)
            throw new ArgumentNullException();

        if (index < 0 || index > source.Length)
            throw new IndexOutOfRangeException();

        T[] dest = new T[source.Length - 1];

        if (index != 0)
            Array.Copy(source, 0, dest, 0, index - 1);

        if (index != source.Length)
            Array.Copy(source, index + 1, dest, index, source.Length - index - 1);

        return dest;
    }
}

EDIT: Don't use my previous one, I had to fix the extension method, it wasn't working when the specified index to be removed was 0 or the length of the array.

这篇关于C#-列表框删除部分行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆