Winforms ReportViewer и открыть после экспорта - PullRequest
2 голосов
/ 04 октября 2011

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

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Я нашел решение для этого.@KreepN, я встречал похожие решения с вашими в Интернете на различных форумах, однако нашел другое решение, которое лучше подходит для того, что я искал.Это обеспечивает все функции по умолчанию для экспорта.Вот что я сделал:

Сначала подпишитесь на событие ReportExport при создании формы.

this.reportViewer1.ReportExport += new ExportEventHandler(this.ReportViewer1_ReportExport);

Вот мой метод обработки событий ReportExport:

private void ReportViewer1_ReportExport(object sender, ReportExportEventArgs e)
{
    e.Cancel = true;

    string extension = this.GetRenderingExtension(e.Extension);

    SaveFileDialog saveFileDialog = new SaveFileDialog()
    {
        Title = "Save As",
        CheckPathExists = true,
        InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
        Filter = e.Extension.LocalizedName + " (*" + extension + ")|*" + extension + "|All files(*.*)|*.*",
        FilterIndex = 0
    };

    if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
    {
        this.reportViewer1.ExportDialog(e.Extension, e.DeviceInfo, saveFileDialog.FileName);

        // Here's where I call my method to prompt user to open the file.
        RadExportHelper.OpenFileWithPrompt(saveFileDialog.FileName);                
    }
}

RenderingExtensionКласс публично не раскрывает фактические расширения файлов, которые экспортируются, поэтому я создал этот метод:

private string GetRenderingExtension(RenderingExtension extension)
{
    switch (extension.Name)
    {
        case "PDF":
            return ".pdf";
        case "CSV":
            return ".csv";
        case "EXCEL":
            return ".xls";
        case "MHTML":
            return ".mhtml";
        case "IMAGE":
            return ".tif";
        case "XML":
            return ".xml";
        case "WORD":
            return ".doc";
        case "HTML4.0":
            return ".html";
        case "NULL":
            throw new NotImplementedException("Extension not implemented.");
    }

    throw new NotImplementedException("Extension not implemented.");
}

Наконец, вот мой вспомогательный метод для запроса пользователя и открытия файла, если они выбирают:

public static void OpenFileWithPrompt(string file)
{
    if (RadMessageBox.Show(
        Resources.RadHelper_OpenExportedDataMessage,
        Resources.RadHelper_OpenExportedDataTitle,
        MessageBoxButtons.YesNo,
        RadMessageIcon.Question,
        MessageBoxDefaultButton.Button1) == DialogResult.Yes)
    {
        Process.Start(file);
    }
}
1 голос
/ 04 октября 2011

Согласно различным публикациям и ресурсам { 1 , 2 , 3 }, то, что вы пытаетесь достичь, не является встроенной функциональностью элемент управления ReportViewer в Visual Studio.

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

Примечание: custNmbr - это переменная, которая используется для именования отчета после клиента, для которого он был запущен. Вы можете удалить это, если хотите (так как это мой параметр отчета), или сделать его динамическим с помощью собственного кода, чтобы файлы не перезаписывали друг друга.

    public static void reportWriter(ReportViewer reportViewer1, string custNmbr)
    {
        Warning[] warnings;
        string[] streamids;
        string mimeType;
        string encoding;
        string filenameExtension;

        string Dpath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + custNmbr + ".xls";    

        byte[] bytes = reportViewer1.LocalReport.Render(
            "Excel", null, out mimeType, out encoding, out filenameExtension,
            out streamids, out warnings);

        using (FileStream fs = new FileStream(Dpath, FileMode.Create))
        {
            fs.Write(bytes, 0, bytes.Length);
        }
    }

Поскольку Dpath будет местоположением этого недавно экспортированного файла, вы можете просто добавить ссылку на Excel Interop и вызвать excel / новый файл через:

Application excel = new Application();
Workbook wb = excel.Workbooks.Open(Dpath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...