Datagridview未在已打开的表单上更新

时间:2014-07-07 00:54:11

标签: c# winforms datagridview

我创建了一个应用程序,只要成功发送电子邮件,就会更新日志表单。我的代码是这样的:

mailSender.cs

     void Serche() 
     {
      {
       //perform thread background ip scanner
      }
      if (InvokeRequired){
      this.Invoke(new MethodInvoker(delegate
        {
            sendReport();
        }));
      }
     }

    public void sendReport()
    {
        //some codes to trigger time schedule to send report

        ExportToExcel(filePath);
        int milliseconds = 2000;
        Thread.Sleep(milliseconds);
        sendMail(filename);
    }

    private void sendMail(string filename)
    {
        string getFilePath = @"D:\Report\" + filename;
        string status = "send";
        try
        {
          // send email filename as attachment
        }
        catch (Exception ex)
        {
            status = "Fail";
        }
        sendMailReport(filename, DateTime.Now, mailStat);
    }

    private void sendMailReport(string fileName, DateTime dateDelivered, string status)
    {
        //mailLog updateLogs = new mailLog(); 
        updateLogs.updateMailLogs(fileName,dateDelivered,status);
    }

mailLog.cs

    public void updateMailLogs(string _fileName, DateTime _dateDelivered, string _status)
    {
        int num = dataGridView1.Rows.Add();       
        dataGridView1.Rows[num].Cells[0].Value = _fileName;  
        dataGridView1.Rows[num].Cells[1].Value = _dateDelivered;    
        dataGridView1.Rows[num].Cells[2].Value = _status;
        dataGridView1.Refresh();
    }

我逐行调试代码,发现所有参数都在我的updateMailLogs方法中成功检索,但不确定为什么它没有更新我的datagridview。有谁知道为什么?请指教。

解决

归功于@shell,他为我提供了这个问题的答案。

问题: -
1-如果表单已经打开,那么我就无法创建另一个mailLog表单对象并调用updateMailLogs方法 2-这不会更新您的网格数据。因为两个对象引用都不同。

的解决方案: -
1-需要从当前加载的mailLog表单的对象中调用该方法。

private void sendMailReport(string fileName, DateTime dateDelivered,string status)
{
if (Application.OpenForms["mailLog"] != null)
   ((mailLog)Application.OpenForms["mailLog"]).updateLogs.updateMailLogs(fileName,dateDelivered,status);
}

2 个答案:

答案 0 :(得分:3)

通常这会发生CrossThread异常,所以我想你需要添加try catch来检查,如果你需要调用网格

编辑:刚刚注意到你问到了try catch的位置 你可以把它放在任何一个空洞上,试试这个

try{
     updateLogs.updateMailLogs(fileName,dateDelivered,status);
   }
catch (Exception ex) {MessageBox.Show(ex.ToString());}

答案 1 :(得分:3)

提供的代码无助于理解您所做的事情。我的意思是你正在执行方法sendMailReport。该方法将在每次执行时创建mailLog类的对象。这可能会丢失您现有的数据。最好在mailLog方法块之外创建sendMailReport类对象,然后只执行updateMailLogs方法。

mailLog updateLogs = new mailLog();
private void sendMailReport(string fileName, DateTime dateDelivered,string status)
{        
    updateLogs.updateMailLogs(fileName,dateDelivered,status);
}

<强>编辑:

如果表单已经加载,那么你应该调用这样的方法。在这里,您不需要创建mailLog类的新对象。

private void sendMailReport(string fileName, DateTime dateDelivered,string status)
{        
    ((mailLog)Application.OpenForms["mailLog"]).updateMailLogs(fileName,dateDelivered,status);
}