Загружать изображение в ReportView динамически

Меня зовут Эд, и мне нужно загрузить изображение из ReportView dinamic. Как я могу это сделать? Я работаю с формами Windows, С# 3.0 и linq to sql, мне нужно загрузить изображение в динамические отчеты.

Спасибо.


person user95542    schedule 24.04.2009    source источник
comment
Ваш вопрос ужасно отформатирован. Почему ты поместил все это в теги кода?   -  person Matthew Talbert    schedule 02.02.2010


Ответы (3)


Я предполагаю, что вы используете компонент Microsoft Report Viewer из C# и хотите динамически добавлять изображение в отчет.

Это, безусловно, возможно, вам нужно создать класс со свойством byte[], которое представляет сериализованное растровое изображение.

class ReportImage {
    public byte[] Image {get;set;}

    // Other stuff here if you want...
}

Установите свойство этого объекта как 24-битную сериализованную версию вашего растрового изображения на пиксель (т. е. сохраните растровое изображение в MemoryStream, затем вызовите MemoryStream.ToArray()). Вы должны использовать 24 бита на пиксель, а формат, который вы сохраняете должен, должен быть BMP, похоже, это требуется в средстве просмотра отчетов.

Затем вы можете выполнить привязку к источнику данных объекта (см. Документацию MSDN для получения подробной информации о привязке к объектам см. также пример здесь). Используйте элемент Изображение, чтобы отобразить свое изображение в отчете.

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

person Peter Tate    schedule 05.05.2009

Этот ответ очень полезен (из-за него у меня в отчете не было маленьких полей с «битым изображением»), но он немного вводит в заблуждение. .

Строго говоря, НЕ требуется, чтобы «изображение» (которое на самом деле является массивом байтов) было в формате BMP. В тестовом проекте мне удалось прочитать jpeg-файлы с диска (т. е. File.ReadAllBytes(filename); ) и добавить полученные массивы байтов в свойство byte[] в списке «rptrow» (где rptrow — это объект, представляющий все данные для одной строки в таблице отчета). Для изображений в отчете для параметра MIMEType установлено значение «image/jpeg», а для свойства «Источник» установлено значение «База данных». Я также заметил, что не имело значения, какой MIMEType я использовал, если что-то было указано (т.е. не пустое).

Я торопился, поэтому даже не подумал проверить утверждение, что это должно быть изображение с разрешением 24 бита на пиксель.

Упрощенный rptobj:

public class rptobj
{
    public string FileName { get; set; }
    public byte[] Photo { get; set; }

    private List<rptobj> photos;
    public List<rptobj> GetList()
    {
        if (photos == null)
        {
            photos = LoadPhotos();
        }
        return photos;
    }

    private List<rptobj> LoadPhotos()
    {
        var rslt = new List<rptobj>();
        byte[] rawData;
        var path = HttpContext.Current.Server.MapPath(@"~\images");

        DirectoryInfo di = new DirectoryInfo(path);
        FileSystemInfo[] fis = di.GetFileSystemInfos("*.jpg");

        foreach(var fi in fis){
            rawData = File.ReadAllBytes(string.Format(@"{0}\{1}", path, fi.Name ));
            rslt.Add(new rptobj() { Photo = rawData, FileName = fi.Name });
        }
        return rslt;
    }
}
person Randy Kreisel    schedule 28.07.2010

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

Однако, если вы уверены, что хотите это сделать, вы можете попытаться динамически создать файлы RDLC. Если вы создаете файлы RDLC динамически, вы можете динамически добавлять изображения в отчеты.

Пример кода динамического создания файлов RDLC можно найти здесь.

person jgallant    schedule 05.05.2009
comment
Этот ответ просто неверен. Как показывает ответ Питера Тейта, это можно сделать. - person Matthew Talbert; 02.02.2010
comment
Спасибо, что указали на это, Мэтью. Я также исправил исходный пост для вас. - person jgallant; 02.02.2010