w00*_*w00 2 asp.net reportviewer2008 reportviewer
我在ReportViewer
控件中显示远程报告.报告加载了一些默认参数.到目前为止一切都很好.
但是,当我更改几个输入值并点击时View Report
,报告只显示具有默认值的数据.我在输入字段中更改的参数也会重置.
我拥有的所有代码都是这样的:
<rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana"
Font-Size="8pt" Height="642px" ProcessingMode="Remote" Width="100%">
<ServerReport ReportPath="http://server.com/Product/Dashboards/test.rdl"
ReportServerUrl="http://server.com/ReportServer" />
</rsweb:ReportViewer>
Run Code Online (Sandbox Code Playgroud)
该代码隐藏基本上是空的.它现在所有的都是空的Page_Load
.
这就是我的全部代码.
但感觉就像一个ViewState问题?但我不知道在哪里看.
当我按下View Report
按钮时,任何人都知道为什么参数会被重新调整?
我通过在Code Behind中设置参数来解决这个问题.因此,当提交报告时,我将获得所有输入的数据,将其放入ReportParameters
集合中.
但不幸的是,这并不像人们想象的那么容易和直接.起初你可能认为它存储在:YourReport.ServerReport.GetParameters()
.但事实并非如此!
要从报告中获取提交的值,您可以使用以下代码:
public ReportParameter[] GetCurrentParameters(Microsoft.Reporting.WebForms.ReportViewer viewer)
{
Control params1Area = FindParametersArea(viewer);
List<ReportParameter> params1 = new List<ReportParameter>();
FindParameters(params1Area, params1);
return params1.ToArray();
}
private Control FindParametersArea(Microsoft.Reporting.WebForms.ReportViewer viewer)
{
foreach (Control child in viewer.Controls)
{
if (child.GetType().Name == "ParametersArea")
return child;
}
return null;
}
private void FindParameters(Control parent, List<ReportParameter> params1)
{
Type _ParameterControlType = System.Reflection.Assembly.GetAssembly(typeof(Microsoft.Reporting.WebForms.ReportViewer)).GetType("Microsoft.Reporting.WebForms.BaseParameterInputControl");
ReportParameter param;
Microsoft.Reporting.WebForms.ReportParameterInfo paramInfo;
String[] paramValues;
foreach (Control child in parent.Controls)
{
if (_ParameterControlType.IsAssignableFrom(child.GetType()))
{
paramInfo = (Microsoft.Reporting.WebForms.ReportParameterInfo)GetPropertyValue(child, "ReportParameter");
if (paramInfo == null)
continue;
paramValues = (string[])GetPropertyValue(child, "CurrentValue");
if (paramValues != null && paramValues.Length > 0)
{
param = new ReportParameter();
param.Name = paramInfo.Name;
param.Values.AddRange(paramValues);
params1.Add(param);
}
}
FindParameters(child, params1);
}
}
public object GetPropertyValue(object target, string propertyName)
{
return target.GetType().GetProperty(propertyName, System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public).GetValue(target, null);
}
Run Code Online (Sandbox Code Playgroud)
来源:http://forums.asp.net/t/1057747.aspx/1(也是Visual Basic示例)
您只需使用以下代码行即可调用这些方法.例如,if(IsPostBack)
在您的范围内Page_Load
.
ReportParameter[] reportParameters = GetCurrentParameters(ReportViewer1);
Run Code Online (Sandbox Code Playgroud)
如果您还有自定义文本字段,则可以覆盖提交的值.您可以轻松地这样做:
reportParameters[4] = new ReportParameter("year", "2013", true);
Run Code Online (Sandbox Code Playgroud)
你显然必须知道在索引处存储了什么param 4
.但您也可以创建一个简单的查找功能,搜索reportParameter
具有特定名称的功能.所以在我的情况下year
.
protected void ChangeParameterValue(String name, String newValue, ref ReportParameter[] parameters)
{
foreach (ReportParameter param in parameters)
{
if (String.Equals(param.Name, name))
{
param.Values[0] = newValue;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你这样使用它:
ChangeParameterValue("year", "2013", ref reportParameters);
Run Code Online (Sandbox Code Playgroud)
这样您就不必担心index
放置某个参数.
归档时间: |
|
查看次数: |
1742 次 |
最近记录: |