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

StiViewerControl на вкладках

Добавлено: 22 май 2012, 12:43
Леонид
День добрый, уважаемые!

Есть TabControl, в нём может быть N вкладок (чтобы была возможность открывать сразу несколько отчётов).
Возникла необходимость добавлять (динамически, из кода) контрол StiViewerControl на отдельную вкладку в TabControl'е.
Изучив форум и покопавшись в коде такой возможности не нашёл.
Возможно ли это вообще или придётся делать MDI-форму, а в ней кучу форм вместе tab'ов?

StiViewerControl на вкладках

Добавлено: 23 май 2012, 05:32
VitalyV
А что Вы используете, WinForms или WPF?
Если WPF, то есть такой контрол - ContentPresenter.
В него можно динамически класть любой контрол.

StiViewerControl на вкладках

Добавлено: 23 май 2012, 05:56
Леонид
Нет, на данный момент используем WinForms.

StiViewerControl на вкладках

Добавлено: 23 май 2012, 11:32
HighAley
Здравствуйте.

С какими трудностями вы столкнулись при реализации вашего проекта?
Вы можете добавить StiViewerControl на TabPage. С этим не должно возникнуть никаких проблем.

Спасибо.

StiViewerControl на вкладках

Добавлено: 24 май 2012, 08:54
Леонид
Приведу более подробное описание в виде кусков кода, которые я использую в процедурах.

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

        // report objects declaration
        StiReport stiReport;
        StiViewerControl stiPreview;

        // get report body (if it exists)
        MemoryStream reportBody = GetReportBody();

        // create report object
        stiReport = new StiReport();

        // load report from prepared stream (if it's null, then create new one)
        if (reportBody != null)
          stiReport.Load(reportBody);

        // set the name of the report for the stimul object caption
        stiReport.ReportName = reportName;

        // create preview object //
        stiPreview = new StiViewerControl();
        stiPreview.Dock = DockStyle.Fill; // fill up the form

        // assign report object to preview control //
        stiPreview.Report = stiReport;

        // create new page
        XtraTabPage newPage = new XtraTabPage();
        newPage.Text = reportName; // new name or an existing one

        // add page
        tcDesign.TabPages.Add(newPage); // add page to the tab pages collection
        tcDesign.SelectedTabPage = newPage; // make new page active

        // add preview control to the page
        newPage.Controls.Add(stiPreview); <- да, он добавляет preview control на вкладку, но отчёта там нет; если после этого вызвать метод stiPreview.Report.Design(), то последний создаст модальную форму с загруженным отчётом, а не будет показывать отчёт в этом preview control'е.


StiViewerControl на вкладках

Добавлено: 25 май 2012, 07:48
HighAley
Здраувствуйте.

В данном случае отчёт не рендерится. Это надо делать принудительно.
Добавьте следующую строку в ваш код:

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

stiReport.Render();
Данный код можно добавлять как перед

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

stiPreview.Report = stiReport;
или

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

newPage.Controls.Add(stiPreview);
так и после последнего.

Спасибо.

StiViewerControl на вкладках

Добавлено: 25 май 2012, 08:48
Леонид
Да, stiReport.Render() работает, а вот почему stiReport.Design(false) вызывает модальную форму мне не понятно.
То есть основная цель - именно редактировать отчёты, а рендерить их не сразу, а только по необходимости.
Как это сделать? Понятно, что есть перегруженные методы для stiReport.Design, но они для формы, а у меня вкладка, поэтому проблемка.

StiViewerControl на вкладках

Добавлено: 28 май 2012, 07:01
HighAley
Здравствуйте.
leon писал(а):Да, stiReport.Render() работает, а вот почему stiReport.Design(false) вызывает модальную форму мне не понятно.
То есть основная цель - именно редактировать отчёты, а рендерить их не сразу, а только по необходимости.
Как это сделать? Понятно, что есть перегруженные методы для stiReport.Design, но они для формы, а у меня вкладка, поэтому проблемка.
stiReport.Design(false) вызвыает создаёт дизайнер в новом окне.
Есдли вы хотите вызвать StiDesignerControl, то вам надо присвоить отчёт его свойству Report.

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

designerControl1.Report = report;
Смотрите наш пример проекта Designer_SaveLoad, который поставляется вместе с нашим продуктом.

Спасибо.

StiViewerControl на вкладках

Добавлено: 28 май 2012, 07:21
Леонид
Супер! Всё получилось, огромное спасибо! :biggrin:

StiViewerControl на вкладках

Добавлено: 28 май 2012, 08:35
Andrew
Всегда рады помочь Вам!