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

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

    Ничего не найдено.