Как бы я использовал и внедрил MaskedTextBox в свое приложение Calculator? C#

#c# #calculator #maskedtextbox

#c# #калькулятор #maskedtextbox

Вопрос:

Итак, я работаю над приложением calculator на C-Sharp и хочу запретить пользователям вводить более 1 периода / точки одновременно. Таким образом, они не могут вводить «…..» или «1..1» или «1.1.1» на самом деле просто что-то в этом роде…. Я также хотел бы запретить им добавлять алфавитные символы, введя их с клавиатуры, символы типа «a, b, c».

Мне сказали использовать MaskedTextBox, и я хочу знать, правильно ли это. Кроме того, если это правильно, как бы я внедрил это в свой код? Я полный новичок, когда дело доходит до C #, поэтому я хотел бы получить некоторую помощь (смягченную для новичка).

Пока что код, который я написал, является:

     double total1 = 0;
    double total2 = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void btnOne_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnOne.Text;
    }

    private void btnTwo_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnTwo.Text;
    }

    private void btnThree_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnThree.Text;
    }

    private void btnFour_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnFour.Text;
    }

    private void btnFive_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnFive.Text;
    }

    private void btnSix_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnSix.Text;
    }

    private void btnSeven_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnSeven.Text;
    }

    private void btnEight_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnEight.Text;
    }

    private void btnNine_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnNine.Text;
    }

    private void btnZero_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnZero.Text;
    }

    private void btnClear_Click(object sender, EventArgs e)
    {
        txtDisplay.Clear();
    }

    private void btnPlus_Click(object sender, EventArgs e)
    {
        total1 = total1   double.Parse(txtDisplay.Text);
        txtDisplay.Clear();
    }

    private void btnEquals_Click(object sender, EventArgs e)
    {
        total2 = total1   double.Parse(txtDisplay.Text);
        txtDisplay.Text = total2.ToString();
        total1 = 0;

    }

    private void btnPoint_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text   btnPoint.Text;
    }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void txtDisplay_TextChanged(object sender, EventArgs e)
    {

    }
}
  

Итак, я спрашиваю … как / куда мне добавить в это «MaskedTextBox» — если это правильно? Как мне это реализовать? Что заставляет его работать?

Спасибо!

Комментарии:

1. используете ли вы WinForms или WPF? Это похоже на WinForms, но вы должны пометить его.

Ответ №1:

Вам не нужен MaskedTextBox , поскольку вы имитируете клавиатуру с помощью своих кнопок. Просто поместите что-то подобное в btnPoint_Click :

 private void btnPoint_Click(object sender, EventArgs e)     
{         
    if (!txtDisplay.Text.Contains("."))
    {
        txtDisplay.Text = txtDisplay.Text   btnPoint.Text;    
    } 
} 
  

Комментарии:

1. Вопрос касался людей, вводящих символы.

2. Верно. Я не обращал внимания.

3. Это решило мою главную проблему, так что спасибо за это! Я действительно ценю вашу помощь!

4. Нет проблем — друзья не разрешают друзьям использовать MaskedTextBox . 🙂

Ответ №2:

В дополнение к фрагменту MusiGenesis вы можете использовать событие нажатия клавиши текстового поля, чтобы предотвратить использование не цифр и нескольких периодов.

 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if(char.IsDigit(e.KeyChar) || ((e.KeyChar == '.' amp;amp; textBox1.Text.IndexOf(".") < 0) ) )
    {
        textBox1.Text  = e.KeyChar;
    }
    e.Handled = true;
}
  

или установите для ReadOnly свойства текстового поля значение true .

Комментарии:

1. Это приведет к сбою, если курсор находится в середине уже введенного текста.

2.И чтобы добавить к фрагменту Bala’s snippet: это сработает, только если TextBox1 имеет фокус, которого больше не будет при первом нажатии одной из кнопок. Поскольку вы, по-видимому, хотите получать нажатия клавиш независимо ни от чего, вы можете вместо этого установить для KeyPreview свойства формы значение true и добавить обработчик к событию формы KeyPress (и поместить в него код Bala).

3. @Greg положение курсора не будет иметь значения. Начиная с e. Значение Handled равно true, символы добавляются только вручную в этом обработчике событий.

Ответ №3:

Вы также можете сэкономить большое количество кода, если напишете код события click только один раз и присвоите ему обработчики событий click для всех цифровых кнопок:

     private void btnNumber_Click(object sender, EventArgs e)
    {
        if (sender is Button)
            txtDisplay.Text = txtDisplay.Text   ((Button)sender).Text;
    }
  

Таким образом, вы можете сохранить все следующие методы

 private void btnZero_Click(object sender, EventArgs e) (...)
private void btnOne_Click(object sender, EventArgs e) (...)
.
.
.
private void btnNine_Click(object sender, EventArgs e) (...)