2017-06-06 49 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

我复制了你的代码,它的工作,但我得到一个灰色的框在列的顶部,我已经添加了一个截图,任何想法可能会导致它? –

相关问题