将Gridview导出到Excel时出错

时间:2013-12-10 06:36:43

标签: c# javascript asp.net

是的,我发现很多问题引用了这个,但我似乎无法找到像我一样的确切场景。所以请花些时间查看下面的代码:

我在内容持有人

中有此脚本
   <script language="javascript" type="text/javascript">
        function GetMac2() {

            var macAddress = "";
            var ipAddress = "";
            var computerName = "";
            var wmi = GetObject("winmgmts:{impersonationLevel=impersonate}");
            e = new Enumerator(wmi.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));
            for (; !e.atEnd(); e.moveNext()) {
                var s = e.item();
                macAddress = s.MACAddress;
            }

            document.getElementById("<% =txtMACAdd.ClientID %>").value = unescape(macAddress);
        }  </script>

和将Gridview导出为ex​​cel的代码

HtmlForm form = new HtmlForm();
            Response.Clear();
            Response.Buffer = true;
            string fileName = "Prenda of " + YearDropDownList.SelectedValue + "/" + MonthDropDownList.SelectedValue;
            Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
            Response.Charset = "";
            Response.ContentType = "application/vnd.ms-excel";
            StringWriter sw = new StringWriter();
            HtmlTextWriter hw = new HtmlTextWriter(sw);
            PrendaGridView.AllowPaging = false;
            PrendaGridView.DataSource = (DataSet)ViewState["view"];
            PrendaGridView.DataBind();
            form.Controls.Add(PrendaGridView);
            this.Controls.Add(form);
            form.RenderControl(hw);
            Response.Output.Write(sw.ToString());
            Response.Flush();
            Response.End();

问题是我重现错误

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).

当我包含上面的javascript时,如果我删除它。它运作良好。所以有没有关于如何包含我的JavaScript的工作?

我在page_load上调用我的java脚本

if(!isPostback)
{
   string jvscript = "<script language='javascript'>GetMac2();</script>";
                    Page.ClientScript.RegisterStartupScript(this.GetType(), "invoke", jvscript);
}  

希望你能帮助我谢谢!

1 个答案:

答案 0 :(得分:1)

我能想到一个解决方法:
HTML:

<input id="tempInp" runat="server" type="hidden"></input>

<强> C#:

tempInp.value = txtMACAdd.ClientID;

<强>使用Javascript:

document.getElementById(document.getElementById("tempInp").value).value = unescape(macAddress);

这不会打扰javascript,javascript中没有服务器代码,因此您可以执行this.Controls.Add(form);

修改
由于您使用服务器标签来获取控件的客户端ID,我认为控件的客户端ID和服务器ID不相同。
还有一个非标准但简单的解决方法。只需从浏览器中复制页面最终来源的txtMACAdd客户端ID,然后将其粘贴到document.getElementById("<% =txtMACAdd.ClientID %>").value
因为当我们执行document.getElementById("tempInp").value时,tempInp控件的ClientID可能会有所不同,并且无法找到控件并再次出现同样的问题。