Référencer des champs non statiques à partir de fonctions statiques et inversement impossible?

Je veux déterminer par programme l’espace que j’ai pour certains contrôles que je veux créer dynamicment. Donc, je veux obtenir la hauteur du conteneur et le diviser par le nombre de lignes (une constante).

J’ai cette fonction (ce code fait partie du formulaire sur lequel vit le panneau nommé dynamicPanel):

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

… qui me donne l’erreur de compilation, “* Une référence d’object est requirejse pour le champ, la méthode ou la propriété non statique RememberNextGen_CRLogins.CRLoginsMainForm.dynamicPanel ‘*”

Je ne comprends pas ce qu’il essaie de me dire / ce qu’il veut.

Si je supprime le “statique”:

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

… Je reçois alors l’erreur de compilation “” Un initialiseur de champ ne peut pas référencer le champ, la méthode ou la propriété non statique “TitanNextGen_CRLogins.CRLoginsMainForm.getControlHeightToUse () ‘*”

… sur la ligne indiquée ci-dessous:

 public partial class CRLoginsMainForm : Form { int controlHeight = getControlHeightToUse(); // <-- err 

Une méthode static n’a qu’un access direct aux membres static de la classe. Si vous souhaitez utiliser des membres d’instance de la classe, vous devez lui transmettre une instance de la classe (ou en avoir une disponible sous forme static comme dans le cas de un singleton).

Ainsi, vous pouvez modifier votre méthode pour prendre en compte le membre d’instance qui l’empêche d’être statique:

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

Il suffit ensuite de passer à dynamicPanel lors de l’appel …

Les méthodes d’instance, cependant, peuvent accéder static membres static . N’oubliez pas que static membres static sont partagés par toutes les instances et existent même s’il n’existe aucune instance de la classe. Ainsi, ils ne peuvent pas appeler des membres d’instance car ils ne savent pas de quelle instance vous parlez.

passer dynamicPanel en tant que paramètre de la méthode statique

 public partial class CRLoginsMainForm : Form { int controlHeight = getControlHeightToUse(dynamicPanel); 

changez getControlHeightToUse comme ci-dessous

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

si vous voulez appeler une méthode non statique à partir d’une méthode statique, vous pouvez faire ce qui suit

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