如何禁用文本框中的光标?

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

有没有办法在不将属性启用设置为 false 的情况下禁用文本框中的光标? 我试图使用 ReadOnly 属性,但尽管我无法在文本框中写入,但如果单击文本框,光标就会出现。那么有什么办法可以永久摆脱这个光标呢?

c# textbox
12个回答
28
投票

在 C# 中,您可以使用以下只读文本框:

public class ReadOnlyTextBox : TextBox
{
    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);

    public ReadOnlyTextBox()
    {
        this.ReadOnly = true;
        this.BackColor = Color.White;
        this.GotFocus += TextBoxGotFocus;
        this.Cursor = Cursors.Arrow; // mouse cursor like in other controls
    }

    private void TextBoxGotFocus(object sender, EventArgs args)
    {
        HideCaret(this.Handle);
    }
}

16
投票

在 C# 中,您可以通过暂时禁用文本框,然后在文本框获得焦点时重新启用来禁用文本框中的光标。请注意,如果使用此方法,则无需使文本框只读。例如:

private void TextBox_Enter(object sender, EventArgs e)
{
  TextBox.Enabled = false;
  TextBox.Enabled = true;
}

15
投票

您可以使用

Label
代替。当在设计器中设置
BorderStyle = Fixed3D
BackColor = Window
AutoSize = False
时,它看起来很像一个 TextBox。

但是,文本框中提供了光标,以便用户可以在文本比文本框长时滚动文本。除非您确定它始终适合,否则您将失去标签的功能。除此之外,无法从文本框中删除光标。


10
投票

将 hideCaret 函数放入 TextChanged 事件中即可解决问题:

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

private void textBox1_TextChanged(object sender, EventArgs e)
{
    HideCaret(textBox1.Handle);
}

7
投票

对我来说最简单的解决方案是覆盖焦点事件并将焦点返回到父级。这可以防止用户对文本框进行光标和任何编辑,并且基本上禁用文本框,而无需设置 Enabled = false 属性。

private void Form1_load(object sender, EventArgs e) {
    textBox1.ReadOnly = true;
    textBox1.Cursor = Cursors.Arrow;
    textBox1.GotFocus += textBox1_GotFocus;
}


private void textBox1_GotFocus(object sender, EventArgs e) {
    ((TextBox)sender).Parent.Focus();
}

5
投票

像@Mikhail Semenov的解决方案一样,如果您没有很多文本框应该这样做,您也可以使用 lambda express 快速禁用光标:

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

textBox1.ReadOnly = true;
textBox1.BackColor = Color.White;
textBox1.GotFocus += (s1, e1) => { HideCaret(textBox1.Handle); };
textBox1.Cursor = Cursors.Arrow;

2
投票

您可以通过编程方式进行设置。

textBox1.Cursor = Cursors.Arrow;

0
投票

严格来说这并不是问题的答案,但也许它可以解决一些类似的问题。我使用一个文本框控件,它看起来像一个显示比例的控件的标签,但在单击时可以进行编辑。开始启用 = false 并在文本框控件的父级的鼠标处理程序中进行激活(启用 = true)(禁用时,边框为 None 且背景色 = 父级背景色,看起来像标签)。例如。当输入命中或其他事件时,在 KeyDown 处理程序中再次禁用。 (当然,父鼠标单击例程可以检查鼠标单击是否确实发生在标签/文本框控件中)。 如果您需要通过选项卡激活文本框控件,则需要做更多的工作(比我所做的)。 我使用表单构造函数在运行时查找文本框父级并应用委托鼠标控件。也许您可以在编译时(表单头)中执行此操作,但这对我来说似乎有点容易出错。


0
投票

一种方法是使用 View + TabIndex,您可以首先对对话框上的其他一些控件进行索引,例如按钮(如果有)。然后,如果控件 tabIndex 不是第一个,即 0,光标将不会出现在那里。


0
投票

禁用文本框中的编辑和光标

this.textBox.ReadOnly = true; 
this.textBox.Cursor = Cursors.No;//To show a red cross icon on hover
this.textBox.Cursor = Cursors.Arrow //To disable the cursor

0
投票

我使用了以下内容,按照 Troublesum 的建议工作。

    this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.CustomTextbox_KeyPressed);
    ...
    private void CustomTextbox_KeyPressed(object sender, KeyPressEventArgs e) {
        if ( (Keys)e.KeyChar == Keys.Enter ) {
            ...
            e.Handled = true;
            ((TextBox)sender).Parent.Focus();
        } else {
            ...
        }
    }

-6
投票

您可以使用文本框的 RightToLeft 属性,将其设置为 true,您不会摆脱光标,但它会固定在右上角,并且不会在您在文本框中输入每个文本后自动出现。我用它开发了一个像 Windows 计算器这样的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.