2012-04-20 83 views
2

我想以編程方式確定我想要動態創建的一些控件的空間。所以,我想獲取容器的高度並將其除以行數(常量)。從靜態函數引用非靜態字段,反之亦然不可能?

我有了這個功能(此代碼是關於其命名dynamicPanel面板的生活形式的一部分):

private static int getControlHeightToUse() { 
    return (dynamicPanel.Height/NUMBER_OF_ROWS); 
} 

...這使我的編譯時錯誤,「*的對象引用是必需的非靜態字段,方法或屬性RememberNextGen_CRLogins.CRLoginsMainForm.dynamicPanel'*「

我不明白它試圖告訴我/它想要什麼。

如果我刪除了「靜態」:

private int getControlHeightToUse() { 
    return (dynamicPanel.Height/NUMBER_OF_ROWS); 
} 

...然後我得到了編譯時錯誤,「* A字段初始不能引用非靜態字段,方法或屬性「TitanNextGen_CRLogins .CRLoginsMainForm.getControlHeightToUse()'*」

...下面所指示的行:

public partial class CRLoginsMainForm : Form { 

    int controlHeight = getControlHeightToUse(); // <-- err 

回答

4

static方法僅需要直接訪問類的成員,如果要使用類的實例成員,則必須將該類的實例傳遞給該方法(或者在單例情況下將其作爲static提供)。

因此,你可以修改你的方法採取在實例成員是防止它能夠爲靜態:

private static int getControlHeightToUse(Panel thePanel) 
{ 
    return (thePanel.Height/NUMBER_OF_ROWS); 
} 

然後,只需傳遞dynamicPanel在電話會議上...

然而,實例方法可以訪問static成員。請記住,static成員在所有實例之間共享,並且即使沒有該類的任何實例存在也會存在。因此他們不能調用實例成員,因爲他們不知道你正在談論哪個實例。

2

通dynamicPanel作爲參數傳遞給靜態方法

public partial class CRLoginsMainForm : Form { 

    int controlHeight = getControlHeightToUse(dynamicPanel); 

變化getControlHeightToUse如下

private static int getControlHeightToUse(Panel panel) { 
    return (panel.Height/NUMBER_OF_ROWS); 
} 
如果你想調用從靜態方法非靜態方法,你可以做

如下

public class Foo 
{ 
    // public method 
    public void Method1() 
    { 
    } 

    public static void Data2() 
    { 
     // call public method from static method 
     new Foo().Method1(); 

    } 
} 
相關問題