如何使用C#使文本框无法选择

时间:2010-05-10 07:06:52

标签: .net winforms textbox

我正在将C#/ .NET用于Windows窗体应用程序。我有一个文本框。如何使文本框无法选择?

我不想禁用完整的文本框。

11 个答案:

答案 0 :(得分:11)

在文本框的“Enter”事件中,将ActiveControl设置为其他内容:

    private void txtMyTextbox_Enter(object sender, EventArgs e)
    {
        ActiveControl = objMyOtherControl;
    }

答案 1 :(得分:4)

IsHitTestVisible="False"会阻止文本框在鼠标悬停或单击时显示边框。在我的情况下,这足以利用文本框的文本包装功能,同时使其对用户操作不敏感

答案 2 :(得分:3)

您有几个选择:

  1. 改为使用Label控件。
  2. 设置textBox.Enabled = false以阻止选择(请参阅here)。

答案 3 :(得分:3)

我遇到了同样的问题。我有一个对话框,需要显示多行文字。由于多行和文本换行,我无法使用标签,因为它必须是文本框。

我首先疯狂地读取它,但是如果对话框被其他窗口闪现,则文本会被选中,看起来很糟糕。所以我发现了问题。

在表单构建器程序(无论它叫什么)中,TextBox的属性名为TabStop。我将其设置为false,并且只读取了从不的只读文本框文本。问题解决了。

答案 4 :(得分:2)

可以拦截和阻止导致文本的消息。我原以为EM_SETSEL就是所需要的。但是,即使鼠标单击并拖动,也没有EM_SETEL消息,但文本仍然会选择。可能其中一条消息有一个指向包含信息的结构的指针。

注意:我不确定这是否会阻止所有方式选择文字。

public class TextBox2 : TextBox {

    private const int EM_SETSEL = 0x00B1;
    private const int WM_LBUTTONDBLCLK = 0x203;
    private const int WM_MOUSEMOVE = 0x200;
    private const int WM_KEYDOWN = 0x100;
    private const int VK_CONTROL = 0x11;
    private const int VK_SHIFT = 0x10;

    public TextBox2() {
        this.ShortcutsEnabled = false; // disabled right click menu
        this.Cursor = Cursors.Default;

    }

    protected override void OnGotFocus(EventArgs e) {
        base.OnGotFocus(e);
        HideCaret(this.Handle); // doesn't work from OnHandleCreated
    }

    [DllImport("user32.dll")]
    public static extern bool HideCaret(IntPtr hWnd);

    public override bool PreProcessMessage(ref Message msg) {
        // prevents the user from using the SHIFT or CTRL + arrow keys to select text
        if (msg.Msg == WM_KEYDOWN)
            return true;

        return base.PreProcessMessage(ref msg);
    }

    protected override void WndProc(ref Message m) {
        if (m.Msg == EM_SETSEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_LBUTTONDBLCLK)
            return;

        base.WndProc(ref m);
    }
}

答案 5 :(得分:1)

可能最好的方法是在其后面添加标签,当您想要禁用文本框时,隐藏它并在其位置显示标签。

答案 6 :(得分:1)

一个老问题,我对这个问题的答案并不满意,但是如果最初的意图是使用文本框显示数据而不允许以任何方式选择它,这是一个(到目前为止)对我有用的方法。

首先,我的文本框的非默认属性:

Multiline        = true
ReadOnly         = true
ScrollBars       = Both
ShortcutsEnabled = false
TabStop          = false
WordWrap         = false

然后处理鼠标事件。 MouseMove和DoubleClick都被映射为触发textBox1_MouseGeneral(),并且在Click事件中发生了其他操作,因此这两个事件处理程序明显重复。

    private void MouseEvent()
    {
        textBox1.SelectionLength = 0;

        focusControl.Focus(); // Move focus to another control
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        MouseEvent();
    }

    private void textBox1_MouseGeneral(object sender, EventArgs e)
    {
        MouseEvent();
    }

出现闪烁的插入符号光标,然后textBox1失去焦点。

答案 7 :(得分:-1)

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

不要忘记:只读=真

答案 8 :(得分:-3)

尝试使用CanFocus属性。

答案 9 :(得分:-3)

@Mystere Man:你可能想要一个不能一直使用的文本框。例如,我允许用户在画布上创建文本框并拖动它们。为了防止它们在拖动时选择和移动文本,我需要禁止用户输入,并且还需要禁用文本选择,因为它会导致延迟,这会影响我的拖动功能。在我的应用程序中,用户只有在双击文本框时才能编辑文本框,然后必须在文本框外部单击才能再次移动它。

我基本上有这个代码(其中t是TextBox):

// Prevent text entry
t.IsReadOnly = true;

// Prevent text selection
t.Focusable = false;

此行为比禁用整个控件(t.Enabled = false)更可取,因为这样也会停止mousedown和doubleclick事件,这会停止拖动并从编辑模式转换为拖动模式。更不用说文本框会变灰了。

答案 10 :(得分:-3)

对我来说这很好用:

textBox.ReadOnly = true