禁用在TextBox中选择文本

时间:2012-11-06 18:03:38

标签: c# .net winforms textbox

我有一个包含以下(重要)属性的文本框:

this.license.Multiline = true;
this.license.ReadOnly = true;
this.license.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.license.ShortcutsEnabled = false;

看起来像这样:

Textbox with highlighted text in it

如何禁止用户突出显示此文本框中的文本(我不想完全禁用文本框)?

10 个答案:

答案 0 :(得分:9)

附加到SelectionChanged事件,并在事件集e.Handled = true;SelectionLength = 0;内,这将阻止选择发生。这类似于保持按键发生所需的内容。

答案 1 :(得分:4)

如果您将文字放入标签,然后将标签放入System.Widnows.Forms.Panel控件中且AutoScroll已打开,则可以显示无法选择的文字。

答案 2 :(得分:4)

要在TextBox中停用选择突出显示,您可以覆盖WndProc并处理WM_SETFOCUS消息,并将其替换为WM_KILLFOCUS。请注意,它不会将TextBox控件设置为只读,如果您需要将其设置为只读,则还应将ReadOnly属性设置为true。如果您将ReadOnly设置为true,则可以将BackColor设置为White或任何其他合适的颜色。

在下面的代码中,我向SelectionHighlightEnabled添加了MyTextBox属性,以便轻松启用或禁用选择突出显示:

  • SelectionHighlightEnabled:获取或设置一个值,表示是否启用了选择突出显示。默认情况下,该值为true,表现为普通TextBox。如果将其设置为false,则不会呈现选择突出显示。
using System.ComponentModel;
using System.Windows.Forms;
public class MyTextBox : TextBox
{
    public MyTextBox()
    {
        SelectionHighlightEnabled = true;
    }
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;
    [DefaultValue(true)]
    public bool SelectionHighlightEnabled { get; set; }
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SETFOCUS && !SelectionHighlightEnabled)
            m.Msg = WM_KILLFOCUS;

        base.WndProc(ref m);
    }
}

答案 3 :(得分:0)

您可以使用已禁用的RichTextBox,然后将颜色重置为黑色。

RichTextBox rtb = new RichTextBox();
rtb.IsEnabled = false;
rtb.Text = "something";
rtb.SelectAll();
rtb.SelectionColor = Color.Black;
rtb.SelectedText = String.Empty;

答案 4 :(得分:0)

如果您使用的是XAML / WPF,则应使用 TextBlock 而不是 TextBox

只有在您使用显示文字框而不是输入时 - 因为TextBlock看起来好像文字是"雕刻"到表单本身,而不是在文本框中。要获得围绕TextBlock的边框(如果您愿意),您可以这样做:

XAML 中,例如:

<Border BorderThickness="1" BorderBrush="Gray">
    <TextBlock Background="White" Text="Your Own TextBlock"/>
</Border>

或动态在 C#代码

//Create a Border object
Border border = new Border();
border.BorderThickness = new Thickness(1);
border.BorderBrush = Brushes.Black;

//Create the TextBlock object           
TextBlock tb = new TextBlock();
tb.Background = Brushes.White;
tb.Text = "Your Own TextBlock";

//Make the text block a child to the border
border.Child = tb;

答案 5 :(得分:0)

由于标准TextBox不具有SelectionChanged事件,所以这是我想出的。

private void TextBox1_MouseMove(object sender, MouseEventArgs e)
{
    TextBox1.SelectionLength = 0;
}

答案 6 :(得分:0)

我遇到了同样的问题,因此遇到了这个问题。我以某种方式解决了以下问题,

if (sender != null)
                {
                    e.Handled = true;
                    if((sender as TextBox).SelectionLength != 0)
                        (sender as TextBox).SelectionLength = 0;
                }

验证长度是否更改为0,然后仅将其设置为0,即可解决递归循环。

答案 7 :(得分:0)

非常简单的解决方案

找到标签,然后在文本框中转到mousedown事件,然后 将焦点设置为标签

这在VB中,可以轻松转换为C#

Private Sub RichTextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles RichTextBox1.MouseDown
        Label1.Focus()
    End Sub

答案 8 :(得分:-1)

在WinForms中,正确的方法是分配事件MouseMove并将SelectionLength设置为0.

我在这里尝试并且完美无缺。

答案 9 :(得分:-1)

private void textBox5_Click(object sender, EventArgs e)
{
    this.textBox5.SelectionStart = this.textBox5.Text.Length;
}