如何将多个参数传递给水晶报告?

时间:2011-12-19 10:47:55

标签: asp.net

我的asp.net Web应用程序中有一个水晶报告,它有很多报告参数(大约15个)。以前我使用查询字符串来传递它们,但这是不安全的。

现在我将所有参数映射到Hashtable,将它们存储在session&传递给报表查看器。现在,如果用户在不同的浏览器选项卡中打开多个报表实例,会话值就会搞乱。当我浏览页面时,会显示错误的报告。

  

请告诉我将参数传递给报告的好方法。

达明。

2 个答案:

答案 0 :(得分:1)

会话对象在同一浏览器的多个选项卡之间共享,因为服务器仅为浏览器存储一个会话cookie。因此,单个浏览器上的几个选项卡中的值会很明显。

可能的解决方案之一: 使用ViewStates而不是session来存储HashTable。

请参阅下面的代码进行演示,为简单起见,我使用的是ArrayList而不是HashTable。

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ViewState["ht"] = new ArrayList();
        //initialize viewstate with arraylist on first pageload.
    }

}
protected void btnAddElement_Click(object sender, EventArgs e)
{//adding new elements to the arraylist
    if (ViewState["ht"] != null)
    {
        ArrayList ht = (ArrayList)ViewState["ht"];
        ht.Add(TextBox1.Text);
        ViewState["ht"] = ht;
    }
}
protected void Button2_Click(object sender, EventArgs e)
{
    if (ViewState["ht"] != null)
    {
        ArrayList ht=(ArrayList)ViewState["ht"];
        foreach (object a in ht)
        {//write code to pass parameters to the crystal report
            Response.Write(a);
        }
    }
}
}

由于Viewstates在页面级别工作,因此这次集合中的值不会搞乱。

希望这有帮助。

答案 1 :(得分:1)

如何创建一个简单的DTO来存储所有报告参数。将此DTO保存在会话中,并在查看器控件所在的报表查看器页面中进行访问。

要在用户在浏览器中打开多个实例时跨越会话问题,您可以执行一个简单的操作。当用户提供参数并单击“显示报告”时,此时使用key作为此guid在会话内创建一个guid,store值,并将此guid作为查询字符串参数传递给报表查看器页面。这样,报表查看器页面的每个实例都可以识别要引出的会话值。

像这样的东西

public class AttendanceDTO 
{ 
  public int EmployeeId {get;set;} 
  public string Month {get;set;}
}

然后在“报告参数页面”

      /* JUST NOTEPAD CODE, SYNTAX MIGHT VARY */ 
    protected override ShowReport_Click(object sender, EventArgs e) 
            {
               string guid = new Guid();
                AttendanceDTO dto = new AttendanceDTO() 
                { EmployeeId = txtEmployee.Text;
                Month = txtMonth.text
            };
            session[guid] = dto;
            Response.Redirect("ReportViewer.aspx?Guid=" + guid);
            }

然后在报告查看器页面内

string guid = Request.QueryString["Guid"]; //Null check etc..
AttendanceDTO dto = (AttendanceDTO) session[guid];
//Provide dto values as parameters to your report viewer control and then clean the session

[您需要确保在使用后清除相应的会话值。] [上面的代码只是来自记事本给你一个想法。除此之外,您还可以带来更多创新]