为什么“innerhtml”对于“select”标签无法正常工作

13
我正在尝试设置HTML select标签的innerhtml,但我无法设置该功能;因此,我需要使用outerhtml功能。这样,不仅我的代码是HARDCODE,而且也是荒谬的。我已经阅读了“InnerHTML IE 8 doesn't work properly? Resetting form”,但没有帮助。
如果您告诉我如何设置HTML select标签的innerhtml功能,我将不胜感激。 我的C#代码:
public void SetDefaultValue(string ControlID, string ControlValue) 
{      
    System.Windows.Forms.HtmlDocument doc = webBrowser1.Document;
    HtmlElement HTMLControl = doc.GetElementById(ControlID);
        string ListResult;            
        string ListInnerHTML = "";
        ListInnerHTML += "<OPTION value = " + LstString + ">" + LstString + "</OPTION>";                                      
        ListResult = "<SELECT id = " + '"' + HTMLControl.Id + '"' + " type = " + '"' + HTMLControl.GetAttribute("type") + '"' + " title = " + '"' +
            HTMLControl.GetAttribute("title") + '"' + " name = " + '"' + HTMLControl.Name + '"' + " value = " + '"' + HTMLControl.GetAttribute("value") +
            '"' + " size = \"" + HTMLControl.GetAttribute("size") + '"' + HTMLControl.GetAttribute("multiple").ToString() + "\">" + ListInnerHTML + "</SELECT>";
        HTMLControl.OuterHtml = ListResult;                    
}

或者

string _lsthtml = _htmlel.OuterHtml;
string[] _parts = ControlValue.Split(new char[] { ',' });
string _lstinner = "";
foreach (string _lst in _parts)
_lstinner += "<option value=" + _lst + ">" + _lst + "</option>";

_lsthtml = _lsthtml.Insert(_lsthtml.IndexOf(">") + 1, _lstinner);
_htmlel.OuterHtml = _lsthtml;

这段代码可以运行,但我需要更高效、整洁的方案。 ReturnControlType 函数返回一个html标签的type

为什么不使用asp:DropDownList? - Pete
@Pete:因为我需要用C#来完成它,所以这个选项不在考虑范围内。 - Pedram
使用HtmlControl.InnerHtml有什么问题? - TGlatzer
你能否发布一些代码,展示innerHTML在什么特殊情况下无法工作? - MentholBonbon
System.Windows.Forms.HtmlDocument doc = webBrowser1.Document; HtmlElement HTMLControl = doc.GetElementById(ControlID); string ListResult; string ListInnerHTML = ""; ListInnerHTML += "<OPTION value = " + LstString + ">" + LstString + "</OPTION>"; HTMLControl.InnerHtml = ListInnerHTML; 系统。Windows。Forms。HtmlDocument doc = webBrowser1.Document; HtmlElement HTMLControl = doc.GetElementById(ControlID); string ListResult; string ListInnerHTML = ""; ListInnerHTML += "<OPTION value = " + LstString + ">" + LstString + "</OPTION>"; HTMLControl.InnerHtml = ListInnerHTML; - Pedram
重复并不能使症状更加清晰。 - TGlatzer
3个回答

13

这是一个官方的Internet Explorer漏洞:

BUG:Internet Explorer无法设置Select对象的innerHTML属性

一个解决方法

您可以尝试在文档头中添加以下其中一个meta标签:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />
或者
<meta http-equiv="X-UA-Compatible" content="IE=10" />

您还应正确格式化option标签的value属性(将LstString'括起来):

您还需要适当地格式化 option 标签的 value 属性(在其中包含 LstString,并使用单引号 ' 将其括起来):

ListInnerHTML += "<OPTION value='" + LstString + "'>" + LstString + "</OPTION>";

一种更可靠的解决方案

虽然上述修复可能是你代码的变通方法,但我建议使用更可靠的方法。考虑将对 Microsoft.mshtml 的引用添加到你的项目中,并像这样修改你的方法:

// add this to the top of the file containing your class
using mshtml;

public void SetDefaultValue(string ControlID, string ControlValue)
{
    System.Windows.Forms.HtmlDocument doc = webBrowser1.Document;
    IHTMLDocument2 document = doc.DomDocument as IHTMLDocument2;
    var sel = doc.GetElementById(ControlID);
    HTMLSelectElement domSelect = (HTMLSelectElement)sel.DomElement;
    domSelect.options.length = 0;
    HTMLOptionElement option;

    // here you can dynamically add the options to the select element
    for (int i = 0; i < 10; i++)
    {
        option = (HTMLOptionElement)document.createElement("option");
        option.text = String.Format("text{0}", i);
        option.value = String.Format("value{0}", i);
        domSelect.options.add(option, 0);
    }
}

2

2

在编写代码时,使用 Items 集合来添加选项比使用 innerHtml 更为合乎逻辑、更高级且更容易。 - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接