Страница 1 из 1

почему не открывается отчет?

Добавлено: 04 июн 2008, 07:10
compositum
У меня есть мой класс:

Код: Выделить всё

public partial class EstimateDS
    {
	StiReport report = new StiReport();        
	...

        /// 
        /// Открыть смету в режиме дизайна
        /// 
        public void Design()
        {                        
            report.RegData(dsName, ds); 
            Thread t = new Thread(new ThreadStart(openDesign));
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
        }
        [STAThread]
        private void openDesign()
        {
            report.Design();
        }
       
        /// 
        /// Загрузить шаблон отчета из mrt-файла
        /// 
        /// полный путь, указывающий файл шаблона
        public void Load(string fullPath)
        {
            this.report.Load(fullPath);
        }
        /// 
        /// Открыть отчет в предварительном просмотре
        /// 
        public void Show()
        {
            report.RegData(dsName, ds);
            report.Show();
        }
    }
Я использую его в коде приложения:

Код: Выделить всё

EstimateDS obj;
...
private void Show_Click(object sender, EventArgs e)
        {            
            try
            {
                Thread thrShow = new Thread(obj.Show);
                thrShow.SetApartmentState(ApartmentState.STA);
                thrShow.Start();                
            }
            catch (Exception)
            {
                MessageBox.Show("Сначала нужно создать DataSet и залить в него данные",
                    "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }            
        }
вижу процесс формирования отчета, но как только он завершается - отчет в тот же момент закрывается, не успев открыться.

если заменю метод на этот:

Код: Выделить всё

private void Show_Click(object sender, EventArgs e)
        {            
            try
            {                
                obj.Show();     
            }
            catch (Exception)
            {
                MessageBox.Show("Сначала нужно создать DataSet и залить в него данные",
                    "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }            
        }
то все работает
Почему в случае использования потока получается ерунда?

почему не открывается отчет?

Добавлено: 04 июн 2008, 23:34
Edward
попробуйте, пожалуйста, немного изменить код:

report.Show(true);

Спасибо.

почему не открывается отчет?

Добавлено: 05 июн 2008, 04:34
compositum
Edward писал(а):попробуйте, пожалуйста, немного изменить код:

report.Show(true);

Спасибо.
Да, благодарю - так открывается. Во всплывающей подсказке говорится, что bool указывает будет ли отчет отображаться как форма... Честно говоря не понял. Могли бы пояснить? В каком тогда режиме открывается без параметров? Помимо формы есть и др. режимы как я понял, в чем разница, когда какой лучше использовать?

почему не открывается отчет?

Добавлено: 09 июн 2008, 13:29
Edward
Вызов метода с параметром Show(true) приостанавливает выполнение следующего за report.Show(true) параметра, так как отчет показывается в диалоговом окне.

Show() сразу же передаёт управление следующему оператору.

В этом и заключаются отличия в работе 2-х разных вариантов.

Спасибо.

почему не открывается отчет?

Добавлено: 10 июн 2008, 07:17
compositum
Edward писал(а):...следующего за report.Show(true) параметра, так как отчет показывается в диалоговом окне.
Честно говоря - не понял. О каком параметре идет речь? Я ведь никаких параметров после report.Show(true) не указывал.
Edward писал(а): Show() сразу же передаёт управление следующему оператору.
Этого тоже не понял. О каком операторе идет речь?

почему не открывается отчет?

Добавлено: 10 июн 2008, 08:43
Edward
Извините за не совсем понятное объяснение. Допустим, у нас есть 2 функции:

Код: Выделить всё

public void Show1()
{
  report.RegData(dsName, ds);
  report.Show();
}

public void Show2()
{
  report.RegData(dsName, ds);
  report.Show(true);
}
В основной программе мы имеем, к примеру следующую последовательность их вызова:

Код: Выделить всё

Show2();
Show1();
следующий оператор или команда;
Так вот Show1() будет выполнен только после того, когда будет закрыто модальное диалоговое окно предварительного просмотра из Show2().
Так как Show1() не вызывает диалоговых окон в модальном режиме, окно превью будет отображено на экране, и тут же "следующий оператор или команда;"
получат управление, выполнятся и программа отработает. Окно из Show1() не закрыто, но все операторы уже выполнены, программа отработала и консольное приложение завершается при открытых в другом потоке окнах Windows Forms. В этом и состоит причина исключений, которые у Вас имели место.

Спасибо.