7

Microsoft.Reporting.WebForms.ReportViewerコントロール内にカスタムコントロールを追加する方法はありますか?
ASP.NET Webアプリを開発していて、reportviewerのtoolBar内にカスタムコントロールを追加したいと思います。

このブログスポットを読むと、 WinFormsでそれが可能であるように見えます。

そこで、ReportViewerを継承する独自のRerpotViewerClassのコーディングを開始すると、開始時にスタックされます。WebFormsでOnControlAddedメソッドをオーバーライドできないように見えますか?
次に、OnLoad()またはその他を使用しますか?

   public class ReportViewerToolbarExtension : Microsoft.Reporting.WebForms.ReportViewer
    {
        protected override void OnControlAdded(ControlEventArgs e)
        {

                base.OnControlAdded(e);

        }        
    }

Raisseエラー

'Microsoft.Reporting.WebForms.ReportViewer' does not contain a definition for 'OnControlAdded'  

また、「ControlEventArgs」は私にとって悲惨な部分ですか?

SetToolStripItems(Control c)を実装しようとすると

ToolStripItemCollectionも、名前空間System.Windows.Formsに属しているため、Toolstripを使用できません。
WinFormsを参照する必要がありますか、それともWeb名前空間内にアナログコントロールがありますか?

4

2 に答える 2

9

残念ながら、Web レポート ビューアのツールバーをカスタマイズすることはできません。逆アセンブルされたコードを見ると、使用されている ToolbarControl がカスタムのものであり、内部でシールされたクラスであり、ツールバーを表示または非表示にすることしかできないことがわかります。

ただし、ツールバーを非表示にして、既存のものと同じ機能を実装する独自のツールバーと独自のコントロールを作成することは可能です。

これは、Microsoft が推奨するルートです。

別のツールバーの実装が必要な場合は、カスタム ツールバーを作成して既定のツールバーを置き換えることができます。

これは、http: //msdn.microsoft.com/en-us/library/ms251670.aspxにあります。

私がすることは、コードを逆アセンブルし、それをすべての子クラスを持つパブリック クラスとして再実装することです。一見したところ、複雑すぎたり難しすぎたりすることはないようです。

また、 jqueryDOM APIなどのツールを使用して DOM を編集することで、フロント エンドから追加することもできます。以下の Web 開発者の投稿は、その方法を示しています。サーバー側のコントロールをツールバーに追加する場合は、ビューステートを無効にせず、それらが正しく機能することを確認する必要があることに注意してください

同様の質問については、asp.net フォーラムでホストされている次の投稿を参照してください。

便利な分解ツール。

お役に立てれば

于 2013-03-09T15:57:33.250 に答える
4

ここに画像の説明を入力

デフォルト.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.9.1.min.js" type="text/javascript"></script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    <asp:ScriptManager runat="server" EnablePartialRendering="false">
    </asp:ScriptManager>
    <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="830px" Font-Names="Verdana" Font-Size="8pt" InteractiveDeviceInfos="(Коллекция)" WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt">
        <LocalReport ReportPath="Report.rdlc">
        </LocalReport>
    </rsweb:ReportViewer>
    <div id="container" class=" " style="display: inline-block; font-family: Verdana; font-size: 8pt; vertical-align: top;">
        <table cellpadding="0" cellspacing="0" style="display: inline;">
            <tbody>
                <tr>
                    <td height="28px">
                        <asp:DropDownList runat="server" ID="ComboBox1" OnSelectedIndexChanged="ComboBox1_SelectedIndexChanged" AutoPostBack="True">
                            <asp:ListItem>Option 1</asp:ListItem>
                            <asp:ListItem>Option 2</asp:ListItem>
                            <asp:ListItem>Option 3</asp:ListItem>
                        </asp:DropDownList>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <script type="text/javascript">
        $(document).ready(function () {
            $($('#ReportViewer1_fixedTable').find('td[colspan=3] div[id^="ReportViewer1"]')[1])
                    .find('div')
                    .first()
                    .append($('#container').detach());
        });
    </script>
    </form>
</body>
</html>

Default.aspx.cs

using System;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Label1.Text = ComboBox1.SelectedItem.Text;
    }
}

ExtJS または Ext.Net を使用する場合は、スクリプト ブロックを次のように置き換えます。

<script type="text/javascript">
    Ext.onReady(function () {
        Ext.get(Ext.query('#ReportViewer1 td[colspan=3] div[id^="ReportViewer1"]')[1]).last().appendChild(Ext.get(Ext.query('#container')));
    });
</script>
于 2013-03-14T14:29:14.077 に答える