[英]How do I use a generic class without specifying its type parameters in C#?
[英]C#/ReportViewer: How to use parameters without specifying parameter names
我正在使用 C# 解决方案,该解决方案使用 ReportViewer 控件访问我们的 SSRS 服务器报告。
有人问我是否可以以未指定参数名称的方式对解决方案进行编码。 老实说,我不确定如何问这个问题。
目前该解决方案被少数报告使用,因此硬编码参数名称很简单,这些参数是查询字符串参数。
该解决方案从 web.config 文件中获取服务器 URL:
// Add the Reporting Server URL
rvSiteMapping.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportServerUrl"].ToString());
该解决方案从名为 = ReportPath 的查询字符串参数中获取报表路径,并分配给名为 ReportPath 的报表查看器报表路径属性:
//Add the Report Path
rvSiteMapping.ServerReport.ReportPath = Request.QueryString["ReportPath"];
这两个应该保持这样。
我需要改变的是以下内容:
第一个报告采用一个名为 MeetingID 的参数,第二个报告采用一个名为 RecordID 的参数,第三个报告采用一个包含 3 个参数的数组(每个参数可选)
我为每个报告指定每个参数的名称。 我在问是否有办法实现相同但不必指定参数名称,因此该解决方案可用于任何报告。 我们的报告采用 1 到最多 5 个参数。
这是我当前的代码,请不要对我苛刻,我正在学习如何使用此解决方案。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
rvSiteMapping.Height = Unit.Pixel(Convert.ToInt32(700));
rvSiteMapping.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
rvSiteMapping.ShowCredentialPrompts = false;
if (ConfigurationManager.AppSettings["UseCredentials"].ToString().ToUpper() == "TRUE")
{
rvSiteMapping.ServerReport.ReportServerCredentials = new ReportCredential(
ConfigurationManager.AppSettings["UserName"].ToString(),
ConfigurationManager.AppSettings["UserPassword"].ToString(),
ConfigurationManager.AppSettings["UserNameDomain"].ToString()
);
}
// Add the Reporting Server URL
rvSiteMapping.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportServerUrl"].ToString());
//Add the Report Path
rvSiteMapping.ServerReport.ReportPath = Request.QueryString["ReportPath"];
if (Request.QueryString["MeetingID"] != null)
{
Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[1];
parameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("MeetingID", Request.QueryString["MeetingID"]);
rvSiteMapping.ServerReport.SetParameters(parameters);
}
else if (Request.QueryString["RecordID"] != null)
{
Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[1];
parameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("RecordID", Request.QueryString["RecordID"]);
rvSiteMapping.ServerReport.SetParameters(parameters);
}
else if (Request.QueryString.Count > 2)
{
Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[3];
parameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("StreetNumber", Request.QueryString["StreetNumber"]);
parameters[1] = new Microsoft.Reporting.WebForms.ReportParameter("StreetName", Request.QueryString["StreetName"]);
parameters[2] = new Microsoft.Reporting.WebForms.ReportParameter("District", Request.QueryString["District"]);
rvSiteMapping.ServerReport.SetParameters(parameters);
}
rvSiteMapping.ServerReport.Refresh();
}
catch (Exception ex)
{
Console.WriteLine("General exception. {0}", ex.Message);
}
}
}
提前感谢您提供的任何帮助或您可能愿意并愿意分享的想法。
伊拉斯莫
Request.QueryString
只是一个集合,因此您可以很容易地使参数通用。 我没有 IDE 手头,所以我的语法可能不是 100% 正确 - 但一般的想法是。
// see if we have any query string parameters
if (Request.QueryString.Count > 0) {
// create the report parameters of the same length
Microsoft.Reporting.WebForms.ReportParameter[] p =
new Microsoft.Reporting.WebForms.ReportParameter[Request.QueryString.Count];
// loop over the query string and use the index to build your report params based on the key/value
for (int idx = 0; idx < Request.QueryString.Count; idx++) {
p[idx] = new Microsoft.Reporting.WebForms.ReportParameter(
Request.QueryString.GetKey(idx),
Request.QueryString.Get(idx)
);
}
// set your report parameters on your server report
rvSiteMapping.ServerReport.SetParameters(parameters);
}
这样您就可以处理任何给定的参数,而无需事先知道参数名称。
正在看这样的东西吗?
Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[Request.QueryString.Count];
int i = 0;
foreach(var val in Request.QueryString)
{
parameters[i++]=val;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.