有没有办法在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名称空间中有模拟控件?
答案 0 :(得分:9)
不幸的是,无法自定义Web报表查看器工具栏。通过查看反汇编代码,您可以看到使用的ToolbarControl是一个自定义密码类,它是一个内部密封类,您只能隐藏或显示工具栏。
但是,您可以隐藏工具栏并创建自己的工具栏,实现与现有工具栏和您自己的控件相同的功能。
这是Microsoft建议的路线。
如果您想要一个不同的工具栏实现,您可以创建一个 自定义工具栏替换默认工具栏。
可在以下网址找到:http://msdn.microsoft.com/en-us/library/ms251670.aspx
我要做的是反汇编代码并再次重新实现它作为一个公共类,所有的子类从我第一眼看起来似乎没有太复杂或难以做到。
还可以通过使用 jquery 等工具或仅 DOM api编辑DOM来在前端添加它。下面的Web开发人员帖子演示了如何做到这一点。请记住含义,如果您希望将服务器端控件添加到工具栏,则需要确保不会使视图状态无效并且它们正常工作。
请参阅asp.net论坛上的以下帖子,了解类似的问题。
有用的反汇编工具。
希望这有帮助
答案 1 :(得分:4)
<强> 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>