web-dev-qa-db-ja.com

テキストボックスでカーソルを無効にする方法は?

プロパティEnableをfalseに設定せずにテキストボックスでカーソルを無効にする方法はありますか? ReadOnlyプロパティを使用しようとしましたが、テキストボックスに書き込むことができないという事実にもかかわらず、テキストボックスをクリックするとカーソルが表示されます。したがって、このカーソルを永続的に取り除く方法はありますか?

24
Matjas

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);
    }
}
24
Mikhail Semenov

代わりにLabelを使用できます。デザイナーで、BorderStyle = Fixed3DBackColor = WindowおよびAutoSize = False、TextBoxによく似ています。

ただし、TextBoxのカーソルは、テキストがボックスより長い場合にテキストをスクロールできるように提供されています。ラベルが常に収まることが確実でない限り、ラベルを使用するとその機能が失われます。それ以外は、TextBoxからカーソルを削除することはできません。

C#では、テキストボックスがフォーカスを受け取るたびに一時的に無効にしてから再度有効にすることで、テキストボックス内のカーソルを無効にすることができます。このメソッドを使用する場合、テキストボックスを読み取り専用にする必要はありません。例えば:

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

textChangeイベント内にhideCaret関数を配置すると、問題は解決します。

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

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

@Mikhail Semenovのソリューションのように、ラムダエクスプレスを使用して、多くのテキストボックスがなければカーソルをすばやく無効にすることもできます。

[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;
4
Kevin Shieh

私にとって最も簡単な解決策は、on focusイベントをオーバーライドし、親にフォーカスを戻すことでした。これにより、ユーザーによるカーソルとテキストボックスの編集が防止され、基本的に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();
}
4
Troublesum

プログラムで設定できます。

textBox1.Cursor = Cursors.Arrow;
3
Gjaa

これは厳密には質問に対する答えではありませんが、おそらく同様の問題を解決できる可能性があります。テキストボックスコントロールを使用します。これは、スケールを表示するコントロールのラベルのように見えますが、クリックすると編集できます。テキストボックスコントロールの親のマウスハンドラーで、enabled = falseを開始し、有効化(enabled = true)します(無効にすると、ボーダーNoneおよびbackcolor = parent backcolor、ラベルのように見えます)。例えば。ヒットまたは他のイベントを入力すると、KeyDownハンドラーで再度無効になります。 (もちろん、親マウスクリックルーチンは、ラベル/テキストボックスコントロールで実際にマウスクリックが発生したかどうかを確認できます)。 Tabキーを押してアクティブにするためにテキストボックスコントロールが必要な場合は、さらに作業が必要です(私がやったよりも)。フォームコンストラクターを使用して、実行時にテキストボックスの親を見つけ、デリゲートマウスコントロールを適用します。おそらく、コンパイル時にこれを行うことができます(フォームヘッダー)が、私には少しエラーが発生しやすいように見えました。

0
Jan