2009-02-04 19 views
12

Burada, bir metin kutusuna "Enter" tuş vuruşunu yakalamak ve bir düğmeye basmak gibi, formun KeyPreview özelliğini true değerine ayarlamam ve KeyDown değerini kontrol etmek için kullanıyorum.Formdaki hangi denetimin odaklandığı nasıl belirlenir?

Bu işlevi, her biri farklı bir Düğme ile ilişkilendirilmiş olan birkaç TextBox denetiminde kullanabilmek istiyorum.

Sorunun, KeyPress olayına hangi denetimi neden verdiğini nasıl anlarım? Gönderen formun kendisi olarak listelenir.

G

cevap

5

ben çalışıyor gibi görünen bir çözüm bulduk.

private void DeviceForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13 && tstxtDeviceFilter.Focused) 
     { 
      filterByDeviceSN(); 
     } 
    } 

Yardım edemiyorum ama daha iyi bir yol olmalı diye düşünüyorum!

--edit - DÜZENLEME - DÜZENLEME - DÜZENLEME - EDIT--

Bunda benim için 'iyi' yolu buldum, aşağıdaki önerilerden baktıktan sonra (teşekkür ederim) Eh durum.

this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown); 

    private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyValue == 13) 
     { 
      filterByDeviceSN(); 
     } 
    } 

Açıkçası metin kendisi yerine ben odak endişelenmenize gerek yoktur formdaki olayı yakalayarak. Bir kez daha bu kadar uzun süredir düşünmemek için aptal hissediyorum!

4

Her formun bir "Kabul Et" düğmesi & "İptal" düğmesi için bir özelliği vardır, bunlar sırasıyla kullanıcı tıklatıp kaçtığında "tıklatılmış" olan düğmelerdir. Her bir kontrol odağı alır gibi

Varsayılan düğmesini değiştirebilir (düğmenin başına odak olay işleyicisi var biri olabilir ve metin kutuları bir dizi ile paylaşmak) Eğer bu o zaman bir görünüm yaparsanız

düğmeler, kullanıcıya hangi düğmenin varsayılan olduğunu bildiren görsel bir işaret verir.

Alternatif olarak, bunu yapmak istemezseniz, "ActiveControl" özelliğini kullanabilir ve hangi metin kutularının ait olduğunu görmek için sınayın.

Kendinize sordunuz mu, metin kutusundan biri değilse varsayılan düğme ne olmalıdır?

+0

Teşekkürler BW, bunu bilmek yararlı bilgiler. Bu durumda kendi cevaplarımı kullanacağımı düşünüyorum, çünkü sadece tek bir metin kutusuna "Enter" tuşuna basıyorum ve sadece odak noktası olduğunda. Teşekkürler tho! –

+0

G-'nin yorumu, yanlış gittiğim yerde beni kandırdı, daha fazla ayrıntı için teşekkürler. Uygulamam çoğunlukla sadece bir iletişim kutusu. Bu yüzden, bir düğmeniz bile yok ve bırakma durumunuz dışında asla kapanmıyor. –

3

Form.ActiveControl'u denediniz mi?

+2

Buna bir baktım ama kontrolün adını "this.ActiveControl.Name" boş bir dize ile bulmayı beklerdim. Muhtemelen çok açık bir şekilde yanlış bir şey yapıyorum! –

0

Bu kodu, formdaki önemli olayları yakalamak için başlangıç ​​noktası olarak kullanabilirsiniz. ActiveControl, odağı olan bir tanesidir. Bu örnekte, formdaki farklı TextBox'larda olduğunuzda "Enter" a başka eylemler eklemek için esnektir. Bu VB.NET, ama kolayca C# dönüştürebilirsiniz gerekir.

Private Sub MyForm_KeyDown(ByVal sender As Object, _ 
    ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     If Me.ActiveControl.Name = Me.TextBox1.Name Then 
      ' This is the TextBox we want to be active to run filterByDeviceSN() 
      filterByDeviceSN() 
     ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then 
      foo() 
     End If 
    End If 
End Sub 
+0

ActiveControl.Ad boş bir dize döndürür. ActiveControl.Text, metin kutusundaki gibi aynı dizgeyi döndürerek beklendiği gibi davranır. "this.ActiveControl.Equals (tstxtDeviceFilter)" yanlış döndürür. Şimdilik kendi cevabımla gideceğim. Kimse ismi nasıl alacağını bilmiyorsa? –

İlgili konular