为什么访问 RichTextBox 的 RTF 时会出现此错误?

问题描述 投票:0回答:1

我的应用程序上有许多富文本框,用于打印从数字调制解调器类型设备接收的数据。有时需要将一个窗口复制到另一个窗口,因为 RTF 窗口中的某些文本是按某种方式着色和格式化的,我认为最好的方法是将窗口的 RTF 复制到另一个窗口。但是,当我运行程序并尝试复制文本时,如果我破坏代码并尝试手动读取 RTF,我会在运行模式下遇到相同的错误。

?Hostform.rtfRX(0).TextRTF

'Hostform.rtfRX(0).TextRTF' threw an exception of type 'System.MissingMemberException'
    ClassName: Nothing
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233070
    HelpLink: Nothing
    InnerException: Nothing
    MemberName: Nothing
    Message: "Public member 'TextRTF' on type 'RichTextBox' not found."
    Signature: Nothing
    Source: "Microsoft.VisualBasic"
    StackTrace: "   at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& MemberName, Boolean ReportErrors)" & vbCrLf & "   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)" & vbCrLf & "   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)"
    TargetSite: {System.Reflection.MemberInfo[] GetMembers(System.String ByRef, Boolean)}

如果我使用 .RTF 或 .TextRTF,也会显示相同的错误 我不明白为什么当我使用富文本框时找不到 RTF。我正在使用 WinForm 并确保使用正确类型的 RTF。

打开 RTF 输出需要什么特殊的东西吗?

vb.net winforms richtextbox
1个回答
0
投票

看来您所做的事情是通过带有

RichTextBox
Object
引用来访问您的
Option Strict Off
的。一开始就不好了。您应该一直拥有
Option Strict On
并相应地编写代码。我在表单中添加了一个
RichTextBox
并通过“立即”窗口中生成的字段直接访问它,得到了以下结果:

?RichTextBox1.Rtf
“{
tf1 nsi nsicpg1252\deff0
ouicompat\deflang2057{ onttbl{ 0 nil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621} iewkind4\uc1 " & vbCrLf & "\pard 0 s18 Hello\par" & vbCrLf & "世界\ par" & vbCrLf & "}" & vbCrLf
?RichTextBox1.TextRTF
没有什么

然后我这样做了:

Option Strict Off

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Object = RichTextBox1
    End Sub

End Class

并在立即窗口中使用该

x
变量并得到以下结果:

?x.Rtf
“{
tf1 nsi nsicpg1252\deff0
ouicompat\deflang2057{ onttbl{ 0 nil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621} iewkind4\uc1 " & vbCrLf & "\pard 0 s18 Hello\par" & vbCrLf & "世界\ par" & vbCrLf & "}" & vbCrLf
?x.RTF
“{
tf1 nsi nsicpg1252\deff0
ouicompat\deflang2057{ onttbl{ 0 nil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621} iewkind4\uc1 " & vbCrLf & "\pard 0 s18 Hello\par" & vbCrLf & "世界\ par" & vbCrLf & "}" & vbCrLf
?x.TextRTF
“x.TextRTF”引发了“System.MissingMemberException”类型的异常
    类名:无
    数据:{System.Collections.ListDictionaryInternal}
    H结果:-2146233070
    帮助链接: 没什么
    内部异常:什么都没有
    会员姓名: 无
    消息:“未找到类型“RichTextBox”上的公共成员“TextRTF”。”
    签名: 没什么
    来源:“Microsoft.VisualBasic.Core”
    StackTrace:“在 Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& memberName,布尔报告错误)”&vbCrLf&“在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(对象实例,类型类型,字符串成员名称,对象[]参数,String[] argumentNames,Type[] typeArguments,Boolean[] copyBack)" & vbCrLf & " at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(对象实例,类型类型,字符串成员名称,对象[]参数,字符串[] ArgumentNames、类型 [] TypeArguments、布尔值 [] CopyBack)"
    TargetSite: {System.Reflection.MemberInfo[] GetMembers(System.String ByRef, Boolean)}

您应该从

Option Strict On
开始,因此您的代码不应编译。无论是否必须,您都应该将该
Object
引用强制转换为对象的实际类型,然后您可以直接访问该类型的成员,而无需后期绑定。以我的例子为例:

?DirectCast(x, RichTextBox).TextRTF
没有什么
© www.soinside.com 2019 - 2024. All rights reserved.