Microsoft.Reporting.WebForms.ReportViewer控件在ToolBar中添加自定义控件

时间:2013-03-07 13:25:35

标签: c# asp.net inheritance webforms reportviewer

有没有办法在Microsoft.Reporting.WebForms.ReportViewer控件中添加自定义控件。
我正在开发ASP.NET Web应用程序,我想在reportviewer的toolBar中添加我的自定义控件。

阅读此blogspot看起来在WinForms中是可行的。

所以我开始编写自己的RerpotViewerClass来继承ReportViewer,并在开始时堆叠。 看起来我无法覆盖WebForms上的OnControlAdded方法?
Shod我然后使用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和Toolstrip,因为它们属于命名空间System.Windows.Forms。
我应该参考WinForms还是Web名称空间中有模拟控件?

2 个答案:

答案 0 :(得分:9)

不幸的是,无法自定义Web报表查看器工具栏。通过查看反汇编代码,您可以看到使用的ToolbarControl是一个自定义密码类,它是一个内部密封类,您只能隐藏或显示工具栏。

但是,您可以隐藏工具栏并创建自己的工具栏,实现与现有工具栏和您自己的控件相同的功能。

这是Microsoft建议的路线。

  

如果您想要一个不同的工具栏实现,您可以创建一个   自定义工具栏替换默认工具栏。

可在以下网址找到:http://msdn.microsoft.com/en-us/library/ms251670.aspx

我要做的是反汇编代码并再次重新实现它作为一个公共类,所有的子类从我第一眼看起来似乎没有太复杂或难以做到。

还可以通过使用 jquery 等工具或仅 DOM api编辑DOM来在前端添加它。下面的Web开发人员帖子演示了如何做到这一点。请记住含义,如果您希望将服务器端控件添加到工具栏,则需要确保不会使视图状态无效并且它们正常工作。

请参阅asp.net论坛上的以下帖子,了解类似的问题。

有用的反汇编工具。

希望这有帮助

答案 1 :(得分:4)

enter image description here

<强> Default.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>