Вкладка в текстовом поле - Вкладка между значением до и после десятичной точки - PullRequest
0 голосов
/ 26 марта 2012

Я новичок в Winform C #. Сейчас у меня сложное требование, но это может быть глупо для вас, ребята.

Может ли кто-нибудь из вас помочь мне с кодом для моего требования ниже.

У меня есть текстовое поле для десятичного значения (количество) в приложении Winform. Я сохранил хорошие проверки и т. Д. Он допускает только 2 цифры после десятичной точки. Также, если пользователь перейдет от предыдущего элемента управления к этому текстовому полю, будет выделено значение whoe (десятичное число в текстовом поле, например, «22223.39»). Все хорошо.

Но мой бизнес-пользователь хочет, например, если он перейдет от предыдущего элемента управления к этому текстовому полю, и предположим, что он хочет изменить цифры после одной десятичной точки в приведенном выше примере, то есть «39», которые они хотят табулировать и просто ввести так, чтобы оно будет перезаписано только новым значением, а значение «22223» останется на месте. Они должны быть в состоянии вернуться вперед и снова.

т. Е. Это похоже, если говорить простыми словами, если пользователь вкладывает текстовое поле, он сначала должен перейти к числовому полю и выделить номер (в приведенном выше примере он должен выделить «22223», а затем, если пользователь снова нажимает клавишу Tab, он должен идти и выделять цифры после десятичной дроби (в приведенном выше примере 39 "). Я не уверен, как это сделать. И, если пользователь снова нажимает на вкладку в третий раз, он должен перейти к следующему элементу управления / текстовое поле (Asusual) .

Но у меня появилась идея оставить 2 текстовых поля, что глупо. Мне нужна та же функциональность, о которой я говорил, и только в текстовом поле и в приложении C # Winform.

Также мне не нужен числовой элемент управления обновлением, который имеет некоторые ограничения по нашему требованию.

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Как справедливо говорит Джереми Томпсон, это плохая идея, поэтому вам, вероятно, следует попытаться убедить пользователя использовать какой-то другой, более стандартный метод ввода.

Тем не менее, в основном как упражнение, чтобы увидеть, смогу ли я сделать эту работу, я придумал следующий подклассовый элемент управления текстовым полем, который ведет себя корректно в каждом испытании, о котором я мог думать, вне головы. Это включает в себя такие вещи, как правильное добавление и вставка текстового поля, а также повторное выделение десятичной части при перемещении стрелки влево назад.

Основной трюк - переопределение IsInputKey - остальная часть кода пришла от меня, когда я тестировал вещи. Если вы в конечном итоге используете что-то, основанное на этом, пожалуйста, тщательно протестируйте его, так как, как и в случае любого искажения стандартной функциональности управления, он может иметь нечетные угловые варианты.

public class TabTextBox : TextBox
{

    public bool ready_to_leave = false;

    protected override void OnEnter(EventArgs e)
    {
        this.SelectionStart = 0; // this.Text.IndexOf(".") + 1;
        this.SelectionLength = this.Text.IndexOf(".");
    }  

    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Tab && !ready_to_leave)
        {
            return true;
        }
        else
        {
            return base.IsInputKey(keyData);
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        ready_to_leave = false;
        base.OnLeave(e);
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (ready_to_leave)
        {
            e.Handled = true;
        }
        base.OnKeyPress(e);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyData == Keys.Tab && !ready_to_leave)
        {
            this.SelectionStart = this.Text.IndexOf(".") + 1;
            this.SelectionLength = 2;
            ready_to_leave = true;
            e.Handled = true;
        }
        else
        {

            base.OnKeyDown(e);
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Left)
        {
            if (this.SelectionStart - 1 < this.Text.IndexOf("."))
                ready_to_leave = false;
        }
        base.OnKeyUp(e);
    }
} 
1 голос
/ 26 марта 2012

Это не очень хорошая идея, это идет вразрез со стандартной работой оконных приложений.

Кроме того, вам придется отключить TabStop на ваших элементах управления и делать вкладки самостоятельно.Я хотел бы поговорить с пользователем с учетом вышесказанного и спросить, нажимать ли «.»было бы достаточно, чтобы выделить десятичные знаки.Вот некоторый код, демонстрирующий мое предлагаемое решение:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyValue == 190 && textBox1.Text.IndexOf(".") > 0)
    {
        textBox1.SelectionStart = textBox1.Text.IndexOf(".") + 1;
        textBox1.SelectionLength = 2;
        e.SuppressKeyPress = true;
    }
}

Если вы хотите, чтобы несколько текстовых полей разделяли эту функцию, перейдите в InitializeComponent () и выполните следующее:

this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
this.textBox2.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
this.textBox3.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...