숫자만 입력할 수 있는 텍스트 상자를 만들려면 어떻게 해야 합니까?
정수 값만 허용하는 텍스트 상자 컨트롤이 있는 Windows 양식 앱이 있습니다.과거에 저는 키프레스 이벤트를 오버로드하고 사양에 맞지 않는 문자만 제거하여 이러한 종류의 검증을 수행했습니다.MaskedTextBox 컨트롤을 살펴보았지만 정규식과 함께 작동하거나 다른 컨트롤의 값에 따라 작동할 수 있는 보다 일반적인 솔루션을 원합니다.
이상적으로는 숫자가 아닌 문자를 누르면 결과가 나오지 않거나 잘못된 문자에 대한 피드백이 즉시 사용자에게 제공되도록 동작합니다.
두 가지 옵션:
대신 를 사용합니다.수치 업다운은 필터링을 수행합니다. 이는 좋은 일입니다.물론 키보드의 위쪽 및 아래쪽 화살표를 눌러 현재 값을 증감할 수도 있습니다.
숫자 입력 이외의 입력을 방지하기 위해 적절한 키보드 이벤트를 처리합니다.표준 TextBox에서 이 두 가지 이벤트 핸들러를 사용하여 성공했습니다.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.')) { e.Handled = true; } // only allow one decimal point if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1)) { e.Handled = true; } }
다음에 대한 검사를 제거할 수 있습니다.'.'
두 개 에 대한 (그리고두개대후검속한사에이상▁for검그사▁(후속▁subsequ▁check▁theent▁moreand'.'
텍스트 상자에서 소수점 이하의 자리를 허용하지 않아야 하는 경우다음에 대한 검사를 추가할 수도 있습니다.'-'
텍스트 상자에서 음수 값을 허용해야 하는 경우.
하려면 다음을합니다.textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
그리고 항상 한 줄로 서서 하는 게 더 재미있기 때문에...
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}
참고: 이렇게 해도 사용자가 이 텍스트 상자에 복사/붙여넣기를 할 수 없습니다.데이터를 안전하게 검사할 수 있는 방법은 아닙니다.
.NET C# 앱을 작성하고 있는 것으로 컨텍스트와 사용한 태그를 보고 있습니다.이 경우 텍스트 변경 이벤트를 구독하고 각 키 스트로크의 유효성을 검사할 수 있습니다.
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
{
MessageBox.Show("Please enter only numbers.");
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
}
}
표준 TextBox에서 파생된 단순한 독립 실행형 Winforms 사용자 지정 컨트롤은 시스템만 허용합니다.Int32 입력(시스템과 같은 다른 유형에 쉽게 적응할 수 있음).Int64 등).복사/붙여넣기 작업과 음수를 지원합니다.
public class Int32TextBox : TextBox
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
NumberFormatInfo fi = CultureInfo.CurrentCulture.NumberFormat;
string c = e.KeyChar.ToString();
if (char.IsDigit(c, 0))
return;
if ((SelectionStart == 0) && (c.Equals(fi.NegativeSign)))
return;
// copy/paste
if ((((int)e.KeyChar == 22) || ((int)e.KeyChar == 3))
&& ((ModifierKeys & Keys.Control) == Keys.Control))
return;
if (e.KeyChar == '\b')
return;
e.Handled = true;
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_PASTE = 0x0302;
if (m.Msg == WM_PASTE)
{
string text = Clipboard.GetText();
if (string.IsNullOrEmpty(text))
return;
if ((text.IndexOf('+') >= 0) && (SelectionStart != 0))
return;
int i;
if (!int.TryParse(text, out i)) // change this for other integer types
return;
if ((i < 0) && (SelectionStart != 0))
return;
}
base.WndProc(ref m);
}
2017년 업데이트: 첫 번째 답변에 몇 가지 문제가 있습니다.
- 지정된 유형의 정수보다 긴 값을 입력할 수 있습니다(예: 2147483648이 Int32보다 큼).최대 값);
- 더 일반적으로, 입력된 결과에 대한 실질적인 검증은 없습니다.
- int32만 처리하므로 각 유형(Int64 등)에 대해 특정 TextBox 파생 컨트롤을 작성해야 합니다.
그래서 저는 복사/붙여넣기, + 및 - 기호 등을 지원하는 보다 일반적인 다른 버전을 고안했습니다.
public class ValidatingTextBox : TextBox
{
private string _validText;
private int _selectionStart;
private int _selectionEnd;
private bool _dontProcessMessages;
public event EventHandler<TextValidatingEventArgs> TextValidating;
protected virtual void OnTextValidating(object sender, TextValidatingEventArgs e) => TextValidating?.Invoke(sender, e);
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (_dontProcessMessages)
return;
const int WM_KEYDOWN = 0x100;
const int WM_ENTERIDLE = 0x121;
const int VK_DELETE = 0x2e;
bool delete = m.Msg == WM_KEYDOWN && (int)m.WParam == VK_DELETE;
if ((m.Msg == WM_KEYDOWN && !delete) || m.Msg == WM_ENTERIDLE)
{
DontProcessMessage(() =>
{
_validText = Text;
_selectionStart = SelectionStart;
_selectionEnd = SelectionLength;
});
}
const int WM_CHAR = 0x102;
const int WM_PASTE = 0x302;
if (m.Msg == WM_CHAR || m.Msg == WM_PASTE || delete)
{
string newText = null;
DontProcessMessage(() =>
{
newText = Text;
});
var e = new TextValidatingEventArgs(newText);
OnTextValidating(this, e);
if (e.Cancel)
{
DontProcessMessage(() =>
{
Text = _validText;
SelectionStart = _selectionStart;
SelectionLength = _selectionEnd;
});
}
}
}
private void DontProcessMessage(Action action)
{
_dontProcessMessages = true;
try
{
action();
}
finally
{
_dontProcessMessages = false;
}
}
}
public class TextValidatingEventArgs : CancelEventArgs
{
public TextValidatingEventArgs(string newText) => NewText = newText;
public string NewText { get; }
}
Int32의 경우 다음과 같이 파생할 수 있습니다.
public class Int32TextBox : ValidatingTextBox
{
protected override void OnTextValidating(object sender, TextValidatingEventArgs e)
{
e.Cancel = !int.TryParse(e.NewText, out int i);
}
}
또는 파생 없이 다음과 같은 새 TextValidating 이벤트를 사용합니다.
var vtb = new ValidatingTextBox();
...
vtb.TextValidating += (sender, e) => e.Cancel = !int.TryParse(e.NewText, out int i);
하지만 좋은 점은 어떤 문자열이든, 어떤 검증 루틴이든 작동한다는 것입니다.
이것이 바로 검증/검증 이벤트의 목적입니다.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx 에 대한 MSDN 기사가 있습니다.
버전.TL;DR 파일: 을확니다를 합니다.하고 Validate를 합니다.e.Cancel=True
데이터가 유효하지 않은 경우.
정면지 l정 =취소=참, 사용자는 필드를 떠날 수 없지만, 사용자는 문제가 있다는 피드백을 제공해야 합니다.저는 문제를 나타내기 위해 상자의 배경색을 밝은 빨간색으로 변경합니다.다음으로 설정해야 합니다.SystemColors.Window
유효성 검사가 양호한 값으로 호출된 경우.
마스크된 텍스트 상자를 사용해 보십시오.간단한 마스크 형식을 사용하므로 숫자, 날짜 등으로 입력을 제한할 수 있습니다.
당신은 할 수 .TextChanged
private void textBox_BiggerThan_TextChanged(object sender, EventArgs e)
{
long a;
if (! long.TryParse(textBox_BiggerThan.Text, out a))
{
// If not int clear textbox text or Undo() last operation
textBox_LessThan.Clear();
}
}
이것은 유용할 수 있습니다.적절한 소수점과 앞의 더하기 또는 빼기 기호를 포함하여 "실제" 숫자 값을 허용합니다.관련 KeyPress 이벤트 내에서 호출합니다.
private bool IsOKForDecimalTextBox(char theCharacter, TextBox theTextBox)
{
// Only allow control characters, digits, plus and minus signs.
// Only allow ONE plus sign.
// Only allow ONE minus sign.
// Only allow the plus or minus sign as the FIRST character.
// Only allow ONE decimal point.
// Do NOT allow decimal point or digits BEFORE any plus or minus sign.
if (
!char.IsControl(theCharacter)
&& !char.IsDigit(theCharacter)
&& (theCharacter != '.')
&& (theCharacter != '-')
&& (theCharacter != '+')
)
{
// Then it is NOT a character we want allowed in the text box.
return false;
}
// Only allow one decimal point.
if (theCharacter == '.'
&& theTextBox.Text.IndexOf('.') > -1)
{
// Then there is already a decimal point in the text box.
return false;
}
// Only allow one minus sign.
if (theCharacter == '-'
&& theTextBox.Text.IndexOf('-') > -1)
{
// Then there is already a minus sign in the text box.
return false;
}
// Only allow one plus sign.
if (theCharacter == '+'
&& theTextBox.Text.IndexOf('+') > -1)
{
// Then there is already a plus sign in the text box.
return false;
}
// Only allow one plus sign OR minus sign, but not both.
if (
(
(theCharacter == '-')
|| (theCharacter == '+')
)
&&
(
(theTextBox.Text.IndexOf('-') > -1)
||
(theTextBox.Text.IndexOf('+') > -1)
)
)
{
// Then the user is trying to enter a plus or minus sign and
// there is ALREADY a plus or minus sign in the text box.
return false;
}
// Only allow a minus or plus sign at the first character position.
if (
(
(theCharacter == '-')
|| (theCharacter == '+')
)
&& theTextBox.SelectionStart != 0
)
{
// Then the user is trying to enter a minus or plus sign at some position
// OTHER than the first character position in the text box.
return false;
}
// Only allow digits and decimal point AFTER any existing plus or minus sign
if (
(
// Is digit or decimal point
char.IsDigit(theCharacter)
||
(theCharacter == '.')
)
&&
(
// A plus or minus sign EXISTS
(theTextBox.Text.IndexOf('-') > -1)
||
(theTextBox.Text.IndexOf('+') > -1)
)
&&
// Attempting to put the character at the beginning of the field.
theTextBox.SelectionStart == 0
)
{
// Then the user is trying to enter a digit or decimal point in front of a minus or plus sign.
return false;
}
// Otherwise the character is perfectly fine for a decimal value and the character
// may indeed be placed at the current insertion position.
return true;
}
사용하기만 하면 됩니다.NumericUpDown
흉한 아래 을 어하고보흉아한래버튼가설시다정니합을성으로 합니다.false
.
numericUpDown1.Controls[0].Visible = false;
NumericUpDown
는 실제로 '스핀 박스'(위쪽 버튼), 텍스트 상자 및 이 모든 것을 검증하고 왜곡하기 위한 일부 코드를 포함하는 컨트롤 모음입니다.
표시:
YourNumericUpDown.Controls[0].visible = false
기본 코드를 활성화한 상태로 유지하면서 단추를 숨깁니다.
명확한 해결책은 아니지만 간단하고 효과적입니다. .Controls[1]
대신 텍스트 상자 부분을 숨길 수 있습니다.
WinForms에서 누락된 항목을 완료하기 위해 구성 요소 모음을 작업해 왔습니다. 여기에 고급 양식이 있습니다.
특히 이 클래스는 Regex TextBox에 대한 클래스입니다.
/// <summary>Represents a Windows text box control that only allows input that matches a regular expression.</summary>
public class RegexTextBox : TextBox
{
[NonSerialized]
string lastText;
/// <summary>A regular expression governing the input allowed in this text field.</summary>
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public virtual Regex Regex { get; set; }
/// <summary>A regular expression governing the input allowed in this text field.</summary>
[DefaultValue(null)]
[Category("Behavior")]
[Description("Sets the regular expression governing the input allowed for this control.")]
public virtual string RegexString {
get {
return Regex == null ? string.Empty : Regex.ToString();
}
set {
if (string.IsNullOrEmpty(value))
Regex = null;
else
Regex = new Regex(value);
}
}
protected override void OnTextChanged(EventArgs e) {
if (Regex != null && !Regex.IsMatch(Text)) {
int pos = SelectionStart - Text.Length + (lastText ?? string.Empty).Length;
Text = lastText;
SelectionStart = Math.Max(0, pos);
}
lastText = Text;
base.OnTextChanged(e);
}
}
단순히 다음과 같은 것을 추가하는 것.myNumbericTextBox.RegexString = "^(\\d+|)$";
충분할 겁니다.
텍스트 상자에서 이 코드를 사용합니다.
private void textBox1_TextChanged(object sender, EventArgs e)
{
double parsedValue;
if (!double.TryParse(textBox1.Text, out parsedValue))
{
textBox1.Text = "";
}
}
음수를 포함하여 정수와 부동 소수를 모두 허용해야 합니다.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// Text
string text = ((Control) sender).Text;
// Is Negative Number?
if (e.KeyChar == '-' && text.Length == 0)
{
e.Handled = false;
return;
}
// Is Float Number?
if (e.KeyChar == '.' && text.Length > 0 && !text.Contains("."))
{
e.Handled = false;
return;
}
// Is Digit?
e.Handled = (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar));
}
저는 이것을 위해 CodePlex에서 무언가를 만들었습니다.
TextChanged 이벤트를 가로채서 작동합니다.결과가 양호한 경우 저장됩니다.잘못된 경우 마지막 양호한 값이 복원됩니다.소스가 너무 커서 여기에 게시할 수 없지만 이 논리의 핵심을 처리하는 클래스에 대한 링크가 있습니다.
웹 의▁an▁in를 추가할 수 .onkeypress
숫자만 허용하는 이벤트입니다.메시지는 표시되지 않지만 잘못된 입력을 방지합니다.저에게는 효과가 있었고, 사용자는 숫자 외에는 아무것도 입력할 수 없었습니다.
<asp:TextBox runat="server" ID="txtFrom"
onkeypress="if(isNaN(String.fromCharCode(event.keyCode))) return false;">
이것이 제 접근 방식입니다.
- linq 사용(필터를 수정할 수 없음)
- 복사/복사 증명 코드
- 금지된 문자를 누를 때 캐럿 위치 유지
- 왼쪽 0을 사용할 수 있습니다.
및 임의의 크기 숫자
private void numeroCuenta_TextChanged(object sender, EventArgs e) { string org = numeroCuenta.Text; string formated = string.Concat(org.Where(c => (c >= '0' && c <= '9'))); if (formated != org) { int s = numeroCuenta.SelectionStart; if (s > 0 && formated.Length > s && org[s - 1] != formated[s - 1]) s--; numeroCuenta.Text = formated; numeroCuenta.SelectionStart = s; } }
이것은 .NET 5/Core를 사용하는 쉽고 간편한 방법입니다.
private void textBox1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyData != Keys.Back)
e.SuppressKeyPress = !int.TryParse(Convert.ToString((char) e.KeyData), out int _);
}
편집: 백스페이스 키에 대한 지원이 추가되었습니다.
TextChanged/Keypress 이벤트를 사용하여 정규식을 사용하여 숫자를 필터링하고 일부 작업을 수행할 수 있습니다.
KeyDown 이벤트에서 처리하겠습니다.
void TextBox_KeyDown(object sender, KeyEventArgs e)
{
char c = Convert.ToChar(e.PlatformKeyCode);
if (!char.IsDigit(c))
{
e.Handled = true;
}
}
private void txt3_KeyPress(object sender, KeyPressEventArgs e)
{
for (int h = 58; h <= 127; h++)
{
if (e.KeyChar == h) //58 to 127 is alphabets tat will be blocked
{
e.Handled = true;
}
}
for(int k=32;k<=47;k++)
{
if (e.KeyChar == k) //32 to 47 are special characters tat will
{ be blocked
e.Handled = true;
}
}
}
시도해보세요 이것은 매우 간단합니다.
ProcessCmdKey 및 OnKeyPress 이벤트를 사용하는 솔루션을 텍스트 상자에 게시했습니다.주석은 정규식을 사용하여 키 누름 및 적절한 차단/허용을 확인하는 방법을 보여줍니다.
안녕하세요. 텍스트 상자의 텍스트 변경 이벤트에서 이와 같은 작업을 수행할 수 있습니다.
여기 데모가 있습니다.
private void textBox1_TextChanged(object sender, EventArgs e)
{
string actualdata = string.Empty;
char[] entereddata = textBox1.Text.ToCharArray();
foreach (char aChar in entereddata.AsEnumerable())
{
if (Char.IsDigit(aChar))
{
actualdata = actualdata + aChar;
// MessageBox.Show(aChar.ToString());
}
else
{
MessageBox.Show(aChar + " is not numeric");
actualdata.Replace(aChar, ' ');
actualdata.Trim();
}
}
textBox1.Text = actualdata;
}
이 질문에 대한 현재 답변 중 많은 부분이 입력 텍스트를 수동으로 구문 분석하는 것 같습니다. 유형 특기 제공숫예유형자본정예▁type(유:형▁(▁if자숫▁a)을 int
또는double
유형의 이 어떨까요?TryParse
? 예:
public class IntTextBox : TextBox
{
string PreviousText = "";
int BackingResult;
public IntTextBox()
{
TextChanged += IntTextBox_TextChanged;
}
public bool HasResult { get; private set; }
public int Result
{
get
{
return HasResult ? BackingResult : default(int);
}
}
void IntTextBox_TextChanged(object sender, EventArgs e)
{
HasResult = int.TryParse(Text, out BackingResult);
if (HasResult || string.IsNullOrEmpty(Text))
{
// Commit
PreviousText = Text;
}
else
{
// Revert
var changeOffset = Text.Length - PreviousText.Length;
var previousSelectionStart =
Math.Max(0, SelectionStart - changeOffset);
Text = PreviousText;
SelectionStart = previousSelectionStart;
}
}
}
Visual Studio의 Designer와 호환되는 좀 더 일반적인 것을 원하는 경우:
public class ParsableTextBox : TextBox
{
TryParser BackingTryParse;
string PreviousText = "";
object BackingResult;
public ParsableTextBox()
: this(null)
{
}
public ParsableTextBox(TryParser tryParse)
{
TryParse = tryParse;
TextChanged += ParsableTextBox_TextChanged;
}
public delegate bool TryParser(string text, out object result);
public TryParser TryParse
{
set
{
Enabled = !(ReadOnly = value == null);
BackingTryParse = value;
}
}
public bool HasResult { get; private set; }
public object Result
{
get
{
return GetResult<object>();
}
}
public T GetResult<T>()
{
return HasResult ? (T)BackingResult : default(T);
}
void ParsableTextBox_TextChanged(object sender, EventArgs e)
{
if (BackingTryParse != null)
{
HasResult = BackingTryParse(Text, out BackingResult);
}
if (HasResult || string.IsNullOrEmpty(Text))
{
// Commit
PreviousText = Text;
}
else
{
// Revert
var changeOffset = Text.Length - PreviousText.Length;
var previousSelectionStart =
Math.Max(0, SelectionStart - changeOffset);
Text = PreviousText;
SelectionStart = previousSelectionStart;
}
}
}
마지막으로, 완전히 일반적인 것을 원하지만 디자이너 지원에 관심이 없는 경우:
public class ParsableTextBox<T> : TextBox
{
TryParser BackingTryParse;
string PreviousText;
T BackingResult;
public ParsableTextBox()
: this(null)
{
}
public ParsableTextBox(TryParser tryParse)
{
TryParse = tryParse;
TextChanged += ParsableTextBox_TextChanged;
}
public delegate bool TryParser(string text, out T result);
public TryParser TryParse
{
set
{
Enabled = !(ReadOnly = value == null);
BackingTryParse = value;
}
}
public bool HasResult { get; private set; }
public T Result
{
get
{
return HasResult ? BackingResult : default(T);
}
}
void ParsableTextBox_TextChanged(object sender, EventArgs e)
{
if (BackingTryParse != null)
{
HasResult = BackingTryParse(Text, out BackingResult);
}
if (HasResult || string.IsNullOrEmpty(Text))
{
// Commit
PreviousText = Text;
}
else
{
// Revert
var changeOffset = Text.Length - PreviousText.Length;
var previousSelectionStart =
Math.Max(0, SelectionStart - changeOffset);
Text = PreviousText;
SelectionStart = previousSelectionStart;
}
}
}
Fabio Iotti의 답변에 설명된 접근 방식을 사용하여 보다 일반적인 솔루션을 만들었습니다.
public abstract class ValidatedTextBox : TextBox {
private string m_lastText = string.Empty;
protected abstract bool IsValid(string text);
protected sealed override void OnTextChanged(EventArgs e) {
if (!IsValid(Text)) {
var pos = SelectionStart - Text.Length + m_lastText.Length;
Text = m_lastText;
SelectionStart = Math.Max(0, pos);
}
m_lastText = Text;
base.OnTextChanged(e);
}
}
모든 중요하지 않은 유효성 검사 동작을 포함하는 "유효성 검사 텍스트 상자"입니다.이제 이 클래스에서 상속하고 "IsValid" 메서드를 필요한 유효성 검사 로직으로 재정의하는 작업만 남았습니다.예를 들어, 이 클래스를 사용하여 "Regexed"를 만들 수 있습니다.특정 정규식과 일치하는 문자열만 허용하는 TextBox":
public abstract class RegexedTextBox : ValidatedTextBox {
private readonly Regex m_regex;
protected RegexedTextBox(string regExpString) {
m_regex = new Regex(regExpString);
}
protected override bool IsValid(string text) {
return m_regex.IsMatch(Text);
}
}
그 후에, "레식티드"로부터 상속받습니다.TextBox" 클래스를 사용하면 "PositiveNumber"를 쉽게 만들 수 있습니다.텍스트 상자" 및 "양의 부동 소수점 번호"텍스트 상자" 컨트롤:
public sealed class PositiveNumberTextBox : RegexedTextBox {
public PositiveNumberTextBox() : base(@"^\d*$") { }
}
public sealed class PositiveFloatingPointNumberTextBox : RegexedTextBox {
public PositiveFloatingPointNumberTextBox()
: base(@"^(\d+\" + CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + @")?\d*$") { }
}
죽은 자들을 깨워서 미안하지만, 누군가가 나중에 참고할 수 있을 거라고 생각했어요.
여기 제가 처리하는 방법이 있습니다.부동 소수점 번호를 처리하지만 정수에 대해 쉽게 수정할 수 있습니다.
기본적으로 0 - 9 및 를 누를 수 있습니다.
앞에는 0만 사용할 수 있습니다.
다른 모든 문자는 무시되고 커서 위치는 유지됩니다.
private bool _myTextBoxChanging = false;
private void myTextBox_TextChanged(object sender, EventArgs e)
{
validateText(myTextBox);
}
private void validateText(TextBox box)
{
// stop multiple changes;
if (_myTextBoxChanging)
return;
_myTextBoxChanging = true;
string text = box.Text;
if (text == "")
return;
string validText = "";
bool hasPeriod = false;
int pos = box.SelectionStart;
for (int i = 0; i < text.Length; i++ )
{
bool badChar = false;
char s = text[i];
if (s == '.')
{
if (hasPeriod)
badChar = true;
else
hasPeriod = true;
}
else if (s < '0' || s > '9')
badChar = true;
if (!badChar)
validText += s;
else
{
if (i <= pos)
pos--;
}
}
// trim starting 00s
while (validText.Length >= 2 && validText[0] == '0')
{
if (validText[1] != '.')
{
validText = validText.Substring(1);
if (pos < 2)
pos--;
}
else
break;
}
if (pos > validText.Length)
pos = validText.Length;
box.Text = validText;
box.SelectionStart = pos;
_myTextBoxChanging = false;
}
다음은 빠르게 수정된 int 버전입니다.
private void validateText(TextBox box)
{
// stop multiple changes;
if (_myTextBoxChanging)
return;
_myTextBoxChanging = true;
string text = box.Text;
if (text == "")
return;
string validText = "";
int pos = box.SelectionStart;
for (int i = 0; i < text.Length; i++ )
{
char s = text[i];
if (s < '0' || s > '9')
{
if (i <= pos)
pos--;
}
else
validText += s;
}
// trim starting 00s
while (validText.Length >= 2 && validText.StartsWith("00"))
{
validText = validText.Substring(1);
if (pos < 2)
pos--;
}
if (pos > validText.Length)
pos = validText.Length;
box.Text = validText;
box.SelectionStart = pos;
_myTextBoxChanging = false;
}
이것은 복사 및 붙여넣기, 드래그 앤 드롭, 키다운, 오버플로 방지 및 매우 간단합니다.
public partial class IntegerBox : TextBox
{
public IntegerBox()
{
InitializeComponent();
this.Text = 0.ToString();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
private String originalValue = 0.ToString();
private void Integerbox_KeyPress(object sender, KeyPressEventArgs e)
{
originalValue = this.Text;
}
private void Integerbox_TextChanged(object sender, EventArgs e)
{
try
{
if(String.IsNullOrWhiteSpace(this.Text))
{
this.Text = 0.ToString();
}
this.Text = Convert.ToInt64(this.Text.Trim()).ToString();
}
catch (System.OverflowException)
{
MessageBox.Show("Value entered is to large max value: " + Int64.MaxValue.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Text = originalValue;
}
catch (System.FormatException)
{
this.Text = originalValue;
}
catch (System.Exception ex)
{
this.Text = originalValue;
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK , MessageBoxIcon.Error);
}
}
}
사용자가 잘못된 텍스트를 에 붙여넣을 수 있음을 잊지 마십시오.TextBox
.
이를 제한하려면 다음 코드를 따르십시오.
private void ultraTextEditor1_TextChanged(object sender, EventArgs e)
{
string append="";
foreach (char c in ultraTextEditor1.Text)
{
if ((!Char.IsNumber(c)) && (c != Convert.ToChar(Keys.Back)))
{
}
else
{
append += c;
}
}
ultraTextEditor1.Text = append;
}
나는 또한 텍스트 상자에서 숫자만 확인하는 가장 좋은 방법을 찾고 있었고 키프레스의 문제는 오른쪽 클릭이나 클립보드에 의한 복사 붙여넣기를 지원하지 않기 때문에 커서가 텍스트 필드를 떠날 때를 확인하고 빈 필드도 확인하는 이 코드를 고안했습니다. (새로운 사람의 적응 버전)
private void txtFirstValue_MouseLeave(object sender, EventArgs e)
{
int num;
bool isNum = int.TryParse(txtFirstValue.Text.Trim(), out num);
if (!isNum && txtFirstValue.Text != String.Empty)
{
MessageBox.Show("The First Value You Entered Is Not a Number, Please Try Again", "Invalid Value Detected", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtFirstValue.Clear();
}
}
여기 30개 이상의 답이 있고 많은 답이 도움이 됩니다.하지만 저는 시스템에 대한 일반화된 형태를 공유하고 싶습니다.윈도우.Forms.TextBox 및 시스템.윈도우.컨트롤.텍스트 상자.
시스템에 사용 가능한 키 누르기 이벤트가 없습니다.윈도우.컨트롤.텍스트 상자.이 답변은 시스템에 대해 동일한 논리로 구현하려는 사용자를 위한 것입니다.윈도우.Forms.TextBox 및 시스템.윈도우.컨트롤.텍스트 상자.
번호입니다.텍스트 상자 코드.시스템의 경우 이전 줄 대신 주석이 달린 줄을 사용합니다.윈도우.컨트롤.텍스트 상자.
public class NumberTextBox : System.Windows.Forms.TextBox
//public class NumberTextBox : System.Windows.Controls.TextBox
{
private double _maxValue;
private double _minValue;
private bool _flag;
private string _previousValue;
public NumberTextBox()
{
this.TextAlign = HorizontalAlignment.Right;
//TextAlignment = TextAlignment.Right;
KeyDown += TextBox_KeyDown;
TextChanged += TextBox_TextChanged;
_minValue = double.MinValue;
_maxValue = double.MaxValue;
}
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
_previousValue = this.Text;
_flag = this.SelectedText.Length > 0;
}
private void TextBox_TextChanged(object sender, EventArgs e)
//private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var text = this.Text;
if (text.Length < 1) return;
var cursorPosition = SelectionStart == 0 ? SelectionStart : SelectionStart - 1;
var insertedChar = text[cursorPosition];
if (IsInvalidInput(insertedChar, cursorPosition, text))
{
HandleText(text, cursorPosition);
}
ValidateRange(text, cursorPosition);
}
private bool IsInvalidInput(char insertedChar, int cursorPosition, string text)
{
return !char.IsDigit(insertedChar) && insertedChar != '.' && insertedChar != '-' ||
insertedChar == '-' && cursorPosition != 0 ||
text.Count(x => x == '.') > 1 ||
text.Count(x => x == '-') > 1;
}
private void HandleText(string text, int cursorPosition)
{
this.Text = _flag ? _previousValue : text.Remove(cursorPosition, 1);
this.SelectionStart = cursorPosition;
this.SelectionLength = 0;
}
private void ValidateRange(string text, int cursorPosition)
{
try
{
if (text == "." || _minValue < 0 && text == "-") return;
var doubleValue = Convert.ToDouble(text);
if (doubleValue > _maxValue || doubleValue < _minValue)
{
HandleText(text, cursorPosition);
}
}
catch (Exception)
{
HandleText(text, cursorPosition);
}
}
protected void SetProperties(double minValue = double.MinValue, double maxValue = double.MaxValue)
{
_minValue = minValue;
_maxValue = maxValue;
}
}
양수텍스트 상자 코드:
public class PositiveNumberTextBox : NumberTextBox
{
public PositiveNumberTextBox()
{
SetProperties(0);
}
}
분수 수텍스트 상자 코드:
public class FractionNumberTextBox : NumberTextBox
{
public FractionNumberTextBox()
{
SetProperties(0, 0.999999);
}
}
한 줄 코드 소수점 허용
private void txtQty_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = e.KeyChar != '.' && !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}
int Number;
bool isNumber;
isNumber = int32.TryPase(textbox1.text, out Number);
if (!isNumber)
{
(code if not an integer);
}
else
{
(code if an integer);
}
언급URL : https://stackoverflow.com/questions/463299/how-do-i-make-a-textbox-that-only-accepts-numbers
'source' 카테고리의 다른 글
앱스토어의 앱에 대한 업데이트를 통해 NSUserDefaults가 유지됩니까? (0) | 2023.06.01 |
---|---|
Postgres - FATAL: 데이터베이스 파일이 서버와 호환되지 않습니다. (0) | 2023.06.01 |
엔티티 프레임워크와 LINQ 간 SQL 비교 (0) | 2023.06.01 |
SQLSERVER에 AGG 나열 (0) | 2023.06.01 |
안드로이드에서 글로벌 변수를 선언하는 방법은 무엇입니까? (0) | 2023.06.01 |