Настройка источника изображения в отчете RDLC динамически

Я использую возможности отчетности на стороне клиента, которые входят в состав Visual Studio 2010. У меня есть файл RDLC, определенный в настоящее время со встроенными изображениями для целей брендинга в верхней части отчета. Изображение является логотипом для пользовательской компании. Он не имеет ничего общего с данными отчета... это просто заголовок.

Я хотел бы иметь возможность нарушить зависимость от встраивания изображений, так как я начинаю масштабировать приложение. Вместо этого я хотел бы иметь возможность динамически устанавливать изображение. К сожалению, нет типа параметра, который, кажется, поддерживает это.

Я рассмотрел возможность переключения источника из встроенного в внешний и, возможно, испускающего файл изображения логотипа при запуске программы (логотип встроен в качестве ресурсов в отдельную сборку), а затем ссылается на него как на универсальное имя файл для источника. Я не уверен, насколько мне нравится этот вариант, поскольку он кажется взломанным. Я также получаю сообщение об ошибке при тестировании явно заданных путей, эффективно говоря, что объект не установлен в экземпляр. Например, я даже пытался установить его в D:\test.jpg и получил эту ошибку во время разработки... поэтому я больше не хочу попробовать этот вариант.

Я также посмотрел на вызов класса в ссылочной сборке из файла RDLC, но я не могу заставить его работать. Похоже, я могу ссылаться на сборку, а затем вызывать через специальный объект с именем Code. Поскольку мой класс статичен, он должен быть Code.className.method, но это не работает.

Я также рассмотрел возможность разбить заголовок в подзаголовок, но я все еще не думаю, что решил проблему зависимости. Это все равно потребует такого же обслуживания.

Я должен упомянуть, что я использую объекты в качестве источника данных. С какими вариантами я должен пойти? Мне что-то не хватает?

Ответ 1

Поскольку нет альтернативных (или любых!) мнений по этому вопросу, я продвинулся дальше и придумал рабочее решение.

Я выбираю создать файл по требованию логотипа, сохраняя его в временном расположении. Если файл не существует, я создаю его на лету. Если он существует, я просто ссылаюсь на изображение, которое существует.

В отчете RDLC я создал параметр Path of type Text. Затем, в свойствах для изображения, я изменил изображение логотипа из встроенного в внешний и установил "Использовать это изображение" в качестве параметра: [@Path].

Затем в коде я передаю путь к файлу как параметр Path. Но где я раньше ошибался, так это то, что путь должен быть URL-адресом, и я пытался передать местоположение на диске. Итак, эта часть должна выглядеть так:

        ReportParameter paramLogo = new ReportParameter();
        paramLogo.Name = "Path";
        paramLogo.Values.Add(@"file:///C:\Users\Mike\AppData\Local\Temp\Logo.png");
        reportViewer.LocalReport.SetParameters(paramLogo);

Я скажу, что документация MSDN может быть немного лучше. К их чести, есть много подробных документов о том, как добиться чего-то на более высоком уровне. Эта статья помогла. В нем четко сказано, что мне нужен URL-адрес пути, но было бы проще изучить это свойство непосредственно в библиотеке. Однако найти документацию более низкого уровня было труднее и менее плодотворным. Вот статья для объекта Reporting Image. Невозможно задать интересующие объекты.

Ответ 2

У меня была такая же проблема, однако принятое решение для меня не совсем сработало. Оказывается, мне нужно было установить EnableExternalImages значение true в дополнение к предоставлению пути в формате URI и настройке моего Image.Value на =Parameters!ReportLogo.Value.

report.EnableExternalImages = true;
ReportParameter[]  parameters = new ReportParameter[3];
...
Uri pathAsUri =  new Uri(_info.LogoPath);
parameters[2] = new ReportParameter("ReportLogo", pathAsUri.AbsoluteUri);
report.SetParameters(parameters);