4

;私は、たとえば 、数字で区切られたテキストボックスを持っているC#に要件があります(205)33344455;918845566778;

← Backspaceユーザーが(数字を削除するために)押すと、一度に1文字ずつ削除されます。番号全体を一度に削除したい。

したがって、ユーザーが押すと←</kbd> the first time, the number will be highlighted i.e. if text is (205)33344455;918845566778;, the 918845566778; part will be highlighted in say black, and when the user presses ←</kbd> again the whole number i.e. 918845566778; will be deleted.

テキスト ボックスの特定のセクションを強調表示して、数字全体を削除することは可能ですか?

for次のようなループを使用しました。

for{back=txtPhone.Text.Length;back<=txtPhone.Text.indexOf(';');back--)

しかし、私は望ましい結果を達成することができませんでした。

これに関するヘルプは素晴らしいでしょう。

4

3 に答える 3

0

あなたはできる :

  1. カーソルを含むトークン (つまり、; で終わる番号) を選択します (メソッド selectToken())
  2. バックスペースをもう一度押したときに削除します

例: テキスト ボックスに '(205)33344455; が含まれています。918845566778; 8885554443;'

マウスの左ボタンで 9188455 と 66778 の間をクリックします。(2 番目の番号)

次に、バックスペースを押します

文字列 918845566778; 選ばれる

バックスペースをもう一度押すと、その文字列が削除されます


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Remove_String_from_Text_Box_from_back
{
    public partial class Form1 : Form
    {
    //selects token that contains caret/cursor      
    private void selectToken() {
        string str0 = textBox1.Text;
        int caretPosition = textBox1.SelectionStart;
        int tokenEndsAtIndex = str0.IndexOf(';', caretPosition, (textBox1.Text.Length - caretPosition));
        string prefix = "";
        if (tokenEndsAtIndex == -1)
        {
            tokenEndsAtIndex = str0.IndexOf(';');
        }

        prefix = str0.Substring(0, tokenEndsAtIndex);
        int tokenStartsAtIndex = 0;
        tokenStartsAtIndex = prefix.LastIndexOf(';');
        if (!(tokenStartsAtIndex > -1)) { tokenStartsAtIndex = 0; } else { tokenStartsAtIndex++; }
        textBox1.SelectionStart = tokenStartsAtIndex;
        textBox1.SelectionLength = tokenEndsAtIndex - tokenStartsAtIndex + 1;//may be off by one

    }
 private void selectLastToken(string str0)
        {
            Regex regex = new Regex(@"([\d()]*;)$");
            var capturedGroups = regex.Match(str0);

            int idx0 = 0;
            if (capturedGroups.Captures.Count > 0)
            {
                idx0 = str0.IndexOf(capturedGroups.Captures[0].Value, 0);
                textBox1.Select(idx0, textBox1.Text.Length);
            }
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "(205)33344455;918845566778;";
            textBox1.Select(0, 0);
        }

        //selects last token terminated by ;
        private void selectTextOnBackSpace()
        {
            string str0 = textBox1.Text;
            int idx0 = str0.LastIndexOf(';');
            if (idx0<0)
            {
                idx0 = 0;
            }
            string str1 = str0.Remove(idx0);
            int idx1 = str1.LastIndexOf(';');
            if (idx1 < 0)
            {
                idx1 = 0;
            }
            else
            {
                idx1 += 1;
            }
            textBox1.SelectionStart = idx1;
            textBox1.SelectionLength = str0.Length - idx1;
        }


        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Back )
            {
                if (textBox1.SelectionLength==0)
                {
                    selectToken();
                    e.Handled = true;
                }
                else
                {
                    e.Handled = false;
                }
            }
        }
    }
}
于 2013-04-21T09:06:02.233 に答える
0

頭に浮かんだいことを達成するためのいくつかの方法:

  • テキストボックスをControl.Keydownイベントにサブスクライブして、←</kbd> button and perform the highlight up to the last delimiter (;) using TextBox.SelectionLength meaning a ← Backspace will clear it.

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode != Keys.Left)
                return;
    
            e.SuppressKeyPress = true;
    
            //Select up to previous delimeter (;) here
        }
    
  • リストボックス (または類似のもの) を使用して、入力された区切りデータを保存します。これにより、ユーザーは必要なものを選択し、提供するボタンを使用して削除できます。

于 2013-04-21T08:46:22.087 に答える
0

以下に示すように、要件を実装できます

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (textBox1.Text.Length == 0) return;

    if ((e.KeyChar == (char)Keys.Back) && (textBox1.SelectionLength == 0))
    {
        textBox1.SelectionStart = Math.Max(0, textBox1.Text.Substring(0,textBox1.Text.Length-1).LastIndexOf(';'));
        if (textBox1.Text.Substring(textBox1.SelectionStart, 1) == ";") textBox1.SelectionStart++;
        textBox1.SelectionLength = textBox1.Text.Length-textBox1.SelectionStart ;
        e.Handled = true;
        return;
    }

    if ((e.KeyChar == (char)Keys.Back) && textBox1.SelectionLength >= 0)
    {
        textBox1.Text = textBox1.Text.Substring(0, textBox1.SelectionStart );
        textBox1.SelectionStart = textBox1.Text.Length;
        e.Handled = true;
    }
}
于 2013-04-21T08:50:30.050 に答える