C# Bir Sonraki Kontrolü Bulma

Merhabalar, C# derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde şu anda aktif olan kontrolden bir sonraki kontrolü bulmayı anlatacağım. Hadi başlayalım !
Şimdi ne gerek var buna diyebilirsiniz, yani örneğin şu anda TextBox aktif yani fokuslanmış ama ondan sonra gelen kontrolü bulmak ne işimize yarayacak derseniz, az önce benim ihtiyacım oldu 🙂 Biraz uğraştıktan sonra hallettim ve belki benim gibi ihtiyacı olanlar vardır diye yazayım dedim. Örneğin bir TextBox şu anda fokuslanmış ve siz her TAB tuşuna basıldığında bir sonraki TextBox’a geçmesini ve en sonda bulunan Button’a tıklanmasını istiyorsanız bu yazı derdinize deva olacaktır 🙂 Normalde her bir TextBox için bi tane KeyPress eventi oluşturur, bi sonraki kontrole geçmesini ve Button’a gelince de tıklanmasını sağlayabilirsiniz ama formunuzda çok sayıda TextBox varsa her birine ayrı bi KeyPress eventi oluşturmak gereksiz kod yazılmasına sebep olur. Öncelikle projemizde bulunan ilgili formun OnKeyPress metodunu override etmeli yani yeniden yazmalıyız. Yani;
protected override void OnKeyPress(KeyPressEventArgs e) { }
kod satırı ile override fonksiyonumuzu oluşturduk.Ben her Enter tuşuna basıldığında bir sonraki kontrole geçiş yaptıracağım. O yüzden basılan tuşun Enter olup olmadığını algılamamız gerek. Bunun için de KeyPressEventArgs nesnesi (e) içerisinde bulunan KeyChar propertisinden faydalanacağız. KeyChar propertisi basılan tuşu char tipinde geri döndürür ve bunun Enter olup olmadığını if bloğu ile kontrol ettikten sonra, Enter ise Tab tuşuna bastırabiliriz. Tab tuşu C#’ta bir sonraki kontrole geçiş yapmayı sağlıyor.
if(e.KeyChar == (char)Keys.Enter)
SendKeys.Send("{TAB}");
Şimdiye kadar her Enter’a basıldığında bir sonraki kontrole geçiş yaptık fakat bir sonraki kontrol eğer buton ise butona tıklatma yapmamız gerekecek. Bir sonraki kontrolü bulmak için form içerisinde bulunan GetNextControl() fonksiyonunu kullanacağız. Bu fonksiyon Control ve Boolean olmak üzere 2 parametre alıyor ve geriye Control tipinde değer döndürüyor. “E ben zaten kontrol istiyorum, daha niye parametre olarak kontrol istiyor bu” diyebilirsiniz, onu da halledeceğiz. Nasıl mı ? Şöyle;
Control c = GetNextControl(ActiveControl, true);
ActiveControl propertisi form üzerinden fokuslanmış (aktif olan) kontrolü veriyor ve ikinci parametre olan true ile de ileriye doğru gidileceğini belirtiyoruz. Yani false gönderirsek bir önceki kontrol gelecek ama bize bir sonraki kontrol lazım olduğu için true gönderdik.Bir sonraki kontrolü aldık ama bunun ne olduğunu bilmiyoruz. Button olup olmadığını kontrol edebiliriz. Ve eğer buton ise butona tıklatabiliriz. Şöyle;
if(c.GetType() == typeof(Button))
(c as Button).PerformClick();
Bu yazdığımız kod da c isimli daha önceden bulduğumuz kontrolün tipini aldık (GetType() fonksiyonu bize kontrolün direk adını verecek, yani örneğin Button ise System.Windows.Forms.Button, TextBox ise System.Windows.Forms.TextBox diyecek) ve bunun Button olup olmadığını kontrol ettik. Button ise c isimli kontrolü Button’a çevirdik ve üstüne tıklattık. Evet tüm işlemlerimiz bu kadardı. Bu sayede hangi kontrol aktif olursa olsun, o kontrol üzerinde Enter’a basıldığında bir sonraki kontrole geçecek ve eğer bir sonraki kontrol Button ise direk o butona tıklanacaktır. Button’a tıklanmak demek Button’un click eventinin çalışması demek olacaktır. Bu yaptığımız işlem örneğin bi form doldurma işleminde çok faydalı olacaktır. Bu dersimizde bu kadardı, buraya kadar yazdığımız tüm kodları daha toplu olması adına aşağıya bırakıyorum;
protected override void OnKeyPress(KeyPressEventArgs e)
{
if(e.KeyChar == (char)Keys.Enter)
{
SendKeys.Send("{TAB}");
Control c = GetNextControl(ActiveControl, true);
if(c.GetType() == typeof(Button))
(c as Button).PerformClick();
}
}
Tüm C# derslerimize buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.