2017-06-06 13 views
0

私は自分のプログラム内のテキストファイルからDataGridViewに引っ張ったデータを表示しようとしていますが、それを行う方法がわかりません。フォームが開くと、コードの実行が停止します。 、C#プログラムからDataGridViewにデータを表示

DataGridView dataGridView = new DataGridView(); 
IList<Machine> machines = new BindingList<Machine>(); 
dataGridView.DataSource = machines; 


SessionOptions sessionOptions = new SessionOptions 
     { 
      Protocol = Protocol.Sftp, 
      HostName = hostIP, 
      UserName = userName, 
      Password = passWord, 
      PortNumber = 22, 
      SshHostKeyFingerprint = "ssh-rsa 2048 96:48:96:52:8c:e7:de:c6:e1:00:08:7e:db:ad:e4:06" 

     }; 

     using (Session session = new Session()) 
     { 
      session.Open(sessionOptions); 

      TransferOptions transferOptions = new TransferOptions(); 
      transferOptions.TransferMode = TransferMode.Binary; 

      session.GetFiles(remotePath, @"C:\Users\mark\Desktop\Project Dex\Temp\").Check(); 
     } 

     DirectoryInfo directorySelected = new DirectoryInfo(@"C:\Users\mark\Desktop\Project Dex\Temp\PROCESSED\"); 
     List<string> fileNames = new List<string>(); 

     foreach (FileInfo fileInfo in directorySelected.GetFiles("*.zip")) 
     { 
      fileNames.Add(fileInfo.Name); 
     } 

     foreach (string fileName in fileNames) 
     { 
      string zipFilePath = localPath + fileName; 

      using (ZipFile zip1 = ZipFile.Read(zipFilePath)) 
      { 
       var selection = (from e in zip1.Entries 
           where (e.FileName).StartsWith("01e") 
           select e); 


       Directory.CreateDirectory(zipTemp); 

       foreach (var e in selection) 
       { 
        e.Extract(zipTemp, ExtractExistingFileAction.OverwriteSilently); 
       } 
      } 

      DirectoryInfo dexDirect = new DirectoryInfo(@"C:\Users\mark\Desktop\Project Dex\zipTemp\"); 
      List<string> dexName = new List<string>(); 


      foreach (FileInfo dexInfo in dexDirect.GetFiles("*.dex")) 
      { 
       dexName.Add(dexInfo.Name); 
      } 



      foreach (string dexNames in dexName) 
      { 
       string dexFilePath = zipTemp + dexNames; 

       string[] lines = System.IO.File.ReadAllLines(dexFilePath); 

       foreach (string line in lines) 
       { 
        machineCashCount = Array.Find(lines, 
       element => element.StartsWith("VA1", StringComparison.Ordinal)); 
       } 
       string[] MCC1 = machineCashCount.Split('*'); 
       string[] nm = dexNames.Split('.'); 

       int nam = int.Parse(nm[0], System.Globalization.NumberStyles.HexNumber); 

       //Console.WriteLine((nam + (":") + "Total cash count: ") + MCC1[1]); 
       //Console.WriteLine((nam + (":") + "Number of paid vends: ") + MCC1[2]); 


       Machine m = new Machine(); 

       m.MacNum = nm[0]; 
       m.CashCount = MCC1[1]; 
       m.VendCount = MCC1[2]; 
       machines.Add(m); 


      } 
     } 

     Application.Run(new Form1()); 
    } 
} 

}「抽象クラスまたはインタフェースのIListのインスタンスを作成することはできません」のあなたの特定のエラーのために

screenshot

答えて

2

:ここ

は、私のコードの主要な部分であります問題は、インタフェースのインスタンスを作成しようとしていることです。あなたは具体的なクラスが必要です。例えば、リストは、インターフェイスは、基本的には契約記述され

IList<string> names = new List<string>(); 

を行うことができるようにするIListを実装するもの、それは行うことができます実装するクラス。

あなたの質問には、データを保持するクラスを作成し、ファイルをオブジェクトに解析し、BindingListや他の適切なコレクションに入れ、そのデータグリッドビューをそのコレクションにバインドしたいとします。

class Machine 
{ 
    public string Name {get; set;} 
    public decimal CashCount {get; set;} 
} 

public static void main() 
{ 
    IList<Machine> machines = new BindingList<Machine>(); 

    foreach(string fileName in fileNames) 
    { 
     //read your files, put data in a Machine object 
     Machine m =new Machine(); 
     m.Name=nm[0]; 
     m.CashCount=MCC1[0]; 
     //add it to the list 
     machines.add(m); 
    } 

    //then bind the collection to your datagridview 
    datagridView.Datasource = machines; 
} 

フォームデザイナーで、データグリッドビューに2つの列を追加し、それらのバインドを名前とキャッシュカウントにそれぞれ設定できます。たとえば、CashCount列のフォーマットを金額として表示するように設定することもできます。


編集:

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace datagridview 
{ 
    public partial class Form1 : Form 
    { 
     private DataGridView dgvMachines; 

     public Form1() 
     { 
      InitializeComponent(); 
      //this is the Designer.cs code... 
      this.dgvMachines = new System.Windows.Forms.DataGridView(); 
      ((System.ComponentModel.ISupportInitialize)(this.dgvMachines)).BeginInit(); 
      this.SuspendLayout(); 
      // 
      // dgvMachines 
      // 
      this.dgvMachines.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
      this.dgvMachines.Location = new System.Drawing.Point(12, 12); 
      this.dgvMachines.Name = "dgvMachines"; 
      this.dgvMachines.Size = new System.Drawing.Size(606, 400); 
      this.dgvMachines.TabIndex = 0; 
      // 
      // Form1 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(630, 434); 
      this.Controls.Add(this.dgvMachines); 
      this.Name = "Form1"; 
      this.Text = "Form1"; 
      ((ISupportInitialize)(this.dgvMachines)).EndInit(); 
      this.ResumeLayout(false); 

      IList<Machine> machines = new BindingList<Machine>(); 
      dgvMachines.DataSource = machines; 
      machines.Add(new Machine { Name = "#1", CashCount = 100 }); 
      machines.Add(new Machine { Name = "#2", CashCount = 200 }); 
      machines.Add(new Machine { Name = "#3", CashCount = 300 }); 
      machines.Add(new Machine { Name = "#4", CashCount = 400 }); 
     } 
    } 

    class Machine 
    { 
     public string Name { get; set; } 
     public decimal CashCount { get; set; } 
    } 
} 

Result

+0

最小限の作業例を追加することは、私は値が実際に表示するために取得カントとして、残念ながら私は完全にあなたの答えを理解していませんが、ご返信いただきありがとうございます私のフォーム。私が編集したコードを更新しました –

+0

@MarkBuckleyよくまずデータがあることを確認してください。次に、あなたのdaragridviewが本当にあなたのフォームに追加され、宣言されていないことを確認してください。 私のために働く最小のサンプルを追加しました。 – 0xFF

+0

コードをコピーしても機能しましたが、列の上部にグレーのボックスが表示されました。スクリーンショットを追加しました。 –

関連する問題