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);
}

...然后我得到编译时错误,“*字段初始化程序无法引用非静态字段、方法或属性 'TitanNextGen_CRLogins.CRLoginsMainForm.getControlHeightToUse()'*”

...在下面的指示线上:

public partial class CRLoginsMainForm : Form {

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

2 回答 2

4

一个static方法只能直接访问static类的成员,如果你想使用类的实例成员,你必须将类的实例传递给方法(或者像static单例一样有一个可用的实例) .

因此,您可以修改您的方法以接收阻止它成为静态的实例成员:

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

然后就直接dynamicPanel接电话了...

但是,实例方法可以访问static成员。请记住,static成员在所有实例之间共享并且即使不存在该类的实例也存在。因此他们不能调用实例成员,因为他们不知道您在谈论哪个实例。

于 2012-04-20T18:35:29.443 回答
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();

    }
}
于 2012-04-20T18:36:46.787 回答