Страница 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
Спасибо.