2013-11-28 5 views
-1

내가 여기에 붙어있어,수 없습니다 '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 [ "ctrl"] = panelBilling;' –

+0

사실 "panelBilling"이 Panel이 아닌 Div의 ID라는 것을 분명히해야합니다. 이전에 Panel을 사용했지만 작동하지 않습니다. 패널이 직렬화 가능하지 않다는 것 (또는 그와 비슷한 것, 정확하게 기억하지 못합니다) – arera

+0

그래서 div에 runat = "server"속성을 추가 했습니까? 넌 그걸하지 말아야 ... –

답변

0

이것은 컨트롤에 문자열 값을 캐스팅하는 것만으로는 의미가 없습니다.

내가 볼 수있는 한 Control은 Sessiosn에 삽입하지 않고 Control.ToString() 값도 삽입하지 않습니다.이 값도 작동하지 않습니다. (:이 .NET 3.5 이상 만 가능하다 발언은) :

계속하기 전에, 아무것도 캐스팅없이 세션에서 검색 유형을 확인하는 것이 유용 할 수

var sessionValue = Session["ctrl"]; 

이렇게하면 값을 포함하는 객체 유형의 값을 찾습니다.

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

위 출력은 문자열이 아니고 문자열/html 값입니다.

유 따를 수있는 두 가지 솔루션 경로가 다음과 같습니다이 (가) "GET"두 번째에서 세션

에 전화 세션

  • 변경에 전화 "SET"

    • 변경 예를 들어 문자열을 삽입한다는 사실을 염두에 두어 문자열 값을 읽으려는 경우 문자열 값을 읽으려고합니다.

      string sessionValueAsString = string.Empty; 
      Object sessionValue = Session["ctrl"]; 
      
      if (sessionValue != null) 
          sessionValueAsString = sessionValue.ToString(); 
      

      위의 예는 ur 요구 사항에 맞을 수 있습니다. 세션에 "Control"유형의 객체를 저장해야 할 필요가 없다고 생각하지 않아도됩니다. 이것은 다음과 같이 달성 될 수 있습니다 :

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

      위의 예제 외에도, 나는 당신이 무엇을 하려는지 확실하지 않습니다. 내 생각 엔 세션에서 잘못된 값을 삽입하는 실수를 한 것 같습니다.

      한 발언 : 저는 세션에서 WebControls를 저장하는 팬이 아니므로 Session에 데이터 객체를 저장하는 것이 더 깔끔합니다 (예 : CustomerUserControl 대신 Customer 클래스를 저장하면이 방법으로 읽을 수 있음). 세션에서 발견 된 데이터를 사용하여 필수 컨트롤을 채 웁니다).

  • +0

    나는 제안을 시도 할 것입니다. Btw, 동적 테이블을 인쇄하려고합니다. 그래서 세션에 동적 테이블을 저장 한 다음 인쇄하십시오. – arera

    +0

    "var"을 추가하고 페이지를 빌드 할 때 errror가 있습니다. "오류 'var'유형 또는 네임 스페이스 이름을 찾을 수 없습니다 (사용 지시문 또는 어셈블리 참조가 누락 되었습니까?)". 어떤 종류의 레퍼런스가 있어야합니까? – arera

    +0

    동적 테이블을 저장하면 세션의 전체 컨트롤을 저장할 필요가 없습니다. 그럼에도 불구하고 문제에 대한 회신 : var를 객체로 대체하십시오. (내 대답을 편집했습니다) 어떤 .NET 프레임 워크를 사용하고 있습니까? –