-1

我被困在这里,

我有要打印的动态表。因此,我进行会话以将其传递给 Web 控件。不幸的是,它运行不顺畅。

这是我的代码:

protected void bt_print_click(object sender, EventArgs e)
{
    StringWriter sw = new StringWriter();
    HtmlTextWriter w = new HtmlTextWriter(sw);
    panelBilling.RenderControl(w);
    string s = sw.GetStringBuilder().ToString();
    Session["ctrl"] = s;

    ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language=javascript>window.open('Print.aspx?rep=1','PrintMe','height=680px,width=1024px,scrollbars=1');</script>");

}

和 Print.aspx.cs 代码:

protected void Page_Load(object sender, EventArgs e)
{
    Control ctrl = (Control)Session["ctrl"];
    PrintHelper.PrintWebControl(ctrl);
}

我总是收到错误消息:

“无法将‘System.String’类型的对象转换为‘System.Web.UI.Control’类型。”

(Control)Session["ctrl"]

部分。这种方法我用过很多次,以前没有问题。有人有什么想法吗?谢谢。

4

1 回答 1

0

这只是没有意义,将字符串值转换为控件。

据我所见,您没有将 Control 插入到 Sessiosn 中,甚至没有将 Control.ToString() 值插入,这也不起作用。

在继续之前,检查从 Session 检索到的类型而不进行任何转换可能很有用(备注:这仅适用于 .NET 3.5 或更高版本):

var sessionValue = Session["ctrl"];

这样做时,您会发现该值是对象类型,包含该值:

"<div>\r\n\r\n</div>"

上面的输出不是一个控件,而是一个字符串/html 值。

您可以遵循两种解决方案路径:

  • 更改会话上的“SET”调用
  • 更改会话上的“GET”调用

在第二个示例中,您坚持要插入一个字符串,因此您想读出该字符串值:

string sessionValueAsString = string.Empty;
Object sessionValue = Session["ctrl"];

if (sessionValue != null)
    sessionValueAsString = sessionValue.ToString();

上面的例子可以满足你的需要,我猜你需要在会​​话中保存一个“控制”类型的对象。这可以像这样实现:

MyControl myControl = new MyControl {Title = "My custom control"};
Session["myControl"] = myControl;
// Read the Session value cross Postback
MyControl mySessionControl = (MyControl)Session["myControl"];

除了上面的例子,我不是 100% 确定你想要做什么。我的猜测是你在 Session 中插入了错误的值是错误的。

一句话:我不喜欢将 WebControls 存储在会话中,将数据对象存储在 Session 中会更干净(例如,存储 Customer 类而不是 CustomerUserControl,这样您就可以读出 Session 并填充使用会话中找到的数据进行所需的控制)。

于 2013-11-28T15:26:09.277 回答