7

複数のテキストボックスを持つ C# Winforms プログラムがあります。各ボックスのプロパティを使用してテキストを配置し、ユーザーにどのような値が入るかを説明しました。ユーザーがそのボックスを選択するたびにテキストを強調表示したい。タブ移動またはマウスクリックのいずれかによって。テキストボックスの外側のどこかにある値を表示する方法があれば、これを行う必要はありません。

Textbox.select メソッドを試しましたが、効果がありませんでした。これも同じ。

これが私のプログラムのスクリーンショットです。

私のコード:

    private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
    {
        grapplingText1.SelectionStart = 0;
        grapplingText1.SelectionLength = grapplingText1.Text.Length;

これで十分ですか、それとももっと必要ですか?

4

7 に答える 7

8

その中に「テキストボックスの目的について話す」をすべて割り当てToolTipTextBox入れてみませんか?

ToolTipフォーム内にドラッグ&ドロップするだけです。そして、各TextBoxプロパティで、その他のセクションToolTipに追加のエントリが必要ですtoolTip1(または、名前を変更した場合の名前は何でも)。

次に、ユーザーがカーソルを合わせてTextBox(読み取り専用/無効TextBoxにするとツールヒントが表示されないようです)、そこで1秒間停止すると、ツールヒントが適切な情報とともに表示されます。

最終的には、何が何であるかLabelTextBox言う代わりに a を使用することもできますが、aToolTipを使用することで、ユーザーにより多くの情報を説明することもできます。

イベントを設定したり、SelectAll を処理したりして、長い道のりを歩む必要がないように、WaterMark で何かを行うには、このようにすることができます。新しい watermark.cs ファイルを作成し、このコードに置き換えます。プログラムの名前空間と一致するように名前空間を変更したことを確認してください。

#region
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

#endregion

namespace Watermark {
    public static class TextBoxWatermarkExtensionMethod {
        private const uint ECM_FIRST = 0x1500;
        private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
        public static void SetWatermark(this TextBox textBox, string watermarkText) {
            SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText);
        }
    }
}
   internal class WatermarkTextBox : TextBox {
    private const uint ECM_FIRST = 0x1500;
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
    private string watermarkText;
    public string WatermarkText {
        get { return watermarkText; }
        set {
            watermarkText = value;
            SetWatermark(watermarkText);
        }
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
    private void SetWatermark(string watermarkText) {
        SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText);
    }
}

フォームでは、次のようにアクティブ化します。

textBoxYourWhatever.SetWatermark("Text that should display");

TextBoxが空である限り、そこにとどまります。ユーザーがTextBoxテキストに入ると消えます。TextBox(ユーザーによって、または自動的に) が消去されると、再び表示されます。特別な行事等は必要ありません。

編集:

Designer で利用可能になる新しい WaterMarkTexBox を簡単に使用するためのオプションを提供する内部クラス WaterMarkTextBox も追加しました。次に、それをデザイナーにドラッグ アンド ドロップして使用します。通常のテキストボックスのように動作し、追加のフィールド WaterMarkText を提供するだけです。

私はまだ最初の方法を好みます。GUIを再度再構築する必要はありません。

于 2010-03-09T22:05:50.613 に答える
7

選択したいテキストの量がわかっている場合は、 .select が機能すると思います。

.SelectAll(); を試してください。それはあなたのために働くはずです

于 2010-03-09T21:30:55.380 に答える
3

コントロールにフォーカスを移すには、TextBox.Focus() を使用する必要があります。それが自動的に機能しない場合は、Enter() イベントで SelectAll() メソッドを呼び出すだけです。

private TextBox1_Enter(object sender, EventArgs e) {    
    TextBoxTextHighlight(sender, null);
}

private TextBox2_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

private TextBox3_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

// And so forth...

private void TextBoxTextHighlight(object sender, EventArgs e) {
    (sender as TextBox).SelectAll();
}

このメソッドを使用すると、任意の TextBoxX_Enter() イベント ハンドラーから呼び出すことができます。

それ以外の場合は、新しい UserControl を作成し、作成時に好きな名前を付けてから、プロジェクトに作成するときにコードを編集し、UserControl クラスの継承を TextBox クラスに置き換えて、その中でデフォルトの動作を定義することもできます。この SelectAll() メソッドへの呼び出しのように、Enter() イベントを実行し、それを保護された仮想にし、コンストラクター内で、次のようにイベント ハンドラーをサブスクライブできます。

public partial class CustomTextBox : TextBox {
    public CustomTextBox() 
        : base() {
        this.Enter += new EventHandler(Enter);
    }

    protected virtual Enter(object sender, EventArgs e) {
        this.SelectAll();
    }
}

その場で書いたので、おそらくいくつかの変更が必要ですが、アイデアが得られるかもしれません. しかし、適切な状況でそれを行う価値が本当にない限り、そうすることはお勧めしません. 単純であるほど良いです。最も単純なのは、フォームの TextBox ごとにイベント ハンドラーを作成し、TextBoxTextHighlight() メソッドを呼び出すことです。

于 2010-03-09T21:30:58.047 に答える
2

テキストボックスの名前が「MyTextBox」であるとします

Focus イベントを処理するメソッドを作成できます。

private void MyTextBox_GotFocus(object sender, EventArgs e)
{
    MyTextBox.SelectionStart = 0;
    MyTextBox.SelectionLength = MyTextBox.Text.Length;
    MyTextBox.Select();
}

イベント ハンドラも追加する必要があります。

this.MyTextBox.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);

これはうまくいくはずです...

編集

イベントハンドラを追加するだけで、他のテキストボックスにも同じ方法を使用できます。

this.MyTextBox2.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox3.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox4.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
//...
于 2010-03-09T21:34:00.460 に答える
-1

私のアプリケーションでは、ハイライト メソッドを Focus -> Enter イベントにアタッチすると、SelectAll() メソッドではうまく機能しないことがわかりました。代わりに Action -> Click (これはマウスでしか機能しないと思います) を使用し、そこに強調表示方法を追加しました。今では魅力のように機能します。

于 2014-10-29T18:21:52.090 に答える