为什么WinForm不能显示innerHTML拼接的表格?

以下是WinForm中的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using mshtml;

namespace Project3
{
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //winForm调用js的前提
            webBrowser1.ObjectForScripting = this;
        }

        public void btnSelect(String val) {
            //javascript要调用winform时必须加这一句
            this.webBrowser1.ObjectForScripting = this;
            //MessageBox.Show(val, "winForm窗口");
            //调用winform里面的调用XML方法
            XmlDocument Xml = new XmlDocument();
            //读取xml(project3.xml)
            Xml.Load("project3.xml");
            //获取根节点的所有子节点列表(sqldata)
            XmlNodeList list = Xml.DocumentElement.GetElementsByTagName("sqldata");
            //为了获取row的个数(for循环次数)
            XmlNodeList list_1 = Xml.DocumentElement.GetElementsByTagName("row");
            //foreach来遍历所有ReceiptFees为获取到val的同级Tag数据
            foreach (XmlNode node in list)
            {
                for (int i = 0; i < list_1.Count; i++)
                {
                    //遍历全部信息
                    if (val.Equals("全部"))
                    {
                        String s1 = node.ChildNodes[i].ChildNodes[0].InnerText;//No
                        String s2 = node.ChildNodes[i].ChildNodes[1].InnerText;//ReceiptFees
                        String s3 = node.ChildNodes[i].ChildNodes[2].InnerText;//MedicalContent
                        String s4 = node.ChildNodes[i].ChildNodes[3].InnerText;//price

                        String[] data = new String[4];
                        data[0] = s1; data[1] = s2; data[2] = s3; data[3] = s4;
                        this.webBrowser1.Document.InvokeScript("showdata", data);
                    }
                    else
                    {
                        //当ReceiptFees的值equals等于val的值时,将node的所有子节点打印到html页面
                        if (node.ChildNodes[i].ChildNodes[1].InnerText.Equals(val))
                        {
                            String s1 = node.ChildNodes[i].ChildNodes[0].InnerText;//No
                            String s2 = node.ChildNodes[i].ChildNodes[1].InnerText;//ReceiptFees
                            String s3 = node.ChildNodes[i].ChildNodes[2].InnerText;//MedicalContent
                            String s4 = node.ChildNodes[i].ChildNodes[3].InnerText;//price
                            String[] data = new String[4];
                            data[0] = s1; data[1] = s2; data[2] = s3; data[3] = s4;                            
                             this.webBrowser1.Document.InvokeScript("showdata", data);
                        }
                    }
                }
            }

        }

以下是HTML代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>未缴费处方项目信息</title>
    <link rel="stylesheet" href="style.css">
    <script language="javascript" type="text/javascript">
        function btnSelect()
        {
            //获取下拉框中的数据val
            var val = document.getElementById("3").value;
            //将下拉框获取到的费用数据传递给winform
            window.external.btnSelect(val);
        }
        //被winForm调用来执行的方法(方法名与winForm中对应)
    </script>

</head>
<body>
    <div id="base" class="base">
        <!--            题头                          -->
        <div id="1" class="title">
            <h2 class="head_font">下方是你未缴费处方项目信息</h2>
        </div>
        <!--            选择                          -->
        <div id="2" class="choose">
            <!-- 选择下拉框 -->
            <div id="" class="second_1">
                <select id="3" class="select">
                    <option value="全部">全部</option>
                    <option value="检查费">检查费</option>
                    <option value="西药费">西药费</option>
                    <option value="材料费">材料费</option>
                </select>
            </div>
            <!-- 选择按钮  -->
            <div id="" class="second_2">
                <input id="4" class="input" type="submit" value="查询XML信息" onclick="btnSelect()" />
            </div>
        </div>
        <!--  表格     -->
        <div class="table">
            <table border="0" cellspacing="0" cellpadding="0" id="t_1">
                <tr class="table_top">
                    <td>项目编号</td>
                    <td>项目类型</td>
                    <td>项目名称</td>
                    <td>项目价格</td>
                </tr>
            </table>
        </div>
    </div>
</body>

<script language="javascript" type="text/javascript">
    function showdata(s1, s2, s3, s4) {
        **//alert(s1); alert(s2); alert(s3); alert(s4); 经过测试这一句是执行成功的!**
        var htmls = "<TR><TD>" + s1 + "</TD><TD>" + s2 + "</TD><TD>" + s3 + "</TD><TD>" + s4 + "</TD></TR>";
        **document.getElementById("t_1").innerHTML += htmls;**//这一句执行失败,请各位帮帮忙看看为什么!

   }
</script>
</html>

1个回答

肯定是可以的,建议你调试下,首先
this.webBrowser1.Document.InvokeScript("showdata", data);
传入硬编码的字符串,而不是data,看能不能加载表格,如果不能,就是你js的问题,调试下s1 s2 s3 s4有没有正确得到值

Remains151
Saigetsu、 我猜测可能是WebBroser这个控件的浏览器内核不支持innerHTML去修改<table>里面的标签(好像看过说是IE6-9的<table>标签是只读还是怎么样的,因为我用HBuilder同样的代码可以成功显示,所以我想问题应该出在WebBroser上)
3 个月之前 回复
Remains151
Saigetsu、 感谢回答。是这样,我经过alert可以得到s1 s2 s3 s4的值,但是innerHTML这一句没有执行。而且我试过应该不是传参的问题,哪怕我innerHTML里面写上"<tr><td>123</td></tr>"都不能正确显示。
3 个月之前 回复
Remains151
Saigetsu、 感谢回答。是这样,我经过alert可以得到s1 s2 s3 三
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问