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

Передача параметров в Report

Добавлено: 30 окт 2007, 14:04
Voyager
Здравствуйте!

Интересует решение задачи - как можно передать параметр в отчет из внешней формы (запрос отчетом параметров)? Т. е. есть форма например с edit'ами, в которые заносятся значения параметров, можно ли как-то перед показом отчета заполнить его параметры извне, как-то запросив их в коде отчета в конструкторе:

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

    public class Отчет : Stimulsoft.Report.StiReport
    {       
        public Отчет()
        {
            this.InitializeComponent();
            FillParams(); // <--- интересует вызов параметров какой-то функцией или через интерфейс
            // this.DataSources[0].Parameters["@Param1"].ParameterValue = 0; <--- изнутри присвоение параметров работает
        }
Т.е. как достучаться до данных вне отчета (что-то типа callback функции) если это возможно?

Про

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

Report.Compile();
Report.CompiledReport.DataSources[0].Parameters["@Param1"].ParameterValue = 0;
Report.Render(false);
Report.Show();
в коде формы знаю. :)

Смотрел http://www.stimulsoft.com/livedemos/Rep ... ction.html, но так я понимаю можно только static методы вызывать, а из них значение параметров из формы не получить простым способом.

Спасибо.

Передача параметров в Report

Добавлено: 31 окт 2007, 07:25
Voyager
Или как можно из отчета достучаться до формы, на которой лежит компонент Report?

Передача параметров в Report

Добавлено: 01 ноя 2007, 10:22
Vital
Можно обойтись без статических методов. Создайте переменную типа object. Перед построением присвойте этой переменной нужный обеъкт. Затем в событии BeginRender (это событие вызывается до получения данных) преобразуйте объект из переменной в нужный класс и через него Вы сможете выполнить необходимые действия. Также можно просто создать в классе public field. Но в этом случае приедтся добираться до него при помощи рефлексии.

Спасибо.

Передача параметров в Report

Добавлено: 01 ноя 2007, 13:47
Voyager
А кроме способа с переменными, можно передать экземпляр класса через Report.RegData("MyClass", myClass) и получить к нему доступ из кода отчета? Или только так через переменные?

Спасибо.

Передача параметров в Report

Добавлено: 01 ноя 2007, 14:17
Pavel
Можно. В этом случае ваш класс будет воспринят как бизнесс объект.

Спасибо.

Передача параметров в Report

Добавлено: 02 ноя 2007, 04:35
Voyager
1) А как в таком случае можно вызвать методы этого зарегистрированного экземпляра класса myClass из кода отчета/привести бизнесс объект к определенному типу (MyClass)? Также пока не получилось чтобы заработало

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

MyClass myClass = new MyClass();
Report.RegData("MyClass", myClass);
, запускаю дизайнер или отчет, долго думает и ни дизайнер, ни отчет, не запускается. С простыми типами int, string, DataTable работает. Как правильно сделать регистрацию экземпляра своего класса?
2)
Перед построением присвойте этой переменной нужный обеъкт.
Перед запуском отчета

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

Report.Compile();
Report["MyVar"] = myClass;
Report.Render(false);
Report.Show();
так работает, а как присвоить значение переменной перед вызовом дизайнера отчета (т.е. до Report.Design();), чтобы при предварительном просмотре также вызывались методы myClass как и при запуске отчета?
Пробую так:
Report.Dictionary.Variables["MyVar"].ValueObject = myClass;
Report.Design();
Но он в коде как я понимаю сериализуется и переводится в строку.
Спасибо.

Передача параметров в Report

Добавлено: 02 ноя 2007, 13:06
Edward
Пришлите, пожалуйста, тестовый проект на support[at]stimulsoft[dot]com для анализа.

Спасибо.

Передача параметров в Report

Добавлено: 03 ноя 2007, 15:21
Voyager
Тестовый пример отправлен на support[at]stimulsoft[dot]com.

Передача параметров в Report

Добавлено: 07 ноя 2007, 11:20
Voyager
За 4 дня так и не получил ответа что именно мне нужно сделать для того чтобы решить проблему с получением параметров в дизайнере отчета из внешней формы.

Есть отчет, в нем переменная FormParent типа object. При запуске отчета (в BtnRun_Click) присваиваю переменной значение FormParent и из отчета запрашиваю значение параметра в BeginRender отчета (привожу переменную FormParent к IReportParams):

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

IReportParams F = (IReportParams)FormParent;
T1 = (string)F.GetData("param1");
T2 = (string)F.GetData("param2");
MessageBox.Show((string)F.GetData("param1"));
При запуске отчета этот механизм работает (методы вызываются, параметры передаются запрашиваются из отчета). Но в дизайнере не работает. Что мне нужно написать перед Report.Design(); в методе BtnDesign_Click (т.е. как присвоить значение переменной FormParent наподобие Report["FormParent"] = this) для того, чтобы в дизайнере отчета вызывались методы формы также как и при запуске? Какие есть решения?
Сборка в ReferencedAssemblies зарегистрирована.

Код формы:

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

public partial class Form1 : Form, IReportParams
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void BtnDesign_Click(object sender, EventArgs e)
        {
            Report.Load("..\\..\\Report.mrt");
            // не удается привести FormParent к нужному типу чтобы в дизайнере
            // при предпросмотре отчета вызывался метод GetData формы
            //Report["FormParent"] = this;
            //Report.Dictionary.Variables["FormParent"].ValueObject = this;
            Report.Design();
        }

        private void BtnRun_Click(object sender, EventArgs e)
        {
            // в режиме запуска все работает
            Report.Load("..\\..\\Report.mrt");
            Report.Compile();
            Report["FormParent"] = this; // присвоение переменной экземпляра IReportParams
            Report.Render(false);
            Report.Show();
        }

        public object GetData(string name) // invokes from BeginRenderEvent
        {
            if (name == "param1")
                return "Hello from form!";
            if (name == "param2")
                return "IReportParams.GetData does not work in report designer!";
            return null;
        }
    }
Интерфейс IReportParams:

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

    public interface IReportParams
    {
        object GetData(string name);
    }
Пример (исходники):
http://voyager.alfamoon.com/TestVariables.zip

Спасибо.

Передача параметров в Report

Добавлено: 07 ноя 2007, 13:47
Vital
Этого сделать не получиться, т.к. отчет для которого вызывается дизайнер является всего лишь шаблоном отчета. В момент просмотра отчета в дизайнере, на основе шаблона отчета будет сгенерирован новый отчет, который и будет отображен. В данном случае есть два варианта решения:

1. Использовать статическую переменную.
2. Использовать одно из глобальных событий StiOptions.Engine.GlobalEvents

Спасибо.