4

テキストボックスに永続的なプレフィックスを入力しようとしています。私の場合、次のプレフィックスが必要です。

DOMAIN\

そのため、ユーザーはドメインプレフィックスの後にユーザー名を入力するだけで済みます。それは私がしなければならないことでも、追求しなければならないことでもありませんが、私の質問は好奇心からです。

私はこれを行うためのロジックを考え出そうとしていましたが、これは、どの文字がどこで削除されたかを知り、それらの入力が何であれ、TextChangedEvent事前に追加する必要があることを意味します-このためのロジックを理解することはできませんDOMAIN\行ったこと以外は投稿できません。

public void TextBox1_TextChanged(object sender, EventArgs e)
{
  if(!TextBox1.Text.Contains(@"DOMAIN\")
  {
    //Handle putting Domain in here along with the text that would be determined as the username
  }
}

インターネットを調べても何も見つかりません。winformsテキストボックスのテキストの前に変更できないテキストを付けるにはどうすればよいですか。同様のことをしようとしていましたが、答えは実際には役に立ちません。

プレフィックスDOMAIN\を?に保持する方法についてのアイデアはありTextBoxますか?

4

4 に答える 4

13

ここでは、KISSの原則の使用について説明します。ユーザーがCtrl+Vまたはコンテキストメニューの[切り取りと貼り付け]コマンドを使用している場合、キーの押下をキャッチしようとしても何も起こりません。プレフィックスを曖昧にする何かが起こったときに、単にテキストを復元します。

    private const string textPrefix = @"DOMAIN\";

    private void textBox1_TextChanged(object sender, EventArgs e) {
        if (!textBox1.Text.StartsWith(textPrefix)) {
            textBox1.Text = textPrefix;
            textBox1.SelectionStart = textBox1.Text.Length;
        }
    }

そして、ユーザーが誤ってプレフィックスを編集しないようにします。

    private void textBox1_Enter(object sender, EventArgs e) {
        textBox1.SelectionStart = textBox1.Text.Length;
    }
于 2013-01-25T15:18:01.090 に答える
1

textChangedのイベント引数で、以前の値と新しい値を確認してみませんかDomain\。新しい値にがない場合は、古い値を保持してください。

または、Domain\TextBoxの前にラベルとして表示し、コードの後ろに追加して、最終的なテキストがのようになるようにしませんかDomain\<username>

于 2013-01-25T15:08:55.867 に答える
1

ええ、質問をしたら、これはある程度解決しました...適切な答えが見つからなかったので、将来誰かが同じ質問をする場合に備えて、質問を削除しません。に設定してTextからイベントDomain\を使用しKeyPressました。

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
  e.Handled = (textBox1.GetCharIndexFromPosition(Cursor.Position) < 7);
}

私は人々に私のためにすべての仕事をさせるのではなく、私が尋ねたら仕事を続ける傾向があります:)

于 2013-01-25T15:09:02.550 に答える
0

再利用可能なカスタムTextBoxコントロールはどうですか。コードにコメントがあります

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        textBox1.Prefix = @"DOMAIN\";
    }
}

class PrefixedTextBox : TextBox
{
    private string _prefix = String.Empty;
    public string Prefix
    {
        get { return _prefix; }
        set
        {
            _prefix = value;
            Text = value;
        }
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        // Don't allow Backspace and Delete if the only text is Prefix
        if (Text == Prefix && (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete))
            e.Handled = true;

        // If home key is pressed set cursor just after the prefix
        if (e.KeyCode == Keys.Home)
        {
            e.Handled = true;
            SelectionStart = Prefix.Length;
        }

        // Don't allow cursor to be moved inside Prefix
        if (SelectionStart <= Prefix.Length && (e.KeyCode == Keys.Left || e.KeyCode == Keys.Up))
            e.Handled = true;

        base.OnKeyDown(e);
    }

    protected override void OnClick(EventArgs e)
    {
        EnsureCursorPosition();
        base.OnClick(e);
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        EnsureCursorPosition();

        // this was checked OnKeyDown. This prevents deleting and writing back behaviour
        if (Text == Prefix && e.KeyChar == '\b')
            e.Handled = true;

        base.OnKeyPress(e);
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        // Yet, some how an invalid text is entered fix it by just displaying the Prefix
        if (!Text.StartsWith(Prefix))
            Text = Prefix;

        base.OnKeyUp(e);
    }

    private void EnsureCursorPosition()
    {
        // Never allow cursor position before Prefix
        if (SelectionStart < Prefix.Length)
            SelectionStart = Text.Length;
    }
}
于 2013-01-25T15:52:36.487 に答える