2010-03-10 139 views
4

我想將一個值(從一個對象)放在一個變量中,並將其放置在一個表單中的文本框中。C#:你如何在Form.cs中引用Program.cs中的內容?

這裏是形式的代碼:

public Form1(Deck mainDeck) 
    { 
     InitializeComponent(); 
     int Val = mainDeck.ReturnCard(10); 
     textBox1.Text = Val.ToString(); 
    } 

主甲板是在我的Program.cs對象文件

問題線是這一個:INT纈氨酸= mainDeck.ReturnCard(10);

糟糕,錯誤的錯誤。 這纔是真正的一個:

Error 1 The name 'mainDeck' does not exist in the current context C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.cs 17 23 Pcard

這裏是我的Program.cs文件:

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

namespace Pcard 
{ 
    class Deck 
    { 
     public Deck() 
     { 
      // Assign standard deck to new deck object 
      // int j; 
      for (int i = 0; i != currentDeck.Length; i++) 
      { 
       currentDeck[i] = originalCards[i]; 
      } 
      // Fisher-Yates Shuffling Algorithim --- Do initial shuffle 
      Random rnd = new Random(); 

      for (int k = currentDeck.Length - 1; k >= 0; k--) 
      { 
       int r = rnd.Next(0, k + 1); 

       int tmp = currentDeck[k]; 
       currentDeck[k] = currentDeck[r]; 
       currentDeck[r] = tmp; 
      } 
     } 
     public void Shuffle() 
     { 
      Random rnd = new Random(); 

      for (int k = currentDeck.Length - 1; k >= 0; k--) 
      { 
       int r = rnd.Next(0, k + 1); 

       int tmp = currentDeck[k]; 
       currentDeck[k] = currentDeck[r]; 
       currentDeck[r] = tmp; 
      } 
     } 
     public int[] ReturnDeck() 
     { 
      return currentDeck; 
     } 
     public int ReturnCard(int num) 
     { 
      return currentDeck[num]; 
     } 

     public int[] originalCards = new int[54] 
     { 
      0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 
      0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 
      0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 
      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 
      0x50, 0x51 
     }; 
     private int[] currentDeck = new int[54]; 

    } 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create a Deck object 
      Deck mainDeck = new Deck(); 
      Console.WriteLine("Here is the card array:"); 
      for (int index = 0; index != 54; index++) 
      { 
       string card = mainDeck.ReturnCard(index).ToString("x"); 
       Console.WriteLine("0x" + card); 
      } 
      //Return 10th Card 
      int PickCard = mainDeck.ReturnCard(10); 
      Console.WriteLine("Here is the 10th Card"); 
      Console.WriteLine("0x" + PickCard); 
      //Shuffle 
      mainDeck.Shuffle(); 
      Console.WriteLine("Shuffling.."); 
      PickCard = mainDeck.ReturnCard(10); 
      Console.WriteLine("Here is the 10th card now: 0x" + PickCard); 
      Application.Run(new Form1(maindeck)); 
     } 
    } 
} 

編輯:好吧,我傳遞主甲板到形式,但現在我得到不同的錯誤: Error 1 Inconsistent accessibility: parameter type 'Pcard.Deck' is less accessible than method 'Pcard.Form1.Form1(Pcard.Deck)' C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.cs 14 16 Pcard

編輯:編輯:好吧,我現在有第正在工作,但我遇到了一個相關的問題,所以我寧願把它放在這裏,而不是在一個新的問題。

將mainDeck傳遞給Form1可以正常工作,但如果我想讓按鈕單擊,則會調用此對象中的某個方法。我試圖通過主甲板是這樣的:

private void button1_Click(object sender, Deck mainDeck, EventArgs e) 
     { 
      mainDeck.Shuffle(); 
     } 

我得到這個錯誤:
Error 1 No overload for 'button1_Click' matches delegate 'System.EventHandler' C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.Designer.cs 51 35 Pcard

GRR!

+0

這條線和什麼是完整的信息。 – rerun 2010-03-10 05:26:57

+0

int Val = mainDeck.ReturnCard(10) – Biosci3c 2010-03-10 05:27:46

+0

是否在您的項目中定義了主甲板 – rerun 2010-03-10 05:32:25

回答

3

該行 甲板mainDeck = new Deck(); 只是創建一個名稱爲mainDeck的局部變量...只能在Main()方法中訪問...

將聲明放在類中Main方法的上方...將程序類public和maindeck作爲公共靜態......這樣

public class Program 
{ 
     // Create a Deck object 
    public static Deck mainDeck = new Deck(); 
    static void Main(string[] args) 
    { 
    ..... 

    } 

然後你可以從你的形式的訪問爲

int Val = Program.mainDeck.ReturnCard(10); 

希望這有助於。

+0

我想過這個,但是我希望在窗體關閉的時候存在對象(但窗體仍在運行)。 – Biosci3c 2010-03-10 05:45:50

+0

我沒有得到你......這裏的MainDeck不依賴於窗體......它是靜態的並且依賴於程序類...因此,即使當窗體關閉時,仍然可以從程序類訪問MainDeck – 2010-03-10 05:50:51

+0

我終於明白了。我誤解了你的意思。我以爲你的意思是定義一個靜態類,但你的意思是一個靜態對象。噢,現在很好用。 – Biosci3c 2010-03-11 05:06:15

1

假設主甲板是靜態的,或者是公開或內部,您可以通過

int val = Program.mainDeck.ReturnCard(10); 
+0

它不是靜態的。它必須是?我想保持不同對象實例中的值分開。 – Biosci3c 2010-03-10 05:32:45

+0

是的,因爲你沒有創建'Program'類的實例 - 所運行的Main方法是一個靜態方法。另外(正確地說),正如Pandincus所建議的那樣,您應該通過maindeck作爲對Form1的引用(通過構造函數或屬性)。 – 2010-03-10 05:41:59

7

最簡單的方式訪問它是改變窗體的構造在主甲板通過。

public Form1(Deck mainDeck) 
{ 
    InitializeComponent(); 
    int Val = mainDeck.ReturnCard(10); 
    textBox1.Text = Val.ToString(); 
} 

如果您需要提到它在你的表格代碼等部位,你可以保持一個私有成員變量躺在身邊......

private Deck _mainDeck; 

public Form1(Deck mainDeck) 
{ 
    InitializeComponent(); 
    _mainDeck = mainDeck; 
    int Val = _mainDeck.ReturnCard(10); 
    textBox1.Text = Val.ToString(); 
    } 
} 

private void SomeOtherMethod() 
{ 
    int blah = _mainDeck.Blah(); 
} 

然後在您的Program.cs文件。 ..

Application.Run(new Form1(mainDeck)); 

編輯:在回答你的涉及甲板 CLAS的無障礙新的錯誤這是因爲你的Deck班不公開。在公共關鍵字添加到類的聲明,所以:

namespace Pcard 
{ 
    public class Deck 
    { 
     // and so on ... 

注意,這可能是更清潔,以保持在一個單獨的cs文件的甲板類,如Deck.cs.

1

問題是,您試圖將mainDeck作爲全局變量引用,這在C#中是不允許的。

你得到的錯誤是因爲編譯器假定mainDeck是你試圖引用的類型,沒有mainDeck的定義。

顯然這不是你想要的。爲了解決這個問題,你必須使用來自mainDeck類的靜態變量來提供mainDeck的引用,或者使用Singleton模式來解決問題。

編輯: 當你添加你的代碼,它可能是最簡單的傳遞mainDeck參考「Form1`。可以作爲Form1的構造函數的一部分或可以設置的屬性。

相關問題