C#DataGridView - 表没有填充

时间:2017-06-08 12:42:05

标签: c# datagridview

我正在尝试将我从program.cs中的文本文件中提取的数据显示到DataGridView,但是当我运行代码时,表格仍为空白。

我遇到的另一个问题是,当表单打开时,它会停止运行代码。

基本上代码的作用是从sftp服务器下载.zip文件,解压缩文本文件,读取文件,将每一行添加到数组中,并将某一行拆分为数组。我正试图让该数组中的变量出现在我的表单中的DataGridView上。

这是我的代码:

class Machine
{
    public string MacNum { get; set; }
    public string CashCount { get; set; }
    public string VendCount { get; set; }
}

static class Program 
{
    [STAThread]
    static void Main()
    {
        string zipTemp = (@"C:\Users\mark\Desktop\Project Dex\zipTemp\");

        string machineCashCount = ("");
        string hostIP = ("0.0.0.0");
        string userName = ("UN");
        string passWord = ("PW");
        string remotePath = (@"/home/dex/RESPONSE/PROCESSED");
        string localPath = (@"C:\Users\mark\Desktop\Project Dex\Temp\PROCESSED\");

        Application.Run(new Form1());
        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());
    }
}

Form1中:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public void Form1_Load(object sender, EventArgs e)
    {

    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {

    }
}

2 个答案:

答案 0 :(得分:0)

你的程序基本上做的是运行Form,下载zip文件,处理zip文件,就是这样。

您需要在表单的form_load事件或按钮单击事件而不是Main()中执行所有操作。

  1. 从代码的开头删除Application.Run(new form1)。不需要。
  2. 将最后一个Application.Run(新Form1)之前的所有内容[请注意这是'F',这是正确的一个]到表单内的私有函数。我们称之为processFile()
  3. 在Form1_Load()事件中调用此processFile()。
  4. 将m分配给DataGridView的data属性,并调用DataGridView.Bind()将数据绑定到datagrid控件。
  5. 更新: 由于您有一个按钮和一个Button_Click事件,所以将processFile()放在Button的click事件中。显示表单时,单击按钮以使整个过程运行

答案 1 :(得分:0)

1.删除

 Application.Run(new Form1());
 DataGridView dataGridView = new DataGridView();

dataGridView.DataSource = machines;

2.最终改变

Application.Run(new Form1());

Application.Run(new Form1(machines));

3.将构造函数添加到Form1:

 public Form1(IList<Machine> machines)
 {
     InitializeComponent();
     dataGridView1.DataSource = machines;
 }
相关问题