3

ReportViewer 内のデフォルトのエクスポート ボタンを使用する場合、エクスポートされたレポートを開くようにユーザーに促すだけの方法はありますか? ReportExport イベントを確認しましたが、これはエクスポートが発生する前に発生します。考えられる唯一のことは、ReportExport をキャンセルして独自のエクスポート機能を作成することですが、これを行う必要がないことを願っています。エクスポートが発生した後に起動されていないイベントはありますか?

4

2 に答える 2

5

これに対する解決策を見つけました。@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);
    }
}
于 2011-10-04T20:58:49.543 に答える
1

さまざまな投稿やリソース {1、2、3} によると達成しよとしているのは、Visual Studio の ReportViewer コントロールの組み込み機能ではありません。

この機能が不可欠な場合は、レポート ビューアーのエクスポート ボタンを常に無効にして、ボタンまたはその他のコントロールを追加して、エクスポートを処理することができます。以下は、レポートの実行時に 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);

それが役立つことを願っています。

于 2011-10-04T18:51:58.963 に答える