2012-12-13 72 views
0

/*您好,我正在嘗試在visual studio上創建我的第一個c#應用程序。我在main中創建了一個類和一個類的實例,我簡單地試圖在表單上的click事件中查詢該實例的成員,但它告訴我實例名稱在當前上下文中不存在。任何幫助將不勝感激這裏是我的代碼。 */訪問主窗體中的實例

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows.Forms; 

    namespace WindowsFormsApplication10 
    { 

    public class character   // this is my class 
     { 
      public bool hair_black; 
     } 


     static class Program 
     { 
      /// <summary> 
      /// The main entry point for the application. 
      /// </summary> 
      [STAThread] 
      static void Main() 
      { 
       Application.EnableVisualStyles(); 
       Application.SetCompatibleTextRenderingDefault(false); 
       Application.Run(new Form1()); 

       character deviljin = new character(); // instance of my class 

       deviljin.hair_black = true;  // initiating a member of the instance 


      } 
     } 
    } 

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 

    namespace WindowsFormsApplication10 
    { 


     public partial class Form1 : Form 
     { 

      int cs1 = 0,cs2=0; 


      public Form1() 
      { 
       InitializeComponent(); 


      public void pictureBox1_Click(object sender, EventArgs e) 
      { 

       flowLayoutPanel1.Visible = true; 
       if (deviljin.hair_black == true) // trying to access instance member 
       {         // but getting deviljin does not 
                // exist in the current context 
        pictureBox28.Visible = false; 
       }    

      } 

     } 
    } 
+4

這不會讓你得到任何地方。你真的需要閱讀一本書,Winforms編程不是你可以從試驗和錯誤中學到的東西。 –

回答

1

你的實例變量deviljin是本地的主要方法,並不能在法的外部直接引用。

您需要在您嘗試使用Form1的實例內傳遞引用。 可以這樣做通過form1的

Application.Run(new Form1(deviljin)); 

當然改變Form1的構造函數和構造函數直接傳遞的參考

現在你可以使用例如在點擊代碼

傳遞
public void pictureBox1_Click(object sender, EventArgs e) 
{ 
    flowLayoutPanel1.Visible = true; 
    if (_devReferenceToCharacterPassed.hair_black == true) 
    {         
     pictureBox28.Visible = false; 
    }    
} 

還注意到,

Application.Run(new Form1(deviljin));

是阻止呼叫。這意味着您的代碼不會退出此調用,直到Form1處於打開狀態,因此您需要在Run調用之前移動deviljin變量的創建。

編輯:我強烈反對在整個應用程序中使用具有全局可見性的變量。有時候它們是必要的,但它們會導致非常快速地創建不可維護的代碼。這是更好地學習與儘可能少的全局變量

1

這是因爲錯誤說什麼編程 - 實例並不在當前上下文(表單的上下文中)

這是一個範圍存在問題 - 您聲明的每個變量都有一個作用域,並且因爲您正在Program類的Main方法的本地作用域中聲明您的字符類實例,所以它只會在該方法中可見。

由於Program類是靜態的,你可以只創建這個類的如靜態成員:

namespace WindowsFormsApplication10 
{ 

public class character   // this is my class 
    { 
     public bool hair_black; 
    } 


    static class Program 
    { 
     public static character deviljin; 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

編輯:沒有真正注意到這一點,但作爲史蒂夫指出,雖然這會編譯時,如果在實例化變量之前調用Application.Run,​​則在嘗試訪問變量時它將獲得運行時異常(它將爲空),因此請確保在執行Application之前執行此操作。運行

  deviljin = new character(); // instance of my class 

      deviljin.hair_black = true;  // initiating a member of the instance 

      Application.Run(new Form1()); 


     } 
    } 
} 

這樣,您就可以通過Program類訪問您的實例:

 public void pictureBox1_Click(object sender, EventArgs e) 
     { 

      flowLayoutPanel1.Visible = true; 
      if (Program.deviljin.hair_black == true) 
      { 
       pictureBox28.Visible = false; 
      }    

     } 

閱讀上的變量範圍,訪問修飾符和靜態/實例變量 - 一個非常簡單的項目,靜態變量沒問題,所以你可以走這條路線,而你仍然在學習

+0

不,這不起作用。該變量在Application.Run調用之後實例化,因此在click事件中使用時不存在。 – Steve

+0

好點!沒有看到,雖然它會編譯,它只會拋出一個運行時異常 – Charleh

+0

非常感謝,做了這個訣竅=) – user1902599

1

你需要更新你的表單來將字符的一個實例作爲一個參數,例如

public partial class Form1 : Form 
{ 
    private Character _character; 
    public Form1(Character character) 
    { 
     _character = character; 
    } 

    public void pictureBox1_Click(object sender, EventArgs e) 
    { 
     If (_character.hair_black) 
     { 
      ... 
     } 
    } 
} 
... 
var deviljin = new Character() 
{ 
    hair_black = true 
}; 
Application.Run(new Form1(deviljin));