未找到类型"DBNull"上的公共成员"元素"

Mik*_*fer 1 .net internet-explorer activex

我们有一个ActiveX组件,它通过SHDocVw在Internet Explorer窗口中显示一个Web页面.在DocumentComplete事件处理程序中,我们尝试从页面上的一个控件中检索值.我们知道控件在页面上(通过Fiddler跟踪可见).

在这一点上,事情变得不稳定.我们在运行时收到以下错误消息:

Error Message:  
  Public member 'elements' on type 'DBNull' not found.
Error Routine Location:  
   at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& MemberName, Boolean ReportErrors)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
   at Foo.AddinModule.m_internetExplorer_DownloadComplete(Object pDisp, Object& url)
Error Source:  
  Microsoft.VisualBasic
Error Site Location:  
  System.Reflection.MemberInfo[] GetMembers(System.String ByRef, Boolean)
Run Code Online (Sandbox Code Playgroud)

令人讨厌的代码行是这样的:

Me.IEInstance.Document.forms("frmRedirect").elements("redirectData").Value = outlookXML.OuterXml
Run Code Online (Sandbox Code Playgroud)

所以,基本上,Me.IEInstance.Document.forms("frmRedirect")正在评估DBNull.

我们已经消除了区分大小写的问题.尝试在页面内移动控件,并验证HTML格式正确.我不知道为什么会这样.下面是生成的HTML的示例.

任何人都可以提出这个问题的原因和可能的解决方案吗?我现在正在接受任何和所有的建议.

HTML示例

<form id='frmRedirect' name='frmRedirect' action='pw_outlook/choosecontacts.aspx' method='POST'>
    <input type='hidden' name='redirectData'>
</form>
Run Code Online (Sandbox Code Playgroud)

更新2012年3月28日

我们已经确定代码在某些配置下工作正常.然后,神秘的是,如果您更改代码,它将成功为一些用户,如下所示:

Me.IEInstance.Document.forms("frmRedirect").Elements("redirectData").Value = outlookXML.OuterXml
                                            ^
                                            ^
Run Code Online (Sandbox Code Playgroud)

也就是说,如果你只是改变一下的情况Elements.对我而言,在COM vtable查找过程中,这个问题很明显,但神秘之处在于并不是每个人都会遇到这种问题.只是一些用户.

另请注意,返回的表单.forms("frmRedirect")是有效对象; 但是,似乎没有elements()方法.

Han*_*ant 5

您正在与DLR中的错误作斗争,DLR是在.NET 4中添加的动态语言运行库.堆栈跟踪上的代码与DLR的VB.NET绑定程序相关.这个错误几乎肯定不是由您发布的代码触发的,很可能是您项目中的某些其他代码使用dbase查询执行某些操作.鉴于异常消息中存在DBNull.

您需要Microsoft的支持才能深入了解这一点.他们需要你的项目给他们一个repro来工作,因为代码片段本身不会帮助他们找到它.您可以与Microsoft支持部门联系以启动它.他们会从你的信用卡中取出一大块,但你几乎肯定会把它拿回来,因为它可能是他们代码中的错误,而不是你的.

虽然并不能确保DLR损坏不会在以后引起某种问题,但是可能有针对此特定故障的解决方法.通过编写早期绑定代码,您可以在不使用DLR的情况下编写完全相同的代码.从Project + Add Reference,Browse选项卡开始,选择c:\ windows\system32\mshtml.tlb

然后重写您的代码段,如下所示:

    Dim doc = DirectCast(Me.IEInstance.ActiveXInstance, mshtml.IHTMLDocument2)
    Dim form = DirectCast(doc.forms("frmRedirect"), mshtml.IHTMLFormElement)
    If form IsNot Nothing Then
        Dim elem = DirectCast(form.elements("redirectData"), mshtml.IHTMLInputElement)
        If elem IsNot Nothing Then
            elem.value = outlookXML.OuterXml
        End If
    End If
Run Code Online (Sandbox Code Playgroud)