2009-05-13 5 views
5

मुझे पता है कि यह शायद एक बहुत ही नया सवाल है, इसलिए मैं क्षमा चाहता हूं।गैर स्थैतिक क्षेत्र, विधि या संपत्ति के लिए एक ऑब्जेक्ट संदर्भ आवश्यक है?

मैं फॉर्म 1 पर किसी अन्य फॉर्म, मैक्सस्कोर से किसी लेबल की टेक्स्ट प्रॉपर्टी तक पहुंचने का प्रयास कर रहा हूं।

जब मै मैक्सस्कोर पर ओके बटन पर क्लिक करता हूं, तो मैं फॉर्म 1 के myGameCountLbl.Text को फॉर्म 1 के चर पर सेट करना चाहता हूं, max.oString() का उपयोग करके अधिकतम।

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

मैं Towergame_2 के लिए एक ही त्रुटि मिलती है: जब मैं यह संकलन में जाओ, मैं त्रुटि मिलती है

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

लेकिन:

यहाँ MaxScore के ठीक बटन स्थिति में मेरी कोड है .Form1.max और Towergame_2.Form1.compGameCountLbl।

यह सुनिश्चित नहीं है कि इसे कैसे ठीक किया जाए। मैक्स एक सार्वजनिक चर है और दो लेबल भी जघन्य हैं।

धन्यवाद!

यह मेरा निर्माता में कोड है (धन्यवाद आप कोड के लिए lassevk!):

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(); 
} 

उत्तर

7

कोई मौका Form1 वर्ग के नाम से है?

आपको फॉर्म क्लास के उदाहरण का संदर्भ होना चाहिए।

चूंकि okBtn एक ही रूप में नहीं है, तो आपको MaxScoreForm1 उदाहरण का संदर्भ देने की आवश्यकता है।

उदाहरण के लिए, यदि आप अपने MaxScore प्रपत्र को यह जोड़ सकते हैं:

public Form1 MainForm { get; set; } 

और फिर अपने okBtn_Click विधि में, आप लिखेंगे इस:

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

और फिर जब तुम निर्माण कर रहे हैं MaxScoreForm1 से (मुझे लगता है कि आप यही कर रहे हैं):

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

जब मैं यह सब जोड़ता हूं और संकलन और चलाने की कोशिश करता हूं, तो मैक्सस्कोर बटन पर ठीक दबाएं, मुझे एक अपवाद मिलता है: MainForm.myGameCountLbl.Text = MainForm.max.ToString(); कह रहा है: NullReferenceException को अनचाहे किया गया था। वस्तु का संदर्भ वस्तु की आवृत्ति अनुसार सेट नहीं. है। – Eric

+0

क्या आपने वास्तव में मेनफॉर्म सेट किया था, जैसा कि मैंने कोड के अंतिम भाग में दिखाया था? –

+0

हां मैंने किया। मेरे फॉर्म 1 कन्स्ट्रक्टर में मेरे पास कोड का आखिरी टुकड़ा है। – Eric

2

मैं आपकी समस्या को हल करने के संबंध में @lassevk से सहमत हूं। मैं लेबल 1 को फॉर्म 1 कक्षा के भीतर एक विधि में सेट करने के व्यवहार को लपेटने की भी सिफारिश करता हूं, जो केवल आपके कोड क्लीनर को रखने में मदद करता है और किस फ़ील्ड को अद्यतन करने के लिए जिम्मेदारी/ज्ञान रखता है और माता-पिता के रूप में उन्हें कैसे अपडेट किया जाता है। आप फॉर्म 1 में एक सार्वजनिक विधि को परिभाषित करेंगे जो स्ट्रिंग मान लेता है और उस मान के साथ विशिष्ट लेबल अपडेट करता है। फिर मैक्सस्कोर फॉर्म में, अपने बटन में इवेंट हैंडलर पर क्लिक करें, आप उन लेबल नियंत्रणों को सीधे एक्सेस करने के बजाय उस विधि को कॉल करेंगे।

बस विचार के लिए भोजन।

+0

महान विचार के लिए धन्यवाद! – Eric