Saya memiliki aplikasi bentuk windows dengan kontrol kotak teks yang saya ingin hanya menerima nilai integer. Di masa lalu saya telah melakukan validasi semacam ini dengan membebani acara KeyPress dan hanya menghapus karakter yang tidak sesuai dengan spesifikasi. Saya telah melihat kontrol MaskedTextBox tetapi saya ingin solusi yang lebih umum yang dapat bekerja dengan mungkin ekspresi reguler, atau bergantung pada nilai-nilai kontrol lain.
Idealnya ini akan berperilaku sedemikian sehingga menekan karakter non numerik akan menghasilkan hasil atau segera memberikan umpan balik kepada pengguna tentang karakter yang tidak valid.
Jawaban:
Dua pilihan:
Gunakan
NumericUpDown
saja. NumericUpDown melakukan penyaringan untuk Anda, yang bagus. Tentu saja itu juga memberi pengguna Anda kemampuan untuk menekan panah naik dan turun pada keyboard untuk menambah dan mengurangi nilai saat ini.Tangani acara keyboard yang sesuai untuk mencegah apa pun selain input numerik. Saya sudah sukses dengan dua penangan acara ini di TextBox standar:
Anda dapat menghapus cek untuk
'.'
(dan cek berikutnya untuk lebih dari satu'.'
) jika TextBox Anda tidak boleh mengizinkan tempat desimal. Anda juga bisa menambahkan tanda centang untuk'-'
apakah TextBox Anda harus mengizinkan nilai negatif.Jika Anda ingin membatasi pengguna untuk jumlah digit, gunakan:
textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
sumber
Dan hanya karena itu selalu lebih menyenangkan untuk melakukan hal-hal dalam satu baris ...
CATATAN: Ini TIDAK mencegah pengguna dari Copy / Paste ke dalam kotak teks ini. Ini bukan cara aman yang gagal untuk membersihkan data Anda.
sumber
KeyPress
acara dari kotak teks yang sama. Satu acara mungkin disetele.Handled
ke true, lalu yang lain dapat mengaturnya kembali ke false. Secara umum, lebih baik digunakanif (...) e.Handled = true;
TextChanged
peristiwa yang mengatasinya dengan sebuah regex dapat memperbaiki copy-paste;)Saya mengasumsikan dari konteks dan tag yang Anda gunakan saat Anda sedang menulis aplikasi .NET C #. Dalam hal ini, Anda dapat berlangganan acara yang diubah teks, dan memvalidasi setiap stroke kunci.
sumber
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Berikut ini adalah kontrol kustom Winforms mandiri yang sederhana, berasal dari TextBox standar, yang hanya memungkinkan input System.Int32 (bisa dengan mudah disesuaikan untuk jenis lain seperti System.Int64, dll.). Ini mendukung operasi salin / tempel dan angka negatif:
Pembaruan 2017 : Jawaban pertama saya memiliki beberapa masalah:
Jadi saya datang dengan versi lain yang lebih umum, yang masih mendukung copy / paste, tanda +, dll.
Untuk Int32, Anda dapat menurunkannya, seperti ini:
atau tanpa derivasi, gunakan acara TextValidating baru seperti ini:
tapi apa yang baik itu berfungsi dengan string apa pun, dan rutin validasi apa pun.
sumber
Inilah yang dirancang untuk acara yang Divalidasi / Validasi.
Inilah artikel MSDN tentang topik ini: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
Versi TL; DR: periksa properti .Text di acara Validasi dan atur
e.Cancel=True
saat data tidak valid.Ketika Anda mengatur e.Cancel = Benar, pengguna tidak dapat meninggalkan bidang, tetapi Anda harus memberi mereka semacam umpan balik bahwa ada sesuatu yang salah. Saya mengubah warna latar belakang kotak menjadi merah terang untuk menunjukkan masalah. Pastikan untuk mengaturnya kembali
SystemColors.Window
saat Validasi dipanggil dengan nilai yang baik.sumber
Validating
.<nitpick>
OP menyebutkan bahwa penolakan langsung / mengindikasikan karakter yang tidak valid adalah ideal, tetapiValidating
tampaknya mengharuskan fokus dipindahkan ke bentuk / kontrol lain sebelum diberlakukan.</nitpick>
Namun, ini adalah pendekatan yang bagus dan selalu layak dipertimbangkan dalam kasus yang lebih umum.Coba MaskedTextBox . Dibutuhkan format mask sederhana sehingga Anda dapat membatasi input ke angka atau tanggal atau apa pun.
sumber
Anda bisa menggunakan
TextChanged
acara tersebutsumber
Undo()
, tetapi menghasilkanStackOverflowException
.public int txtBoxValue
, dan jika tryParse tidak berfungsi, saya mengembalikan teks dalam txtBox olehtxtBox.Text = txtBoxValue.ToString();
Ini mungkin bermanfaat. Ini memungkinkan nilai numerik "nyata", termasuk titik desimal yang tepat dan tanda plus atau minus sebelumnya. Sebut dari dalam acara KeyPress terkait.
sumber
Saya telah mengerjakan kumpulan komponen untuk melengkapi barang yang hilang di WinForms, ini dia: Advanced Forms
Khususnya ini adalah kelas untuk Regex TextBox
Cukup menambahkan sesuatu seperti
myNumbericTextBox.RegexString = "^(\\d+|)$";
sudah cukup.sumber
Cukup gunakan
NumericUpDown
kontrol dan atur visibilitas tombol jelek ke bawahfalse
.NumericUpDown
sebenarnya adalah kumpulan kontrol yang berisi 'spin box' (tombol atas ke bawah), kotak teks dan beberapa kode untuk memvalidasi dan mengayunkan semuanya secara bersamaan.Menandai:
akan menyembunyikan tombol sambil menjaga kode yang mendasarinya aktif.
Meskipun tidak menjadi solusi yang jelas itu sederhana dan efektif.
.Controls[1]
akan menyembunyikan bagian kotak teks jika Anda ingin melakukannya.sumber
Saya telah membuat sesuatu untuk ini di CodePlex .
Ini bekerja dengan mencegat acara TextChanged. Jika hasilnya angka yang baik maka akan disimpan. Jika ada yang salah, nilai barang terakhir akan dikembalikan. Sumbernya agak terlalu besar untuk diterbitkan di sini, tetapi di sini ada tautan ke kelas yang menangani inti dari logika ini.
sumber
cukup gunakan kode ini di kotak teks:
sumber
Di halaman web kami dengan definisi kotak teks, kami dapat menambahkan
onkeypress
acara untuk hanya menerima angka. Itu tidak akan menampilkan pesan apa pun tetapi itu akan mencegah Anda dari input yang salah. Ini bekerja untuk saya, pengguna tidak bisa memasukkan apa pun kecuali nomorsumber
Anda bisa menggunakan acara TextChanged / Keypress, gunakan regex untuk memfilter angka dan mengambil tindakan.
sumber
Saya akan menanganinya di acara KeyDown.
sumber
coba ini sangat sederhana
sumber
Lihatlah penanganan Input di WinForm
Saya telah memposting solusi saya yang menggunakan acara ProcessCmdKey dan OnKeyPress di kotak teks. Komentar menunjukkan kepada Anda cara menggunakan Regex untuk memverifikasi penekanan tombol dan memblokir / mengizinkan secara tepat.
sumber
Hai, Anda dapat melakukan sesuatu seperti ini di ajang textbox yang telah diubah.
ini demo
sumber
Sepertinya banyak dari jawaban saat ini untuk pertanyaan ini secara manual mem-parsing teks input. Jika Anda mencari tipe numerik bawaan tertentu (misalnya
int
ataudouble
), mengapa tidak mendelegasikan pekerjaan keTryParse
metode tipe itu saja ? Sebagai contoh:Jika Anda menginginkan sesuatu yang lebih umum tetapi masih kompatibel dengan Desainer Visual Studio:
Dan akhirnya, jika Anda menginginkan sesuatu yang sepenuhnya generik dan tidak peduli dengan dukungan Designer:
sumber
Bilangan bulat dan pelampung perlu diterima, termasuk bilangan negatif.
sumber
Ini adalah pendekatan saya:
dan angka ukuran apa saja
sumber
Menggunakan pendekatan yang dijelaskan dalam jawaban Fabio Iotti, saya telah menciptakan solusi yang lebih umum:
"ValidatedTextBox", yang berisi semua perilaku validasi nontrivial. Yang tersisa untuk dilakukan adalah mewarisi dari kelas ini dan mengganti metode "IsValid" dengan logika validasi apa pun yang diperlukan. Misalnya, menggunakan kelas ini, dimungkinkan untuk membuat "RegexedTextBox" yang hanya akan menerima string yang cocok dengan ekspresi reguler spesifik:
Setelah itu, mewarisi dari kelas "RegexedTextBox", kita dapat dengan mudah membuat kontrol "PositiveNumberTextBox" dan "PositiveFloatingPointNumberTextBox":
sumber
Maaf membangunkan orang mati, tetapi saya pikir seseorang mungkin menemukan ini berguna untuk referensi di masa depan.
Inilah cara saya menanganinya. Ini menangani angka floating point, tetapi dapat dengan mudah dimodifikasi untuk bilangan bulat.
Pada dasarnya Anda hanya dapat menekan 0 - 9 dan .
Anda hanya dapat memiliki satu 0 sebelum .
Semua karakter lain diabaikan dan posisi kursor dipertahankan.
Ini adalah versi int yang cepat dimodifikasi:
sumber
Yang ini bekerja dengan salin dan tempel, seret dan lepas, kunci ke bawah, mencegah overflow dan cukup sederhana
sumber
Jangan lupa bahwa pengguna dapat menempelkan teks yang tidak valid di a
TextBox
.Jika Anda ingin membatasi itu, ikuti kode di bawah ini:
sumber
Saya juga mencari cara terbaik untuk memeriksa hanya angka dalam kotak teks dan masalah dengan penekanan tombol adalah tidak mendukung copy paste dengan klik kanan atau clipboard sehingga muncul dengan kode ini yang memvalidasi ketika kursor meninggalkan bidang teks dan juga memeriksa untuk bidang kosong. (versi yang diadaptasi dari newguy)
sumber
sumber
3 solusi
1)
2) solusi lain dari msdn
}
sumber http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) menggunakan MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
sumber
Di klik tombol Anda dapat memeriksa teks kotak teks dengan untuk loop:
sumber
Jawaban yang lebih sederhana:
sumber