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

Замена данных в richText

Добавлено: 19 апр 2019, 15:01
MarinaP
Добрый день.
Возникла ситуация, что в отчет надо вставлять текст договора, который хранится в базе преобразованный в varbinary из формата rtf. С самой вставкой проблем не возникло (RichText из DataColumn), все отлично вставилось.
Но возник вопрос, можно ли вставить в этот текст переменные, что бы они заполнились данными при построении отчета? В документации я нашла, что при вставке обычного rtf можно так сделать, но у меня при чтении из базы значение в {} не заменяется и остается обычным текстом.
Устанавливать свойство "Full Convert Expression" в true пробовала, не помогло.
В чем может быть проблема? И можно ли ее как-нибудь решить?

Re: Замена данных в richText

Добавлено: 22 апр 2019, 11:45
Aleksey
Здравствуйте,

Можете выслать простой пример для анализа?

Спасибо.

Re: Замена данных в richText

Добавлено: 22 апр 2019, 12:52
MarinaP
Добрый день.
Прикрепляю простой пример, в котором вывожу richtext из DataColumn и файл rtf, который был добавлен в базу через функцию, закомментированную во вкладке code (функция вызывалась из другой программы, но на всякий случай прикладываю ее текст).
Как я понимаю, по идее, {StartDT} и {EndDT} из rtf файла должны преобразоваться в значения соответствующих переменных, но этого не происходит.

Re: Замена данных в richText

Добавлено: 23 апр 2019, 17:00
Ivan
Здравствуйте.

Чтобы выражения внутри текста вычислялись, при компиляции отчёта выражения "выделяются" из текста, а потом уже при построении отчёта выражения высчитываются и текст "склеивается" опять.
Поэтому текст из базы данных не обрабатывается, а передаётся как есть.
Но есть вариант решения задачи с использованием парсера выражений, если выражения не содержат сложных конструкций языка C#.
В событии GetValue компонента RichText можно написать следующий код:

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

string st = System.Text.Encoding.ASCII.GetString( DataSource1.FileContent );
string st2 = Stimulsoft.Report.Engine.StiParser.ParseTextValue(StiRichText.PackRtf(st), sender as StiComponent) as string;
e.Value = System.Xml.XmlConvert.EncodeName(st2);
Но тут есть "подводные камни" со стороны формата RTF и его редакторов.
При редактировании RTF с помощью Word, WordPad или даже нашего встроенного редактора, в текст вставляются разнообразные управляющие команды, например переключение кодировки текста.
Поэтому если вам надо вставить в RichText какое-нибудь выражение, лучше сначала набрать его в простом текстовом редакторе, например Notepad++, а затем вставить его целиком в редакторе RichText.
При этом, если выражение будет содержать только английский текст - всё пройдет хорошо.
Но если в нём будут например русские буквы - редактор вставить свои управляющие коды прямо в выражение, и с большой вероятностью отчёт перестанет компилироваться вообще.

Например, если вы хотите вставить выражение {Replace(" район", "")}, то после редактора оно превращается в {Replace("\f0\lang1049 \'f0\'e0\'e9\'ee\'ed\f1\lang1033 ", "")}.
С точки зрения RichText отображается то же самое. Но команда замены уже работать естественно не будет, хотя отчёт ещё компилируется.
А если вы хотите вставить выражение {name_файла}, то после редактора оно превращается в {name_\'f4\'e0\'e9\'eb\'e0}, и перестаёт компилироваться.

В вашем случае вторая переменная вставилась правильно: "\{EndDT\}"
А вот первая видимо набиралась прямо в редакторе, и получилось "\{}{\rtlch\fcs1 \af1\afs24 \ltrch\fcs0 \f1\fs24\cf1\lang1049\langfe1049\langfenp1049\insrsid6960984 StartDT}{\rtlch\fcs1 \af1\afs24 \ltrch\fcs0 \f1\fs24\cf1\lang1049\langfe1049\langfenp1049\insrsid10504751\charrsid10504751 \}

Спасибо.

Re: Замена данных в richText

Добавлено: 24 апр 2019, 14:59
MarinaP
Добрый день.
Спасибо за подробный ответ. В целом, если записать необходимый текст сначала в файл notepad, а потом перенести в Word и добавить форматирование, все сработало корректно.
На всякий случай добавлю, что бы заработал код, записанный в событие GetValue надо убрать заполнение RichText из колонки данных (для меня это оказалось не очевидно и я не сразу поняла, почему ничего не поменялось).
Так же, при вставке выражения подобного "{name_файла}" у меня в целом отчет строился, но поле RichText было пустым и было сообщение об ошибке в Report Rendering Message с указанием выражения, которое не смог распарсить. Поэтому подскажите пожалуйста еще, можно ли как-то при построении отчета получить значение сообщений из Report Rendering Message и вывести их?

Re: Замена данных в richText

Добавлено: 25 апр 2019, 23:36
Ivan
Здравствуйте.

Эти сообщения записываются в свойство отчёта report.ReportRenderingMessages.
Если отчёт скомпилирован - то надо брать из report.CompiledReport.ReportRenderingMessages

Спасибо.

Re: Замена данных в richText

Добавлено: 06 май 2019, 08:41
MarinaP
Спасибо за ответ.
Подскажите пожалуйста еще, я попробовала файл, который добавляла в базу (и который после преобразования в GetValue корректно заменял все переменные на значения), добавить в ресурсы отчета и вывести его содержимое в компонент RichText. Но при этом значения переменных не заменились. "Full Convert Expression" установлен в True. Что надо поменять, что бы переменные заработали?

Re: Замена данных в richText

Добавлено: 08 май 2019, 18:04
Ivan
Здравствуйте,

Вышлите пожалуйста ваш пример для анализа.

Спасибо.

Re: Замена данных в richText

Добавлено: 13 май 2019, 08:24
MarinaP
Добрый день.
Прикладываю пример с загрузкой richText из ресурса. Этот же файл при загрузке в базу и последующей выгрузке в richText в виде колонки и добавлении события GetValue отрабатывался корректно.

Re: Замена данных в richText

Добавлено: 17 май 2019, 00:04
Ivan
Здравствуйте.

Как уже ранее говорилось, чтобы выражения внутри текста вычислялись, они преобразуются при компиляции отчёта.
Текст из базы данных и из файла не обрабатывается, а передаётся как есть.
Поэтому надо использовать скрипты, в данном случае для загрузки текста из ресурсов.
В событии GetValue компонента RichText надо написать следующий код:

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

string st = Stimulsoft.Report.Helpers.StiHyperlinkProcessor.GetString(this, "resource://DemoText");
string st2 = Stimulsoft.Report.Engine.StiParser.ParseTextValue(StiRichText.PackRtf(st), sender as StiComponent) as string;
e.Value = System.Xml.XmlConvert.EncodeName(st2);
Спасибо.