我创建了一个应用程序,只要成功发送电子邮件,就会更新日志表单。我的代码是这样的:
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);
}
答案 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);
}