好的我現在編輯了這篇原文的所有內容。我回到了Visual Studio 2010,並創建了一個新項目並編碼了相同的東西,除了只編碼最低限度以獲得我之前的相同障礙。這意味着我在這裏發佈整個項目代碼,但它也很短並且可讀。我也收錄了一些評論,以便更容易遵循。 只是一個概括:這個問題是我不能夠成功地調用Form1.refreshScore()
從其它類比Form1中本身你如何從另一個班級調用一個班級的方法?
public partial class Form1 : Form
{
private Enemy enemy_;
private Graphics paper_;
private bool started_;
public Form1()
{
InitializeComponent();
}
private void timer_Tick(object sender, EventArgs e)
{
pictureBox.Refresh();
}
private void pictureBox_Paint(object sender, PaintEventArgs e)
{
if (started_)
{
paper_ = e.Graphics;
enemy_.Draw(paper_);
}
}
public void refreshScore()
{
label.Text = "TEST"; //doesn't show
enemy_.color = Color.Red; //"Null Reference Exception unhandled" ?
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Space)
{
enemy_ = new Enemy(0, pictureBox.Height-20, 20, 100, 2, Color.Blue);
paper_ = pictureBox.CreateGraphics();
started_ = true; //succeeds
}
if (e.KeyCode == Keys.K)
{
enemy_.Kill();
enemy_.color = Color.Green; //succeeds.
}
}
}
class Enemy
{
private float x_;
private float y_;
private float diameter_;
private float health_;
private float walkSpeed_;
private Color color_;
private Form1 form_ = new Form1();
//Overloader
public Enemy()
{
x_ = 1;
y_ = 50;
diameter_ = 20;
walkSpeed_ = 1;
health_ = 100;
color_ = Color.Blue;
}
//Constructor, called in Form1, keydown event ("Space")
public Enemy(float x, float y, float diameter, float health, float walkSpeed, Color color)
{
x_ = x;
y_ = y;
diameter_ = diameter;
health_ = health;
walkSpeed_ = walkSpeed;
color_ = color;
}
//getter/setter for 'color' property
public Color color
{
get { return color_; }
set { color_ = value; }
}
public void Draw(Graphics paper)
{
SolidBrush brush = new SolidBrush(color_);
paper.FillRectangle(brush, x_,y_,x_ + diameter_, y_ + diameter_);
}
//called in Form1 under KeyDown event ("K")
public void Kill()
{
form_.refreshScore();
}
}
有大量關於如何從另一個班級調用班級的示例。除非有特定的問題,否則不需要像這樣的新問題,並且在你的情況下看起來並不像那樣,因爲看起來你只是想找到辦法。開始看這個問題的答案http://stackoverflow.com/questions/2950326/calling-a-function-in-the-form-class-from-another-class-c-sharp-net – FeliceM
是的,你'這是對的(我真的很抱歉這樣做,我知道這很煩人)。但是我已經看過那個頁面(和其他許多頁面),它們似乎都提出了相同的解決方案,但它們都對我沒有意義。 解決方案與此類似:將所有的類/方法都變成「靜態」類型 - 我不太明白這意味着什麼,它立即導致我的所有代碼都顯示編譯錯誤。 我是C#的新手,無法理解我需要做什麼以便有一個可引用的對象來使用點符號調用方法(如上例所示),因爲這似乎是最簡單的... – ZOMGbies
順便說一句,你可以只是將一段代碼粘貼到文本編輯器中,然後突出顯示它並單擊'{}'按鈕使其成爲代碼示例。 –