0

これがレイアウトです。SQL サーバーからの動的データを含む FormView コントロールがあります。FormView の ReadOnly モードを使用しています。PrepareFormViewForExport メソッドを微調整して、テキスト ボックスを削除し、FormView の値を残すにはどうすればよいですか? 現在、出力にはラベルが表示されていますが、テキスト ボックスの値は省略されています。

これは、エクスポート ボタンがクリックされたときの C# コードです。

protected void Bexport_Click(object sender, EventArgs e)
{
    //Clear the Response object
    Response.Clear();
    //set Response header to the Excel filename required (.xls for excel, .doc for word)
    Response.AddHeader("content-disposition", "attachment;filename=ReportOuput.xls");
    Response.Charset = "";
    // If you want the option to open the Excel 
    // file without the save option then un-comment out the line below
    //Response.Cache.SetCacheability(HttpCacheability.NoCache);
    //FOR EXCEL 
    Response.ContentType = "application/vnd.xls";
    //FOR WORD
    //Response.ContentType = "application/vnd.doc";
    //Declare new stringwriter and html writer
    StringWriter stringWrite = new System.IO.StringWriter();
    HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    //Strip out controls from FormView ?takes data too?
    PrepareFormViewForExport(FormView2);
    //render controls data as HTML
    FormView2.RenderControl(htmlWrite);      
    //Clean out the Javascript postbacks etc.
    string html = stringWrite.ToString();
    html = Regex.Replace(html, "</?(a|A).*?>", "");
    StringReader reader = new StringReader(html);
    //Write xls document
    Response.Write(html);
    //end current Response
    HttpContext.Current.Response.End();

}

エクスポート用にレンダリングする前に、FormView からコントロールを削除する方法を次に示します。

private void PrepareFormViewForExport(Control fv)
{
    LinkButton lb = new LinkButton();
    Literal l = new Literal();
    string name = String.Empty;
    TextBox TB = new TextBox();

    for (int i = 0; i < fv.Controls.Count; i++)
    {
        if (fv.Controls[i].GetType() == typeof(LinkButton))
        {
            l.Text = (fv.Controls[i] as LinkButton).Text;
            fv.Controls.Remove(fv.Controls[i]);
            fv.Controls.AddAt(i, l);
        }
        else if (fv.Controls[i].GetType() == typeof(TextBox))
        {
            l.Text = (fv.Controls[i] as TextBox).Text;
            fv.Controls.Remove(fv.Controls[i]);
            fv.Controls.AddAt(i, l);
        }
        else if (fv.Controls[i].GetType() == typeof(DropDownList))
        {
            l.Text = (fv.Controls[i] as DropDownList).SelectedItem.Text;
            fv.Controls.Remove(fv.Controls[i]);
            fv.Controls.AddAt(i, l);
        }
        else if (fv.Controls[i].GetType() == typeof(CheckBox))
        {
            l.Text = (fv.Controls[i] as CheckBox).Checked ? "True" : "False";
            fv.Controls.Remove(fv.Controls[i]);
            fv.Controls.AddAt(i, l);
        }
        if (fv.Controls[i].HasControls())
        {
            PrepareFormViewForExport(fv.Controls[i]);
        }
    }
}
4

2 に答える 2

1

本当の解決策ではなく、回避策を見つけました。フォームビューが読み取り専用であるため、コントロールをテキストボックスからラベルに変更しました。これにより、HTMLライターは、テキストボックスをコピーしようとする代わりに、データをExcelにダンプします。ただし、元の質問に答える方法を誰かが知っているかどうかを知りたいと思います。

于 2009-09-25T15:14:01.763 に答える
1

Sheet Gear のサード パーティ コンポーネントを展開してみて ください http://www.spreadsheetgear.com/

于 2009-09-24T16:24:25.083 に答える