#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) (...)