2012-09-09 19 views
7

मैं पहले से माफ़ी मांगता हूं कि संभवतः स्कोप के आधार पर काफी आसान/त्वरित उत्तर क्या होगा, लेकिन मैंने हर जगह देखा है और मुझे आश्चर्य नहीं है कि जवाब।विज़ुअल सी # - किसी अन्य वर्ग में बनाए गए ऑब्जेक्ट का एक्सेस इंस्टेंस

मैंने सैनिक नामक एक कक्षा बनाई है जिसमें लगभग 100 वर्ग चर हैं। मुझे उपयोगकर्ता को जानकारी दर्ज करने और धीरे-धीरे सॉलिडर ऑब्जेक्ट को कई अलग-अलग वर्ग प्रपत्रों के दौरान बनाने की आवश्यकता है (क्योंकि केवल एक पर एकत्र करने के लिए बहुत अधिक डेटा है)।

मैं Form1.cs में एक सैनिक (tempSoldier) के एक (खाली) उदाहरण बना सकते हैं और शुरू सेट वस्तु के वर्ग चर है कि मैं उपयोगकर्ता से इकट्ठा करने के लिए।

private void button1_Click(object sender, EventArgs e) 
{ 
    Soldier tempSoldier = new Soldier(); 
    tempSoldier.surname = textbox1.text; 
} 

मेरा प्रश्न: मैं अन्य वर्गों (Form2.cs, Form3.cs ...) में Form1.cs से वस्तु दृष्टान्त (tempSoldier) के लिए उपयोग कैसे प्राप्त करते हैं?

मुझे यह उल्लेख करना चाहिए कि सभी फॉर्म (फॉर्म 1.cs, Form2.cs ...) समान नामस्थान साझा करते हैं।

अग्रिम धन्यवाद

संपादित करें: काम के नीचे सभी समाधान तो यह सिर्फ निर्भर करता है जो इस बात पर आपको सबसे ज्यादा पसंद। आपकी प्रतिक्रिया के लिए आपका धन्यवाद। एक छोटा सा नोट, सुनिश्चित करें कि आप अपने क्लास क्लास (मेरे मामले में Soldier.cs) सहित सभी क्लास संशोधक सार्वजनिक बनाते हैं।

+0

आपकी स्थानीय घोषणा में एवी होगी ery संक्षिप्त जीवनकाल। यदि आपने इसे फ़ॉर्म में किसी विधि के बजाय फ़ॉर्म में घोषित किया है, तो आप इसे अन्यत्र 'Form1.tempSoldier' के रूप में संदर्भित कर सकते हैं। – HABO

उत्तर

7

आपको उच्च स्कोप में Soldier इंस्टेंस घोषित करने की आवश्यकता होगी। ऐसा करने अंदर यह घोषणा करने के लिए Form1 होगा की

एक ही रास्ता है, तो को इसे पारित Form2, और इतने पर।

public class Form1 
{ 
    private Soldier tempSoldier = new Soldier(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     tempSoldier = new Soldier(); 
     tempSoldier.surname = textbox1.text; 
    } 

    private void GotoNextStep() 
    { 
     // pass the existing instance to the next form 
     Form2 form2 = new Form2(tempSoldier); 

     // display form 2 ... 
    } 
} 

एक और संभावना एक वर्ग है कि सभी रूपों के लिए उपयोग किया है में एक सिंगलटन चर का उपयोग करने के लिए है।

public class MyAppManager 
{ 
    private static readonly Soldier _soldier = new Solider(); 

    public static Soldier SoldierInstance 
    { 
     get { return _soldier; } 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    MyAppManager.SoldierInstnace.surname = textbox1.text; 
} 

यदि दृष्टिकोण के लिए एक अलग अनुक्रम है तो पूर्व दृष्टिकोण ठीक है; उत्तरार्द्ध बेहतर होता है यदि अंतर के रूप अलग-अलग समय पर उपयोग किए जा सकते हैं या फिर से संशोधित किया जा सकता है।

+1

मैंने पहले समाधान की कोशिश की लेकिन मुझे फॉर्म 2 कन्स्ट्रक्टर (असंगत पहुंच ...) पर एक अजीब त्रुटि मिली जब मैंने पैरामीटर जोड़ने की कोशिश की (सुनिश्चित नहीं है कि क्यों यह बहुत तार्किक लग रहा था)। दूसरा समाधान सबसे सरल/साफ था और यह ठीक काम करता था। –

+0

यदि मेमोरी परोसा जाता है, तो आपको केवल यह सुनिश्चित करने की आवश्यकता है कि फॉर्म के लिए वर्ग और सैनिक के लिए कक्षा में समान पहुंच हो। – kdmurray

+0

दोनों को सार्वजनिक के रूप में सूचीबद्ध किया गया है और मुझे अभी भी एक ही त्रुटि मिल रही है? –

3

आपको अपने फॉर्म पर सार्वजनिक संपत्ति बनाना चाहिए जो सैनिक को उजागर करे। फिर आप इस प्रॉपर्टी को अन्य रूपों से एक्सेस कर सकते हैं।

// ... 

public Soldier Soldier { get; private set; } 

private void button1_Click(object sender, EventArgs e) 
{ 
    Soldier tempSoldier = new Soldier(); 
    tempSoldier.surname = textbox1.Text; 

    this.Soldier = tempSoldier; 
} 

// ... 

आपका Form2 वर्ग कुछ इस तरह दिखाई दे सकता है:

public static Soldier soldier {get;set;} 
private void button1_Click(object sender, EventArgs e) 
{ 
    soldier = new Soldier(); 
    soldier.surname = textbox1.text; 
} 

कोड अन्य रूपों में:

public partial class Form2 
{ 
    private Form1 form1; 

    public Form2(Form1 form1) 
    { 
    this.form1 = form1; 

    this.InitializeComponent(); 
    } 

    public void DoStuffWithForm1() 
    { 
    // ... 

    string surname = this.form1.Soldier.surname; 

    // ... 
    } 
} 
+0

मुझे पिछले त्रुटि के समान त्रुटि संदेश मिलता है: "असंगत पहुंच: संपत्ति के प्रकार की तुलना में संपत्ति का प्रकार कम पहुंच योग्य है": सार्वजनिक सैनिक सैनिक {प्राप्त करें; निजी सेट; } मुझे समझ में आता है कि इसे संशोधक के साथ करना है, लेकिन हर कोई सार्वजनिक के रूप में सूचीबद्ध है और फिर भी त्रुटि –

+0

गूंगा गलती बनी हुई है ... जब मैंने सैनिक वर्ग घोषित किया {...} मैं सार्वजनिक संशोधक (भूलना भूल गया डिफ़ॉल्ट रूप से यह निजी पर सेट है)। –

0

तुम भी सैनिक एक स्थिर चर बना सकते हैं

Form1.soldier.name =""; 
+0

यह सबसे सुरुचिपूर्ण समाधान की तरह लगता है। –