Делегатский звонок не может обновить уже открытый отчет - PullRequest
0 голосов
/ 20 сентября 2019

Я создаю приложение на c #.У меня есть две формы, скажем, MainForm и ReportForm.Я открыл обе формы рядом.Когда некоторые данные сохраняются в базе данных на главной форме, я хочу, чтобы они автоматически отображались в форме отчета.Я использую делегаты и вызываю делегировать метод отчета, но отчет Crystal не обновляет отчет.Есть кнопка предпросмотра.Нажатие на эту кнопку показывает отчет правильно с обновленными изменениями.

Мой код Mainform -

    EndSale();
    if (Application.OpenForms.OfType<Reports.FullSaleReport>().Count() == 1)
                {
                    Reports.FullSaleReport saleReport = (Reports.FullSaleReport)Activator.CreateInstance(typeof(Reports.FullSaleReport));
                    ShowSaleReport sale = new ShowSaleReport(saleReport.ShowReport);
                    sale("%", DateTime.Now.AddMonths(-1).ToShortDateString(), DateTime.Now.AddDays(1).ToShortDateString());
                }

Мой код формы отчета -

public void ShowReport(string cbx, string FromDate, string ToDate)
    {
        String Query = "Select a.Id, a.CustomerName, Convert(varchar(12), a.SaleDate, 106) as 'SaleDate', d.ProductName + ISNULL(' ' + d.Potency, '') + ' ' + e.Description as 'Product', b.ProductQuantity, b.ProductUnitPrice, Convert(decimal(16, 2), b.ProductTotalPrice) as 'TotalPrice', b.Id as 'SaleDetailId', (Select Min(x.Id) From SaleDetailModels x Where x.SaleId = a.Id) as 'MinSaleDetailId' From SaleModels a, SaleDetailModels b, ProductModels d, ProductTypes e Where a.Id = b.SaleId and b.ProductId = d.Id and d.ProductTypeId = e.Id and a.CustomerName Like '" + cbx + "' and a.SaleDate between '" + FromDate + "' and '" + ToDate + "' Order by Id, SaleDetailId";
        SqlConnection con = new SqlConnection();
            con.ConnectionString = ConnectionString;
            con.Open();
            SqlDataAdapter dscmd = new SqlDataAdapter(Query, con);
            DataSet ds = new DataSet();
            dscmd.Fill(ds, "FullSale");
            con.Close();

bin.Debug.Reports.rptFullSale objRpt = new bin.Debug.Reports.rptFullSale();
                objRpt.SetDataSource(ds.Tables["FullSale"]);
                crystalReportViewer1.ReportSource = objRpt;
                crystalReportViewer1.Refresh();
    }

То, что я проверяю, выполняется до подключениязакройте "con.Close ()".после этого он не может обновить отчет.cbx, fromdate и todate - это в основном комбинированные списки и указатели даты и времени в форме отчета.Он также не может принимать данные полей, поэтому я использую передачу статических данных с использованием делегата, а не фактических данных в форме отчета.

Две открытые формы похожи на это enter image description here

Заранее спасибо.В ожидании любого положительного ответа

С уважением

1 Ответ

1 голос
/ 20 сентября 2019

Поскольку он работал на полпути, я объясню здесь более подробно:

if (Application.OpenForms.OfType<Reports.FullSaleReport>().Count() == 1) 
{
   Application.OpenForms.OfType<Reports.FullSaleReport>() // List of Forms of Type FullSaleReport
 //vv Return the first entry in the list 
 //|  (which should be always the one we already checked to be there
 //|                v If not null ...
 //|                | vv Call ShowReport Method on the returned instance.
   .FirstOrDefault()?.ShowReport("%",
                                 DateTime.Now.AddMonths(-1).ToShortDateString(),
                                 DateTime.Now.AddDays(1).ToShortDateString()); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...