我被困在这里,
我有要打印的动态表格。所以我创建会话将其传递给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'。“
on
(Control)Session["ctrl"]
一部分。我以前用过很多次这个方法而没有问题。任何人有任何想法?感谢。
答案 0 :(得分:0)
这没有意义,将字符串值转换为Control。
据我所见,你没有在Sessiosn中插入一个Control,甚至没有Control.ToString()值,这也是无效的。
在继续之前,检查从Session中检索的类型而不进行任何操作可能是有用的(注释:这仅适用于.NET 3.5或更高版本):
var sessionValue = Session["ctrl"];
执行此操作时,您将发现值为object类型,包含值:
"<div>\r\n\r\n</div>"
上面的输出不是Control,而是字符串/ html值。
您可以遵循两种解决方案路径:
在第二个例子中,你继续说明你要插入一个字符串,因此你想要读出那个字符串值:
string sessionValueAsString = string.Empty;
Object sessionValue = Session["ctrl"];
if (sessionValue != null)
sessionValueAsString = sessionValue.ToString();
以上示例可能适合您的需求,我猜测您需要在会话中保存“Control”类型的对象。这可以这样实现:
MyControl myControl = new MyControl {Title = "My custom control"};
Session["myControl"] = myControl;
// Read the Session value cross Postback
MyControl mySessionControl = (MyControl)Session["myControl"];
除了上面的例子,我不是百分之百确定你要做什么。 我的猜测是你在Session中插入错误的值时犯了一个错误。
一句话:我不喜欢在会话中存储WebControl,将数据对象存储在Session中会更简洁(例如存储Customer类而不是CustomerUserControl,这样你就可以读出使用Session中的数据对会话进行填充并填充所需的控件。