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

时间:2010-09-16 21:28:45

标签: c# textbox

如果没有将属性Enable设置为false,有没有办法在文本框中禁用光标? 我试图使用ReadOnly属性,但尽管我无法在文本框中写入,但如果单击文本框,则会出现光标。那么有没有办法永久摆脱这个游标?

11 个答案:

答案 0 :(得分:23)

在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);
    }
}

答案 1 :(得分:14)

您可以使用Label代替。在设计器中,您设置BorderStyle = Fixed3DBackColor = WindowAutoSize = False时,它看起来很像TextBox。

但是,提供了TextBox中的光标,以便用户可以在文本长于框时滚动文本。使用Label会丢失该功能,除非您确定它始终适合。除此之外,无法从TextBox中删除光标。

答案 2 :(得分:13)

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

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

答案 3 :(得分:7)

如果你将hideCaret函数放在Textchange事件中,这将解决问题。

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

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

答案 4 :(得分:4)

对我来说,最简单的解决方案就是覆盖焦点事件并将焦点重新放回父节点。这可以防止用户对光标和文本框进行任何编辑,并且基本上禁用文本框而不必设置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 :(得分:4)

与@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;

答案 6 :(得分:3)

您可以以编程方式设置它。

textBox1.Cursor = Cursors.Arrow;

答案 7 :(得分:0)

严格来说,这不是问题的答案,但也许可以解决一些类似的问题。我使用了一个文本框控件,该控件看起来像是显示比例的控件的标签,但是单击后可以对其进行编辑。开始启用=假,并在文本框控件的父级的鼠标处理程序中激活(启用= true)(禁用时,边框为无,而backcolor =父级上色,看起来像一个标签)。例如。输入击中或其他事件时,请在KeyDown处理程序中再次禁用。 (当然,父级鼠标单击例程可以检查是否在标签/文本框控件中真正发生了鼠标单击)。 如果您需要通过选项卡激活文本框控件,则需要做更多的工作(比我已经做的要多)。 我使用窗体构造函数在运行时查找文本框父级,并应用委托鼠标控件。也许您可以在编译时(Form标头)完成此操作,但这对我来说似乎容易出错。

答案 8 :(得分:0)

一种方法是使用View + TabIndex,您可以首先在对话框上为其他一些控件建立索引,如果有的话,让按钮说出来。然后,就好像控件的tabIndex不是第一个即0一样,光标不会在那里出现。

答案 9 :(得分:0)

试试这个,

private void SetText(string text)
{
     textBox1.ReadOnly = false;
     textBox1.Text = text;
     textBox1.ReadOnly = true;
}

答案 10 :(得分:-4)

你可以使用Text Box的 RightToLeft 属性,将其设置为true,你不会摆脱Cursor,但是它会在右上角修复,并且在每个文本后都不会自动出现你输入你的文字框。我用它来开发像Windows Calculator这样的应用程序。