У меня есть пункт меню в главном меню под названием «Активные отчеты». когда пользователь выбирает отчет для печати, я запускаю средство просмотра отчетов 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.
Что такое 'Program.MainForm'? – Eser
Способ доступа OP к его форме. Вероятно, поле или собственность, я взял его прямо из своего кода. – georch
Это просто крючок в главное окно для доступа к строке состояния, меню и панели инструментов. ok Я добавил эту строку кода в свой код и как создать делегат в классе основного окна. –