2011-07-22 5 views
0

の一部を削除します。ボタンをクリックするだけで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)");

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

として、あなたはおそらくすることができます教えてください。これはそれについて行くべき最善のものではありません。私はこれをやって行く方法がわからないを除いて、私は...それはstring.Split()に最も簡単になり、その後、ちょうどsplit[5]以外すべてsplit年代に参加すると思います。..

  • 私のコードは
  • 動作しません。

質問:

  • リストボックスの各行を取得し、最後のデータを削除するにはstring.Split()を使用)
  • これを行う簡単な方法はありますか?
+1

あなたが仕事をしている場合は...なぜそれを変更しようとしていますか?私はちょうどポイントが表示されません一致するものの文字列配列を作成することができます。今あなたが持っているのは、毎回文字列の配列を更新することを覚えておく必要がなく、簡単な方法です。私はまたあなたの話[5]が問題なのかどうか分かりません。どのようにあなたがそれを行うには、私たちは単にそこから行く試みを投稿する。 –

+0

エンディングを削除した後、データが同じリストボックスにリロードされますか?もしそうなら、最初の場所で終わりを表示するのはなぜですか?余分なものを最初に整えてみませんか? – IAbstract

+0

@Ramhound:これはうまくいかない: -/..とsplit [5]は** endings **がある場所なので、split [5]を何も置き換えようとしていない。上記の私のコードでは動作しません。 – theNoobGuy

答えて

0

このようなものはありますか?私はそれをテストしなかった。

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

    foreach (string str in contents) 
    { 

     List<string> list = str.Split(' ').ToList(); 
     if(list.Count == 6) 
     { 
      string remove = list[5]; 
      list.Remove(remove);   
      placementOneListBox.Items.Equals(list.ToArray()); 
     } 
    } 
} 

これらがタブの場合は、分割方法で '\ t'を試してみるとよいでしょう。

+0

Visual Studio 2010で、 'str.Split( '').ToList()の下にある赤い行をスクロールすると、' remove(remove); '状態** ** 'bool'型を 'System'に暗黙的に変換できません。 Collections.Generic.List '"** – theNoobGuy

+0

私はエラーを修正するためにそれを更新しました。 – scott

+0

'removeEndingsButton'をクリックするとエラーが表示されます。**"インデックスは配列の境界外でした "**文字列' string remove = str.Split( '')[5]; ' – theNoobGuy

0
private void removeEndingsButton_Click(object sender, EventArgs e) 
    { 
     string[] items; 
     char[] splitChars = new char[] {'\t', ' '}; 
     int fieldCount; 
     int lineCount = 0; 

     System.Windows.Forms.ListBox.ObjectCollection contents = placementOneListBox.Items; 

     foreach (string str in contents) 
     { 
      lineCount++; 
      items = str.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); 
      fieldCount = items.Length; 
      placementOneListBox.Items[lineCount] = string.Join(" ", items.Take(fieldCount - 1).ToArray()); 
     } 
    } 
+0

私が100%でない部分は、placementOneListBox.Items.Equalsの使用です。分割と再連結が機能します。 – seveland

+0

ボタンがクリックされたときに**インデックスが配列の境界外にあり、** placementOneListBox.Items.Equals(string.Concat(items [0]、 ""、items [1 ]、items [2]、 ""、items [3])); – theNoobGuy

+0

各行に含まれる可能性のあるフィールドの数に制限がありますか?それとも単純に> = 0ですか? – seveland

0

データを見ると、文字列の位置を使用してエンディングを削除できると考えています。 33番目の位置の後に各エントリを切り捨てたいようです。

すべての行はこの形式ですか?

+0

値が常に同じ場所で終わるとは限りません – theNoobGuy

0

完全ではありませんが、本質的に探していることをします。どのように出力するには、結合を微調整する必要があります。

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:このコードをそのまま自分のクラスに入れます。

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:私の前のものを使用しないでください、私は指定されたインデックスを削除するとき、それは働いていなかった、拡張メソッドを修正する必要がありましたが0または配列の長さでした。

+0

'splitItem。** RemoveAt(5)**'は動作していないようです。間違ったウィットヒットを知っていますか? – theNoobGuy

+0

それについて何が働いていませんか?あなたは具体的にどんなエラーを出していますか? – Odnxe

+0

私は次のエラーが発生しています: '( 'System.Array'には 'RemoveAt'というdefnitionはなく、 'System.Array'タイプの最初の引数を受け入れる拡張メソッド 'RemoveAt'は見つかりませんでした。ディレクティブまたはアセンブリ参照?) ' – theNoobGuy

関連する問題