2013-11-28 50 views
-1

我被困在这里,无法转换类型“System.String”的对象键入“System.Web.UI.Control”

我有我想要打印动态表。所以我让会议把它传递到网络控制。 不幸的是,它不流畅。

这里是我的代码:

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"] 

一部分。我很多时候都使用这种方法,之前没有任何问题。任何人有任何想法?谢谢。

+1

如果将面板存储在'Session'中,会发生什么? 'Session [“ctrl”] = panelBilling;' –

+0

我必须说清楚,“panelBilling”是Div的ID,而不是Panel。我之前使用Panel,但它也不起作用。它说,面板是不可序列化的(或类似的东西,我不记得确切) – arera

+0

所以你添加runat =“server”属性到你的div?你不应该那样做... –

回答

0

这只是没有道理,将一个字符串值强制转换为控件。

据我所见,你没有插入控件到Sessiosn,甚至没有Control.ToString()值,这也不会工作。

在继续之前,它可能是有用的,以检查它的种类从会话中检索,而不铸造任何东西(注:这是唯一可能与.NET 3.5或更高版本):

var sessionValue = Session["ctrl"]; 

这样做时,你将找出值类型对象,其中包含值:

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

上述输出不是控件,而是字符串/ html值。

有两种解决路径,其中U可以遵循:

  • 更改“SET”呼吁会议
  • 更改“GET”的会议

调用在第二例如,你要保持这样一个事实,即你插入一个字符串,因此你想要读出字符串值:

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"]; 

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

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

+0

我会尝试你的建议。顺便说一句,我尝试打印一张动态表格。所以我将动态表存储到会话中然后打印它。 – arera

+0

当我添加“var”并构建页面时,出现错误:“错误找不到类型或名称空间名称'var'(是否缺少using指令或程序集引用?)”。我应该有什么样的参考? – arera

+0

存储动态表格不应该需要将整个控件保存在会话中。不过,要回复你的问题:用对象替换var。 (我编辑了我的答案)你使用了哪个.NET框架? –

相关问题