C#-列表框删除部分行 [英] C# - Listbox Remove part of line
问题描述
我有一个列表框,其内容如下所示:
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屋!