2017-06-06 85 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()); 
    } 
} 

}

screenshot

回答

2

爲了您的「無法創建抽象類或接口的IList的一個實例,」具體的錯誤,問題是你正在嘗試創建一個接口的實例。你想要一個具體的課程。例如,列表實現IList所以你可以做

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

的接口基本上是一個合同描述什麼實現它可以做一個類。

至於你的問題,你想創建一個類來保存你的數據,解析你的文件到對象中,把它們放入一個BindingList或任何其他適當的集合,然後將你的datagridview綁定到該集合。

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列到DataGridView並設置其分別結合名稱和CashCount。例如,您也可以將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

我複製了你的代碼,它的工作,但我得到一個灰色的框在列的頂部,我已經添加了一個截圖,任何想法可能會導致它? –