2009-01-19 5 views
8

Uygulamamda, düğmelerin görünürlüğünü kontrol etmek, metin alanlarını ve winform başlık metnini denetlemek için farklı bağlamlarda aynı winformu çalıştırıyorum. Bunu yapmaya karar verdiğim yol basitçe form kurucusuna bir dize iletmek ve sırayla istenen winform tweaks'i içeren ifadelerin bir çift ile kontrol edilmesidir. yapıcısındaki Viritual üyesi çağrısı:Kurucuda sanal üye araması

if (formContext == "add") 
{ 
    Text = "Add member"; 
} 
if (formContext == "edit") 
{ 
    Text = "Change role"; 
    userTextBox.Enabled = false; 
    searchButton.Visible = false; 
} 

Bu iyi çalışır, ancak "Metin" anahtar kelimeler mavi squigly çizgi aşağıdaki iletiyle ReSharper tarafından eklenen olsun. Bu, potansiyel bir sorun mu yoksa sadece bir tür aşırı hevesli ReSharper mesaj mıdır?

Uygulamamın iyileştirilmesi için herhangi bir açıklama veya öneri çok takdir edilecektir.

cevap

9

taban sınıfı ctor aylarında adeta üyesi çağrısı alt sınıf ctor denir (ve nesne tutarlı bir duruma kendisini başlatmak için bir şans olur böylece öncesi) önce bazı mantık alt sınıfta çalışmasına neden olabilir.

Sadece güzel bir hatırlatma, bu yüzden bazı beklenmedik davranışlara neden olabilecek bir şey yaptığınızı biliyorsunuz.

+0

Evet ... bu kendimi düşündüğüm hat boyunca. Bunu daha iyi nasıl yapabileceğime dair herhangi bir öneri. Bu projede istikrar bir numaralı önceliğe sahip ve beklenmedik davranışlardan kaçınmayı tercih ederim. – Sakkle

+0

Temel sınıftaki ctorunuzda sanal yöntemleri aramanın yanı sıra önerileri mi kastediyorsunuz? :-) Bu durumda, formun Text özelliğini bir GUI model sınıfındaki bir dize alanına bağlamak için veri bağlama özelliğini kullanabilirsiniz; bu, başlık çubuğunun ne söylemesi gerektiğine karar vermek için gerekli mantığı içerecektir. – mookid8000

+0

Evet ... Muhtemelen, nereden başlayacağımı bilmese de, sanırım düğme ve metin alanı için de aynısını yapmak zorundayım. – Sakkle

6

mevcut cevaplara ek olarak, formlar için bir yük olay işleyicisi ekleyebilirsiniz:

Load += delegate 
{ 
    if (formContext == "add") 
    { 
     Text = "Add member"; 
    } 
    if (formContext == "edit") 
    { 
     Text = "Change role"; 
     userTextBox.Enabled = false; 
     searchkButton.Visible = false; 
    } 
}; 
+0

Bu, çok fazla kodu yeniden yazmak zorunda kalmadan, yapmaya çalıştığım şey için en kolay ve en iyi çözüm gibi görünüyor. Evet ... tembelim: P – Sakkle

0

ben şöyle size sınıfını yeniden yazma öneririm:

public partial class Form1 : Form 
{ 
    public enum FormContextMode 
    { 
     Add, 
     Edit 
    } 

    private FormContextMode m_mode = FormContextMode.Add; 

    public Form1(FormContextMode mode) 
    { 
     InitializeComponent(); 
     m_mode = mode; 
     Load += delegate { UpdateForm(); }; 
    } 

    private void UpdateForm() 
    { 
     if(m_mode == FormContextMode.Add) 
     { 
      Text = "Add member";  
     } 
     else if(m_mode == FormContextMode.Edit) 
     { 
      Text = "Change role"; 
      userTextBox.Enabled = false; 
      searchkButton.Visible = false; 
     } 
    } 
} 
+0

Ahaaa ... tatlı :) – Sakkle

+0

Kendi Load olayına abone olmanıza gerek yok, OnLoad yöntemini geçersiz kıl. –

+0

Yep, Ilya ile hemfikirim - yöntemi daha iyi hale getirmek için daha iyi bir durumda, event + aboneliğinden çıkmayı hatırlamanız gerekmeyecek (ve bu bir gut-his ifadesidir) muhtemelen daha hızlıdır. – ng5000

3

Sadece sınıf mühür.

+0

Lütfen ayrıntıyı düzeltin ... – Sakkle

+1

http://msdn.microsoft.com/en-us/library/88c54tsw(VS.71).aspx Mühürlü bir sınıf kalıtsal olarak alınamaz, bunun için türetilmiş bir sınıf olasılığı yoktur. sanal üyeyi geçersiz kılmak. – ng5000