-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()の値も挿入していません。これも機能しません。

続行する前に、何もキャストせずにセッションから取得された型を確認すると便利な場合があります (注意: これは .NET 3.5 以降でのみ可能です)。

var sessionValue = Session["ctrl"];

そうすると、値が次の値を含むオブジェクト型であることがわかります。

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

上記の出力はコントロールではなく、string/html 値です。

あなたが従うことができる2つの解決策があります:

  • セッションの「SET」呼び出しを変更します
  • セッションの「GET」呼び出しを変更します

2 番目の例では、文字列を挿入しているため、その文字列値を読み取りたいという事実を保持します。

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% 確信が持てません。私の推測では、セッションに間違った値を挿入するのを間違えたのでしょう。

1 つの注意: 私は WebControls をセッションに保存するのが好きではありません。データ オブジェクトをセッションに保存する方がクリーンです (たとえば、CustomerUserControl の代わりに Customer クラスを保存すると、セッションを読み込んでデータを取り込むことができます)。セッションで見つかったデータを使用して必要なコントロール)。

于 2013-11-28T15:26:09.277 に答える