2009-05-13 35 views
5

Tôi biết đây có lẽ là một câu hỏi rất mới mẻ, vì vậy tôi xin lỗi.Một tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính không tĩnh?

Tôi đang cố truy cập thuộc tính Văn bản của nhãn trên Form1 từ một biểu mẫu khác, MaxScore.

Khi tôi nhấp vào nút Ok trên MaxScore, tôi muốn đặt MyGameCountLbl.Text của Form1 thành biến Form1, tối đa bằng cách sử dụng max.ToString().

Đây là mã của tôi trong trường hợp nút OK của MaxScore:

private void okBtn_Click(object sender, EventArgs e) 
{ 
    Form1.myGameCountLbl.Text = Form1.max.ToString(); 
    Form1.compGameCountLbl.Text = Form1.max.ToString(); 
} 

Nhưng khi tôi đi để biên dịch nó, tôi nhận được lỗi:

An object reference is required for the non-static field, method, or property 'Towergame_2.Form1.myGameCountLbl'

tôi nhận được lỗi tương tự cho Towergame_2 .Form1.max và Towergame_2.Form1.compGameCountLbl.

Không chắc chắn cách khắc phục điều này. Max là một biến công cộng và hai nhãn là pubic là tốt.

Cảm ơn!

Đây là mã trong constructor của tôi (cảm ơn bạn lassevk cho mã!):

public Form1() 
{ 
    //initialize vars 
    myHp = 100; 
    compHp = 100; 
    youWon = 0; 
    compWon = 0; 
    money = 100; 
    canCompAttack = true; 
    gameOver = false; 

    //show HowToPlay Dialogue 
    HowToPlay howToPlay = new HowToPlay(); 
    howToPlay.ShowDialog(); 

    using (MaxScore maxScore = new MaxScore()) 
    { 
     maxScore.MainForm = this; 
     maxScore.ShowDialog(); 
    } 

    InitializeComponent(); 
} 

Trả lời

7

là bởi bất kỳ cơ hội Form1 tên của lớp?

Bạn cần có tham chiếu đến một phiên bản của lớp biểu mẫu.

okBtn không có cùng mẫu, bạn cần cung cấp cho mẫu MaxScore tham chiếu đến phiên bản Form1.

Ví dụ, bạn có thể thêm vào form MaxScore của bạn:

public Form1 MainForm { get; set; } 

Và sau đó trong phương pháp okBtn_Click của bạn, bạn sẽ viết này:

private void okBtn_Click(object sender, EventArgs e) 
{ 
    MainForm.myGameCountLbl.Text = MainForm.max.ToString(); 
    MainForm.compGameCountLbl.Text = MainForm.max.ToString(); 
} 

và sau đó khi bạn đang xây dựng MaxScore từ Form1 (Tôi giả sử đó là những gì bạn đang làm):

using (MaxScore scoreForm = new MaxScore()) 
{ 
    scoreForm.MainForm = this; 
    scoreForm.ShowDialog(); 
} 
+0

Khi tôi thêm tất cả điều này và cố gắng biên dịch và chạy, bấm ok trên nút MaxScore, tôi nhận được một ngoại lệ tại: MainForm.myGameCountLbl.Text = MainForm.max.ToString(); nói: NullReferenceException đã bị hủy. Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng. – Eric

+0

Bạn có thực sự thiết lập MainForm, như tôi đã giới thiệu trong đoạn mã cuối cùng ở đó không? –

+0

Vâng tôi đã làm. Tôi có đoạn mã cuối cùng trong hàm tạo Form1 của mình. – Eric

2

Tôi đồng ý với @lassevk liên quan đến việc giải quyết vấn đề của bạn. Tôi cũng khuyên bạn nên gói hành vi thiết lập nhãn thành một phương thức trong lớp Form1, điều này đơn giản giúp giữ mã của bạn sạch hơn và giữ trách nhiệm/kiến ​​thức về những trường nào cần cập nhật và cách cập nhật chúng trong biểu mẫu gốc. Bạn chỉ cần định nghĩa một phương thức công khai trong Form1 nhận một giá trị chuỗi và cập nhật các nhãn cụ thể với giá trị đó. Sau đó, trong biểu mẫu MaxScore, trong trình xử lý sự kiện nhấn nút của bạn, bạn sẽ gọi phương thức đó thay vì cố truy cập trực tiếp vào các điều khiển nhãn đó.

Chỉ cần thực phẩm để suy nghĩ.

+0

Cảm ơn ý tưởng tuyệt vời! – Eric

Các vấn đề liên quan