实现功能:在页面中添加一个按钮,按钮按下将页面的HTML存入xls文件中,也就是保存成Excel文件。
代码:
private void Button_Click(object sender, System.EventArgs e)
{
 string sFileName = ".\\aaa.xls";
 StringWriter oStringWriter = new StringWriter(); 
 HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter);
 this.RenderControl(oHtmlTextWriter);
 if (!File.Exists(sFileName))
 {
    FileStream fileXLS = File.Create(sFileName);
    StreamWriter sw = new StreamWriter(fileXLS);
    sw.Write(oStringWriter.ToString());
    sw.Flush();
    sw.Close();
 }
    oStringWriter.Close();
    oHtmlTextWriter.Close();}出现错误:
当执行到 this.RenderControl(oHtmlTextWriter);就提示“一页只能有一个服务器端 Form 标记。”
于是我在Form下添加一个Panel控件,将this.RenderControl(oHtmlTextWriter);改为:this.Panel1.RenderControl(oHtmlTextWriter); 运行没问题。但当页面中加入Textbox控件,就报“textbox必须放在具有 runat=server 的窗体标记内”,所有的TextBox控件都是runat=server的,实在是找不到原因了,请高手给看看。

解决方案 »

  1.   

    帮你顶吧,没明白你的意思
    但是我觉得你应该把所有的服务器端控件都放在一个form标记内
      

  2.   

    http://west-wind.com/weblog/posts/481.aspx
      

  3.   

    我是把所有的web控件都放在Form里了。关键“this.RenderControl(oHtmlTextWriter);”这一句总是报错。
      

  4.   

    有个类WebRequest获取HTML代码的
      

  5.   

    问题在于你在点击按钮的时候调用了两次RenderControl方法,一次在你的事件处理函数中,一次在Render(基类的一个方法,此方法只要继承Page必调)里面。
    要知道Render是页面周期里面比较靠后的一个过程,在Render之前你的按钮事件处理函数已经执行过了并不影响你的处理逻辑,所以建议你的这些过程放到Render里面处理(这也是重写控件改变Render的通用方法)。
      

  6.   

    cuike519,你的意思是说覆盖Render方法?Render方法原来是什么样子都不知道啊。