DataGridView在已经打开的表单上没有更新

3

我创建了一个应用程序,当电子邮件成功发送时,它会更新日志表单。我的代码类似于以下内容:

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);
}

如果您执行dataGridView1.Rows.Add(_fileName, _dateDelivered, _Status);,是否会有任何不同?[我从未必须以这种方式手动刷新...] - Austin T French
@AustinFrench 是的,我已经尝试使用那种方法了,但结果仍然是一样的。它没有刷新数据网格视图。 - Ren
嗯,@Ren 你有在 try catch 中吗?你的 dgv 正好有三列吗?我使用了你的方法(复制粘贴)从一个带有虚假属性的按钮中,没有任何问题... - Austin T French
@AustinFrench 是的,我已经仔细检查了列数,确实只有3列。也许如果mailSender.cs和mailLog.cs在不同的分离表单中会产生影响?如果我错了,请纠正我。 - Ren
@LevZ 是的,谢谢。我已经将mailLog类置于初始化状态。但是数据表格仍然没有更新行。=( - Ren
显示剩余2条评论
2个回答

3
通常这是由于跨线程异常引起的,所以我猜你需要添加try catch来进行检查,如果需要,你将需要调用网格。
编辑:刚刚注意到你问在哪里放置try catch,你可以将其放置在你两个void中的任何一个中,试试这个。
try{
     updateLogs.updateMailLogs(fileName,dateDelivered,status);
   }
catch (Exception ex) {MessageBox.Show(ex.ToString());}

谢谢,我已经按照你的建议编辑了我的代码。但是没有抛出任何异常。请问有什么想法吗? - Ren

3
提供的代码并不能帮助理解你究竟做了什么。我的意思是你正在执行方法sendMailReport。该方法将在每次执行时创建mailLog类的对象,这可能会丢失您现有的数据。最好在sendMailReport方法块外部创建您的mailLog类对象,并仅执行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);
}

谢谢,我已按您建议尝试过了。我将mailLog类放在初始化状态下,但仍然无法更新datagridview行。有任何想法为什么吗? - Ren
我已经编辑了我的问题,提供了一些额外的代码,希望能有所帮助。谢谢 - Ren
mailLog.cs 是一个窗体还是简单的类?我的意思是你把 dataGridView1 控件放在哪里了? - Shell
让我们在聊天中继续这个讨论 - Ren
是的,你说得对,我的窗体已经打开了。那么,有没有可能更新已经打开的窗体?请给我建议。 - Ren
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接