2015-10-03 2 views
1

У меня есть пункт меню в главном меню под названием «Активные отчеты». когда пользователь выбирает отчет для печати, я запускаю средство просмотра отчетов Crystal в отдельном потоке. Пользователь может открыть несколько открывателей отчетов, и я хочу их отслеживать. В основном этот список меню позволит пользователю щелкнуть по отчетам, и если отчет работает слишком долго, пока он обрабатывает данные для отчета, я могу отключить прерывание в этом потоке, чтобы отменить текущий отчет. Поскольку каждый просмотрщик отчетов закрыт, я удалю его из списка меню. У меня есть класс под названием ReportThreadClass, который отслеживает каждый текущий отчет и поток, к которому он принадлежит. После того, как я запустил отчет в потоке, я хочу обновить пункт меню «Активные отчеты» и добавить имя отчета, которое будет запущено в список активных отчетов. Вот мой код для создания потока и ReportThreadClass.доступ к меню из нескольких потоков C#

public class ReportThreadClass 
{ 
    public Thread Thread { get; set; } 
    public bool AbortFlag { get; set; } 
    public string ReportName { get; set; } 
    public int ReportId { get; set; } 
} 

    public void RunReport(UAReport report) 
    { 
     Thread staThread = new Thread(r => ReportDocumentThread((UAReport) r)); 
     staThread.SetApartmentState(ApartmentState.MTA); 
     staThread.Start(report); 
    } 

    public void ReportDocumentThread(UAReport report) 
    { 
     var service = new UAReportService(report); //class that creates the report document that will be passed to the report viewer. 
     ReportDocument reportDocument = service.CreateReportDocument(); 
     string reportDesc = report.ReportDesc; 

     object args = new object[2] {reportDocument, reportDesc}; 

     var staThread = new Thread(new ParameterizedThreadStart(ReportViewerThread)); 

     int nextReportId; 
     if (!Program.MainForm.ReportThreads.Any()) 
      nextReportId = 0; 
     else 
     { 
      nextReportId = Program.MainForm.ReportThreads.Count() + 1; 
     } 

     ReportThreadClass reportThread = new ReportThreadClass(); 
     reportThread.Thread = staThread; 
     reportThread.ReportName = reportDesc; 
     reportThread.AbortFlag = false; 
     reportThread.ReportId = nextReportId; 

     Program.MainForm.ReportThreads.Add(reportThread); //list of all active reports running. 
     Program.MainForm.BuildActiveReportsMenu(); //how do i do this from thread. 

     staThread.SetApartmentState(ApartmentState.STA); 
     staThread.Start(args); 
     staThread.Join(100); 

    } 

    public void ReportViewerThread(object args) 
    { 
     Array argArray = new object[3]; 
     argArray = (Array) args; 
     ReportDocument reportDocument = (ReportDocument) argArray.GetValue(0); 
     string reportDesc = (string) argArray.GetValue(1); 

      try 
      { 
       ReportViewerForm form = new ReportViewerForm(reportDocument, reportDesc); 
       form.BringToFront(); 
       form.ShowDialog(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

    } 

Так как я могу создать «меню активных отчетов» после того, как я запустил новый отчет в потоке. В основном я прокручу список ReportThreads и добавлю активные отчеты в пункт меню «Активные отчеты». Список ReportThreads объявляется и сохраняется в главном окне. я могу получить к нему доступ через Program.MainWindow.

ответ

0

Если я правильно понимаю вас, вы хотите изменить свою форму из другой темы. Для этого вы можете использовать метод Invoke, например:

Program.MainForm.Invoke(() => Program.MainForm.BuildActiveReportsMenu()); 
+0

Что такое 'Program.MainForm'? – Eser

+0

Способ доступа OP к его форме. Вероятно, поле или собственность, я взял его прямо из своего кода. – georch

+0

Это просто крючок в главное окно для доступа к строке состояния, меню и панели инструментов. ok Я добавил эту строку кода в свой код и как создать делегат в классе основного окна. –

Смежные вопросы