Saya perlu mendapatkan semua kontrol pada formulir yang berjenis x. Saya cukup yakin saya pernah melihat kode itu di masa lalu yang menggunakan sesuatu seperti ini:
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))
Saya tahu saya dapat mengulangi semua kontrol yang membuat anak-anak menggunakan fungsi rekursif, tetapi apakah ada sesuatu yang lebih mudah atau lebih langsung, mungkin seperti berikut ini?
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
Jawaban:
Berikut opsi lain untuk Anda. Saya mengujinya dengan membuat aplikasi sampel, saya kemudian meletakkan GroupBox dan GroupBox di dalam GroupBox awal. Di dalam GroupBox bersarang saya meletakkan 3 kontrol TextBox dan sebuah tombol. Ini adalah kode yang saya gunakan (bahkan termasuk rekursi yang Anda cari)
Untuk mengujinya dalam acara pemuatan formulir, saya ingin menghitung semua kontrol di dalam GroupBox awal
Dan itu mengembalikan hitungan yang tepat setiap kali, jadi saya pikir ini akan berfungsi dengan baik untuk apa yang Anda cari :)
sumber
Di C # (karena Anda menandainya seperti itu) Anda bisa menggunakan ekspresi LINQ seperti ini:
Edit untuk rekursi:
Dalam contoh ini, Anda terlebih dahulu membuat daftar kontrol dan kemudian memanggil metode untuk mengisinya. Karena metode ini rekursif, itu tidak mengembalikan daftar, itu hanya memperbaruinya.
Hal ini dimungkinkan untuk melakukan ini dalam satu pernyataan LINQ menggunakan
Descendants
fungsi tersebut, meskipun saya tidak begitu terbiasa dengannya. Lihat halaman ini untuk informasi lebih lanjut tentang itu.Edit 2 untuk mengembalikan koleksi:
Seperti yang disarankan @ProfK, metode yang hanya mengembalikan kontrol yang diinginkan mungkin merupakan praktik yang lebih baik. Untuk mengilustrasikan ini, saya telah memodifikasi kode sebagai berikut:
sumber
Ini adalah versi perbaikan dari GetAllControls rekursif () yang benar-benar berfungsi pada vars pribadi:
sumber
Saya menggabungkan banyak ide sebelumnya menjadi satu metode ekstensi. Manfaatnya di sini adalah Anda mendapatkan kembali yang dapat diketik dengan benar, ditambah warisan ditangani dengan benar oleh
OfType()
.sumber
Anda dapat menggunakan kueri LINQ untuk melakukan ini. Ini akan menanyakan semua yang ada di formulir yaitu tipe TextBox
sumber
var c = this.Controls.OfType<TextBox>()
memberikan hasil yang sama?Ini mungkin teknik kuno, tetapi bekerja seperti pesona. Saya menggunakan rekursi untuk mengubah warna semua label kontrol. Ini bekerja dengan baik.
sumber
Saya ingin mengubah jawaban PsychoCoders: karena pengguna ingin mendapatkan semua kontrol dari tipe tertentu, kita dapat menggunakan obat generik dengan cara berikut:
Dengan cara ini, kita dapat memanggil fungsinya sebagai berikut:
sumber
.OfType<T>()
metode Linq daripada.Where(c => c.GetType() == typeof(T)).Cast<T>();
mendapatkan efek yang sama?Jangan lupa bahwa Anda juga dapat memiliki TextBox dalam kontrol lain selain kontrol container juga. Anda bahkan dapat menambahkan TextBox ke PictureBox.
Jadi, Anda juga perlu memeriksa apakah
dalam fungsi rekursif apa pun.
Ini adalah hasil yang saya peroleh dari tata letak untuk menguji kode ini:
Coba ini dengan satu Button dan satu RichTextBox pada formulir.
sumber
Menggunakan refleksi:
sumber
Berikut adalah metode ekstensi saya untuk
Control
, menggunakan LINQ, sebagai adaptasi dari versi @PsychoCoder :Dibutuhkan daftar jenis alih-alih yang memungkinkan Anda tidak memerlukan banyak panggilan
GetAll
untuk mendapatkan apa yang Anda inginkan. Saat ini saya menggunakannya sebagai versi yang kelebihan beban.Pemakaian:
sumber
Solusi bersih dan mudah (C #):
Dapatkan semua kotak teks:
sumber
Anda dapat menggunakan Kode di bawah ini
sumber
Berikut adalah metode Ekstensi saya. Sangat efisien dan malas.
Pemakaian:
Kodenya adalah:
sumber
Inilah Solusinya.
https://stackoverflow.com/a/19224936/1147352
Saya telah menulis potongan kode ini dan hanya memilih panel, Anda dapat menambahkan lebih banyak sakelar atau jika. di dalamnya
sumber
sumber
Ekspresi Lambda
sumber
Saya memodifikasi dari @PsychoCoder. Semua kontrol dapat ditemukan sekarang (termasuk bersarang).
sumber
Ini mungkin berhasil:
Saya pikir fungsi untuk mendapatkan semua kontrol yang Anda bicarakan hanya tersedia untuk WPF .
sumber
Berikut ini solusi umum yang teruji dan berfungsi:
Saya memiliki sejumlah besar kontrol UpDownNumeric, beberapa di formulir utama, beberapa di kotak grup di dalam formulir. Saya hanya ingin satu kontrol yang terakhir dipilih untuk mengubah warna belakang menjadi hijau, yang pertama-tama saya atur semua yang lain menjadi putih, menggunakan metode ini: (juga dapat diperluas ke cucu)
sumber
Anda dapat mencoba ini jika Anda mau :)
sumber
Meskipun beberapa pengguna lain telah memposting solusi yang memadai, saya ingin memposting pendekatan yang lebih umum yang mungkin lebih berguna.
Ini sebagian besar didasarkan pada tanggapan JYelton.
sumber
sumber
sumber
Untuk siapa pun yang mencari versi VB dari kode C # Adam yang ditulis sebagai perpanjangan dari
Control
kelas:CATATAN: Saya telah menambahkan
BaseType
pencocokan untuk setiap kontrol kustom turunan. Anda dapat menghapus ini atau bahkan menjadikannya sebagai parameter opsional jika Anda mau.Pemakaian
sumber
Buat Metode
Dan gunakan seperti itu
sumber
Saya asin menggunakan VB jadi, saya menulis metode ekstensi. Itu mengambil semua anak dan sub anak dari sebuah kontrol
Kemudian Anda dapat menggunakannya seperti, di mana "btnList" adalah kontrol
Dalam hal ini, ini akan memilih tombol radio yang dipilih.
sumber
Secara sederhana:
sumber