Как динамически установить поле изображения отчета Telerik на основе переданного параметра

Я создаю отчет Telerik в приложении MVC. Отчет обрабатывается прямо в формате pdf, без использования файла Report Viewer. Я думаю, что правильно передаю параметр из контроллера, но я не могу понять, как и где получить значение параметра в коде отчета, когда отчет обрабатывается. Я хочу динамически заполнять поле изображения в зависимости от значения переданного параметра с помощью User Function.

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

 public ActionResult PrintPoReport()
    {
        byte[] contents;
        Telerik.Reporting.Processing.RenderingResult result;

        using (var reportDocument = new LogisticsReports.Report1())
        {
            var buyerID = "999999";  //hard code buyerId for testing
            var irs = new InstanceReportSource();
            irs.ReportDocument = reportDocument;

            irs.Parameters.Add(new Parameter("Buyer", "buyerID")); // parameter to determine which jpg will populate picture box. **Never gets to Report1** 
            Telerik.Reporting.Processing.ReportProcessor rp = new Telerik.Reporting.Processing.ReportProcessor();
            result = rp.RenderReport("PDF", irs, null);
            contents = result.DocumentBytes;
        }

        return File(contents, "application/pdf", "P0 #" + id + ".pdf");
    }

Код для отчета:

public partial class Report1 : Telerik.Reporting.Report
{
    public Report1()
    {

        InitializeComponent();

        var buyer = "999999"; //hard coded for testing...this works!
        //Need to capture the passed in parameter here
        if (buyer == "111111"){

            this.pictureBox1.Value = "http://www.arctecalaska.com/images/signatures/111111.bmp";
        }
        if (buyer == "999999")
        {

            this.pictureBox1.Value = "http://www.arctecalaska.com/images/signatures/Ike.jpg";
        }


     }
   }
}

Проблема в том, что параметр покупателя, который я отправляю из контроллера, на самом деле никогда не попадает в отчет. Во время отладки отчет InitializeComponent() запускается, как только код достигает строки:

var reportDocument = new LogisticsReports.Report1 

Мне нужно иметь возможность захватывать и оценивать переданный параметр до того, как отчет будет отображаться, но я не понимаю, как это сделать. Есть идеи?


person Alan Fisher    schedule 07.11.2013    source источник


Ответы (1)


Fianlly понял это. Код контроллера в порядке (за исключением того, что параметр должен быть определен динамически, а не жестко закодирован, как в моем примере).

В отчете должен быть параметр, в данном случае он называется «Покупатель».

picturebox.value в отчете Telerik будет функцией пользователя, которая вернет URL-адрес изображения. Вызов функции передаст ей параметр hte report следующим образом:

=MyNameSpace.Report1.ResolveURL(Parameters.Buyer.Value)

Пользовательская функция будет жить в программном коде отчета. Вот пример, который я получил для работы:

  public partial class Report1 : Telerik.Reporting.Report
{
    public Report1()    {

             InitializeComponent();
     }

    public static string ResolveUrl(string paramValue)
    {

        string imagePath = "";

        if (paramValue == "111111")
        {
            imagePath = "http://www.arctecalaska.com/images/signatures/111111.jpg";

        }
            if (paramValue == "999999")

                    {
            imagePath = "http://www.arctecalaska.com/images/signatures/999999.jpg";

        }

        return (imagePath);
      }
   }
}

Если изображение будет поступать откуда-то, кроме URL-адреса, например, из файловой системы, вам придется изменить тип вывода пользовательской функции и изменить код. Например, если изображения были загружены на диск C:, вы должны изменить эту функцию, чтобы она выглядела следующим образом:

public class Report1 : Telerik.Reporting.Report
{
 public Report1()    {

         InitializeComponent();
 }
public static System.Drawing.Image ResolveUrl(string paramValue)
{
   if(paramValue=="111111")
    {
        return System.Drawing.Image.FromFile("C:\\111111.jpg");
    }
     else
    {
         return System.Drawing.Image.FromFile("C:\\888888.jpg");
    }
}

} 
person Alan Fisher    schedule 09.11.2013