C# 在richtext box v5中选择包含超链接的文本时发生奇怪的移动

C# 在richtext box v5中选择包含超链接的文本时发生奇怪的移动,c#,winforms,richtextbox,selection,rtf,C#,Winforms,Richtextbox,Selection,Rtf,当我使用RichTextBox.Select(int start,int length)函数选择包含超链接的富文本框中的文本时,当我尝试选择超链接之后的任何文本时,选择会发生一些变化 删除超链接时,选择将正常工作 编辑: 我使用RichTextBox 5(Visual Studio中的默认值为版本4) 只有richtextbox 5+出现此问题 这些图像显示了问题和行为上的差异 如果尝试此操作,请确保将RichTextBox的HideSelection属性设置为“false” 选择功能显示在按钮

当我使用RichTextBox.Select(int start,int length)函数选择包含超链接的富文本框中的文本时,当我尝试选择超链接之后的任何文本时,选择会发生一些变化

删除超链接时,选择将正常工作

编辑: 我使用RichTextBox 5(Visual Studio中的默认值为版本4)

只有richtextbox 5+出现此问题

这些图像显示了问题和行为上的差异

如果尝试此操作,请确保将RichTextBox的HideSelection属性设置为“false”

选择功能显示在按钮上

对于RTB5,应在上图中选择“文本”中的“e”

显然,RTB5选择了一些隐藏的文本

我需要它选择的基础上可见的文字只

RTB4在使用表时有问题,所以我不想使用它

我使用.NET2.0

编辑:若要在Visual Studio中尝试此操作,请从默认的richtextbox开始,并将其声明更改为RichText50W,而不是richtextbox

RichEdit 6也有同样的问题


感谢

根据我自己的经验,“RICHEDIT50W”版本在与嵌入式超链接或隐藏文本(使用rtf代码\v\v0)一起使用时会严重损坏

在v5框中,
Text.Length
属性报告14个字符-显示内容。
TextLength
属性报告51个字符。
SelectionStart
SelectionLength
属性都报告“隐藏文本”编号,但控件不再提供获取隐藏文本的方法。这意味着当富格文本包含隐藏字符时,“文本”和相关的“文本选择”信息将无法使用


我认为唯一的解决办法是,如果有隐藏字符,就不要使用“RICHEDIT50W”版本,或者浏览市场寻找更好的富文本控件。

只是晚了一点。这可能有帮助,也可能没有帮助,我还没有使用这个控件。下面的代码是从中复制的。注意
//检查Unicode或ANSI系统并设置适当的类名。

使用系统;
使用System.Windows.Forms;
使用System.Runtime.InteropServices;
命名空间编辑器
{
公共类RichTextBoxEx:RichTextBox
{
私有IntPtr mHandle=IntPtr.Zero;
受保护的重写CreateParams CreateParams
{
得到
{
//防止多次加载模块。
if(this.mHandle==IntPtr.Zero)
{
//加载库以获取RichEdit50类的实例。
this.mHandle=LoadLibrary(“msftedit.dll”);
}
//如果模块已加载,请重置ClassName。
if(this.mHandle!=IntPtr.Zero)
{
CreateParams cParams=base.CreateParams;
//检查Unicode或ANSI系统并设置适当的类名。
if(Marshal.SystemDefaultCharSize==1)
{
cParams.ClassName=“RichEdit50A”;
}
其他的
{
cParams.ClassName=“RichEdit50W”;
}
返回内存;
}
否则//模块未加载,返回默认的.NET RichEdit20 CreateParams。
{
返回base.CreateParams;
}
}
}
~RichTextBoxEx()
{
//免费加载的库。
如果(mHandle!=IntPtr.Zero)
{
免费图书馆(mHandle);
}
}
[DllImport(“kernel32.dll”,SetLastError=true)]
私有静态外部IntPtr加载库(字符串lpFileName);
[DllImport(“kernel32.dll”,SetLastError=true)]
私有静态外部布尔自由库(IntPtr hModule);
}
}

你确定吗?我已经测试过了,效果很好,你能发布你的代码吗?我用图片和更多细节更新了问题。不幸的是,richtext box 4在表格方面非常糟糕,所以我不能使用它。你知道修复这些问题的另一个版本吗?@Jerry是的,表在v4上不是很好。你必须看看市场,或者试试WPF版本。做了很多广告。我没有使用这些第三方控件的经验,所以我不能推荐一个能解决您的问题的控件。@Jerry在黑暗中拍摄:我唯一能想到的是尝试RichTextBox的WPF版本,并将其放入ElementHost控件中。@Jerry因此引用ElementHost。看@Jerry,在这个话题上,事情似乎从坏到坏。
public class RichText50W : RichTextBox
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr LoadLibrary(string lpFileName);
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams prams = base.CreateParams;
            if (LoadLibrary("msftedit.dll") != IntPtr.Zero)
            {
                prams.ClassName = "RICHEDIT50W";
            }
            return prams;
        }
    }
}