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);
}
Почтовый журнал.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 ответов:
Приведенный код не помогает понять, что именно вы сделали. Я имею в виду, что вы выполняете Метод
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); }
Обычно это происходит из-за исключения CrossThread, поэтому я думаю, что вам нужно добавить try catch, чтобы проверить, если вам нужно будет вызвать сетку
Edit: только что заметил, что вы спросили, Где поставить try catch вы можете поместить его в любую из ваших обеих пустот, попробуйте это
try{ updateLogs.updateMailLogs(fileName,dateDelivered,status); } catch (Exception ex) {MessageBox.Show(ex.ToString());}
Comments