2017-07-06 7 views
1

まず、csvファイルをdatagridviewにインポートし、必要な形式に変更しました。DataGridviewの値をコレクションクラスに格納する方法C#

ボタンをクリックして不要なデータを除外することができます。console.writelineを使用してコンソールに必要なデータを取得します。 (テストのために、実際に何が起こっているかを見ることができます)。私が計算したいデータに満足していない列がかなりあるので、私は.contains().replaceを使ってそれを除外します。

今、配列に値を保持するcell.value.toString()を格納したいのですが、配列を移植する方法がわかりません。

は、ここでは、コード

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 


namespace test2 
{ 
    public partial class Form1 : Form 
    { 
     OpenFileDialog openFile = new OpenFileDialog(); 

     public int colC { get; private set; } 

     public Form1() 
     { 
      InitializeComponent(); 
     } 


     public void Button1_Click(object sender, EventArgs e) 
     { 
      if (openFile.ShowDialog() == DialogResult.OK) 
      { 
       List<string[]> rows = File.ReadLines(openFile.FileName).Select(x => x.Split(',')).ToList(); 
       DataTable dt = new DataTable(); 
       List<string> headerNames = rows[0].ToList(); 

       foreach (var headers in rows[0]) 
       { 
        dt.Columns.Add(headers); 
       } 
       foreach (var x in rows.Skip(1).OrderBy(r => r.First())) 
       { 
        if (x[0] == "Lot ID") //linq to check if 2 lists are have the same elements (perfect for strings) 
         continue;  //skip the row with repeated headers 
        if (x.All(val => string.IsNullOrWhiteSpace(val))) //if all columns of the row are whitespace/empty, skip this row 
         continue; 
        dt.Rows.Add(x); 
       } 

       dataGridView1.DataSource = dt; 
       dataGridView1.ReadOnly = true; 
       // dataGridView1.Columns["Lot ID"].ReadOnly = true;  
       //dataGridView1.Columns[" Magazine ID"].ReadOnly = true; 
       //dataGridView1.Columns["Frame ID"].ReadOnly = true; 

      } 
     } 

     public void Form1_Load_1(object sender, EventArgs e) 
     { 
      openFile.Filter = "CSV|*.csv"; 

     } 

     public void Button2_Click(object sender, EventArgs e) 
     { 

      SaveFileDialog sfd = new SaveFileDialog(); 
      sfd.Filter = "txt files (*.txt)|*.txt|Csv files (*.csv)|*.csv"; 
      sfd.FilterIndex = 2; 


      if (sfd.ShowDialog() == DialogResult.OK) 
      { 
       try 
       { 
        StreamWriter sw = new StreamWriter(sfd.FileName, false); 
        { 
         string columnHeaderText = ""; 

         int countColumn = dataGridView1.ColumnCount - 1; 

         if (countColumn >= 0) 
         { 
          columnHeaderText = dataGridView1.Columns[0].HeaderText; 
         } 

         for (int i = 1; i <= countColumn; i++) 
         { 
          columnHeaderText = columnHeaderText + ',' + dataGridView1.Columns[i].HeaderText; 
         } 


         sw.WriteLine(columnHeaderText); 

         foreach (DataGridViewRow dataRowObject in dataGridView1.Rows) 
         { 
          if (!dataRowObject.IsNewRow) 
          { 
           string dataFromGrid = ""; 

           dataFromGrid = dataRowObject.Cells[0].Value.ToString(); 

           for (int i = 1; i <= countColumn; i++) 
           { 
            dataFromGrid = dataFromGrid + ',' + dataRowObject.Cells[i].Value.ToString(); 

           } 
           sw.WriteLine(dataFromGrid); 
          } 
         } 

         sw.Flush(); 
         sw.Close(); 
        } 
       } 
       catch (Exception exceptionObject) 
       { 
        MessageBox.Show(exceptionObject.ToString()); 
       } 
       } 
      } 

     public void Button3_Click(object sender, EventArgs e) 
     { 


      foreach (DataGridViewRow row in dataGridView1.Rows) 
      { 
       foreach (DataGridViewCell cell in row.Cells) 
       { 
        //prevent error occur coz , only execute the not null line 
        if(cell.Value != null) 
        { 
         string cellV = cell.Value.ToString(); 

         //do operations with cell, filter out the unnecessary data 
         if (!cellV.Contains("=")) 
         { 
          continue; 
         } 
         else if (cellV.Contains("P = ")) 
         { 
          cellV = cellV.Replace("P = ", ""); 
         } 
         else if (cellV.Contains("F = n/a")) 
         { 
          cellV =cellV.Replace("F = n/a", "0"); 

         } 
         else if (cellV.Contains("F = ")) 
         { 
          cellV = cellV.Replace("F = ", ""); 

         } 

         Console.WriteLine(cellV + "\n"); 
        } 

       } 
      } 

     } 

    } 
    } 

最後の方法や画像で見てくださいです。 enter image description here

ここに出力があります。 enter image description here

私は私がアレイ状にフィルタリングされたデータを保存するにはどうすればよいcontinue

を使用して計算に関連していないすべてのデータをスキップ???

ご質問がございましたら、お気軽にお問い合わせください。

+0

ご質問の内容を理解することは非常に困難です。あなたがしようとしていることは何でも...あなたはそれをはるかに複雑にしているようです。 'button3_Click'イベントとは何でしょうか? [良い質問をするにはどうすればいいですか?](http://stackoverflow.com/help/how-to-ask)... [[最小限で完全で検証可能な例を作成する方法](http ://stackoverflow.com/help/mcve) – JohnG

+0

私はいくつかの計算を行うことができるように、セルの値に配列を移植しようとしています。 button3_clickは計算を実行するとしますが、まだ関数を完了していません。 – ccs

+0

私は何かが欠けている場合は申し訳ありません...私はあなたが何を意味するのか分からない_ "セルの値に配列を移植して_を計算できるようにする" _...ボタン3のイベントが(失敗した)等号(=)を含むセルを解析します。あなたが投稿したコードはそれほど役に立ちません。最初のファイルはcsvファイルを読み込み、秒はそれを保存し、第3は "="を含む文字列の解析を試みます。あなたが達成したいことが分からなければ、答えはほとんどが投機であろう。 – JohnG

答えて

2

のようになります。まず、さらにDataSourceDataGridViewをループするときは、グリッドの代わりにDataSourceを使用して修正/追加などを行う方がよいことです。この例では違いはありませんが、以下のコードはグリッドではなくDataSourceDataTable)をループします。

以下は、「=」記号が等しい文字列をdecimal値に変換する改訂されたボタン3クリックです。等しい "="文字を含み、等号の後に有効な10進数を持たない文字列の場合、ゼロ(0)が返されます。ヘルパーメソッドは、文字列 "P = XX.xx"を取得するために使用され、有効なdecimal番号または無効な番号の場合は0を返します。これが理にかなってほしい。

private void button3_Click(object sender, EventArgs e) { 
    decimal decimalNumber = 0.0m; 
    foreach (DataRow row in dt.Rows) { 
    for (int i = 0; i < dt.Columns.Count; i++) { 
     if (row.ItemArray[i] != null) { 
     if (row.ItemArray[i].ToString().Contains("=")) { 
      decimalNumber = GetDecimalFromEquation(row.ItemArray[i].ToString()); 
      textBox1.Text += decimalNumber.ToString() + Environment.NewLine; 
     } 
     } 
    } 
    textBox1.Text += Environment.NewLine; 
    } 
} 

private decimal GetDecimalFromEquation(string numberString) { 
    decimal parsedValue = 0.0m; 
    if (numberString.Contains("=")) { 
    numberString = numberString.Replace(" ", ""); 
    string[] splitArray = numberString.Split('='); 
    if (splitArray.Length >= 2) { 
     decimal.TryParse(splitArray[1], out parsedValue); 
    } 
    } 
    return parsedValue; 
} 

読み取り可能なcsvメソッドのクリーナーバージョンです。

private void button1_Click(object sender, EventArgs e) { 
    if (openFile.ShowDialog() == DialogResult.OK) { 
    List<string[]> rows = File.ReadLines(openFile.FileName).Select(x => x.Split(',')).ToList(); 
    List<string> headerNames = rows[0].ToList(); 
    foreach (var headers in rows[0]) { 
     dt.Columns.Add(headers); 
    } 
    foreach (var x in rows.Skip(1).OrderBy(r => r.First())) { 
     if ((!(x[0] == "Lot ID")) || (!(x.All(val => string.IsNullOrWhiteSpace(val))))) 
     dt.Rows.Add(x); 
    } 
    dataGridView1.DataSource = dt; 
    dataGridView1.ReadOnly = true; 
    } 
} 

最後に、書き込みメソッドの可能なクリーナーバージョンです。グリッド自体の代わりにDataTableを使用します。

private void button2_Click(object sender, EventArgs e) { 
    SaveFileDialog sfd = new SaveFileDialog(); 
    sfd.Filter = "txt files (*.txt)|*.txt|Csv files (*.csv)|*.csv"; 
    sfd.FilterIndex = 2; 
    if (sfd.ShowDialog() == DialogResult.OK) { 
    try { 
     using (StreamWriter sw = new StreamWriter(sfd.FileName, false)) { 
     string columnString = ""; 
     for (int i = 0; i < dt.Columns.Count - 1; i++) { 
      columnString += dt.Columns[i].ColumnName; 
      if (i < dataGridView1.Columns.Count - 2) 
      columnString += ","; 
     } 
     sw.WriteLine(columnString); 
     string rowString = ""; 
     foreach (DataRow dr in dt.Rows) { 
      rowString = ""; 
      for (int i = 0; i < dt.Columns.Count - 1; i++) { 
      rowString += dr.ItemArray[i].ToString(); 
      if (i < dt.Columns.Count - 2) 
       rowString += ","; 
      } 
      sw.WriteLine(rowString); 
     } 
     } 
    } 
    catch (Exception exceptionObject) { 
     MessageBox.Show(exceptionObject.ToString()); 
    } 
    } 
} 
1

あなたはList<string> valuesを使用して、あなたはその後、格納された値に配列を取得するためにvalues.ToArray()を使用することができます values.Add(cellV);

を使用して文字列内の値を格納することができます。

あなたの関数は、私はこれが役立つかもしれないことを願っています。この

public void Button3_Click(object sender, EventArgs e) 
    { 

     List<string> values = new List<string>(); 
     // Create a new instance of the Form2 class 
     // Form2 goForm2 = new Form2(); 

     // Show the settings form 
     // goForm2.Show(); 

     //string checkP = "p = "; 
     // string removePE = checkP.Replace("P = ", "").Replace("F = ", ""); 


     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      foreach (DataGridViewCell cell in row.Cells) 
      { 
       //prevent error occur coz , only execute the not null line 
       if(cell.Value != null) 
       { 
        string cellV = cell.Value.ToString(); 

        //do operations with cell 
        if (!cellV.Contains("=")) 
        { 
         continue; 
        } 
        else if (cellV.Contains("P = ")) 
        { 
         cellV = cellV.Replace("P = ", ""); 
        } 
        else if (cellV.Contains("F = n/a")) 
        { 
         cellV =cellV.Replace("F = n/a", "0"); 

        } 
        else if (cellV.Contains("F = ")) 
        { 
         cellV = cellV.Replace("F = ", ""); 

        } 
        values.Add(cellV); 
        Console.WriteLine(cellV + "\n"); 
       } 

      } 
     } 

    } 
関連する問題