【问题标题】:Why 'innerhtml' does not work properly for 'select' tag为什么'innerhtml'不能正常用于'select'标签
【发布时间】:2013-05-21 05:13:57
【问题描述】:

我正在尝试设置 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:因为我需要用C#来做,所以不在桌面上。
  • 使用 HtmlControl.InnerHtml 到底有什么问题?
  • 您能否发布一些代码来显示在什么特殊情况下 innerHTML 不起作用?
  • System.Windows.Forms.HtmlDocument doc = webBrowser1.Document; HtmlElement HTMLControl = doc.GetElementById(ControlID);字符串列表结果;字符串 ListInnerHTML = ""; ListInnerHTML += ""; HTMLControl.InnerHtml = ListInnerHTML;

标签: c# html browser


【解决方案1】:

这是一个官方的 Internet Explorer 错误:

BUG: Internet Explorer Fails to Set the innerHTML Property of the Select Object.

一种解决方法

您可以尝试在文档头部添加以下meta 标签之一:

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

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

您还应该正确格式化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】:

    我真的不知道为什么 innerHTML 不适合你。
    如果还是不行,您可以尝试其他方法:
    http://innerdom.sourceforge.net/

    demo

    【讨论】:

      【解决方案3】:

      在此线程中,建议您使用控件的项目集合 How to add items to dynamically created select (html) Control

      请参阅此页面以获取完整示例: http://msdn.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlselect.items.aspx

      【讨论】:

      • 使用 Items 集合在代码隐藏中添加选项比使用 innerHtml 更合乎逻辑、更高级且更容易。
      猜你喜欢
      • 2014-10-15
      • 2014-03-03
      • 2022-11-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2020-07-13
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多