मेरे पास बटन, टेक्स्टबॉक्स और लेबल के साथ प्रत्येक में 2 रूप हैं। फॉर्म 1 में मेरे पास एक बटन इवेंट हैंडलर में यह कोड है:

 frmTwo form = new frmTwo ();
 form.Show();
 this.Visible = false; //closing form 1 when frmTwo opens

मैं frmTwo के लिए डिज़ाइनर फ़ाइल में गया और सभी नियंत्रणों को बदल दिया: लेबल, टेक्स्टबॉक्स, निजी से बटन (जो स्वतः उत्पन्न हुआ था) सार्वजनिक करने के लिए।

कोड की इस पंक्ति के तहत: this.Visible = false; मैं यह जांचने के लिए एक कथन रखना चाहता हूं कि frmTwo में नाम टेक्स्टबॉक्स खाली है या नहीं। लेकिन जब मैं txtName.Text लिखता हूं तो यह कहता है कि टेक्स्टबॉक्स वर्तमान संदर्भ में मौजूद नहीं है। मैं समझता हूं कि यह अस्तित्व में क्यों नहीं है क्योंकि इसके अंदर frmTwo NOT from1. लेकिन मुझे यकीन नहीं है कि मैं इस टेक्स्टबॉक्स को और किन तरीकों से एक्सेस कर सकता हूं क्योंकि मैंने इसे पहले ही डिजाइनर में सार्वजनिक कर दिया है। क्या इसे करने का और कोई तरीका है?

-1
user12960916 30 सितंबर 2020, 22:01

2 जवाब

सबसे बढ़िया उत्तर

अपने आप से पूछें: क्या फॉर्म 1 के लिए यह महत्वपूर्ण है कि जो जानकारी आप फॉर्म 2 से पढ़ना चाहते हैं वह टेक्स्टबॉक्स में हो? क्या फॉर्म 1 वास्तव में परवाह करेगा यदि वही जानकारी फॉर्म 2 द्वारा कॉम्बोबॉक्स में रखी जाएगी?

क्या यह सबसे अच्छा नहीं होगा यदि फॉर्म 1 को यह नहीं पता कि फॉर्म 2 को जानकारी कैसे मिलती है? इसे केवल इतना जानना है कि फॉर्म 2 जानकारी प्रदान करने के लिए तैयार है। अगर फॉर्म 2 को इसे डेटाबेस से पढ़ने की जरूरत है, या जानकारी प्राप्त करने के लिए इसे इंटरनेट से लाने की जरूरत है, तो फॉर्म 1 देखभाल क्यों करेगा? सभी फॉर्म1 जानना चाहते हैं: "अरे फॉर्म2, मुझे जानकारी दें X"

काश, आपने हमें यह नहीं बताया कि क्या आप यह जानकारी केवल एक बार चाहते हैं, या जब भी जानकारी X में परिवर्तन होता है, तो उस फॉर्म 1 को सूचित करने की आवश्यकता होती है। आइए मान लें कि आप करते हैं।

तो, कक्षा फॉर्म 2 में सूचना एक्स प्रदान करने की एक विधि होगी, और यह सभी को यह बताने के लिए तैयार है कि जानकारी एक्स बदल दी गई है। फॉर्म 2 बाहरी दुनिया को यह नहीं दिखाता कि उसे इसकी जानकारी कैसे मिलती है। वर्तमान संस्करण टेक्स्टबॉक्स 1 के पाठ में जानकारी एक्स रखता है। भविष्य के संस्करण इसे कॉम्बोबॉक्स से पढ़ सकते हैं, या फ़ाइल से या इंटरनेट से पढ़ सकते हैं।

class Form2 : System.Windows.Window
{
    public event EventHandler XChanged;

    public string X
    {
        // information X is in textBox1
        get => this.textBox1.Text;
    }

    private void TextBox1_Changed(object sender, ...)
    {
        // the text in textBox1 changed, so information X changed
        this.OnXChanged();
    }

    protected virtual void OnXChanged()
    {
        this.XChanged?.Invoke(new Eventhandler(this, EventArgs.Empty));
    }

    ... // other Form2 methods
}

अब अगर फॉर्म 1 एक्स का मूल्य जानना चाहता है, तो वह बस इसके लिए पूछ सकता है:

Form2 form2 = ...
string informationX = form2.X;

अगर फॉर्म 1 को सूचना X में परिवर्तन होने पर सूचित किया जाना चाहता है:

form2.XChanged += InformationXChanged;

private void InformationXChanged(object sender, Eventargs e)
{
    Form2 form2 = (Form2)sender;

    // get the new information X from form2:
    string informationX = form2.X;
    this.ProcessInformationX(informationX);
}
0
Harald Coppoolse 30 सितंबर 2020, 22:56

यदि आप चाहते हैं कि एक फॉर्म दूसरे को बदल दे, तो आप Form2 के .Show() में Form1 का संदर्भ पास करते हैं और फॉर्म इसे .Owner प्रॉपर्टी में स्टोर करता है। जब दूसरा फॉर्म शुरू होता है तो वह पहले फॉर्म को छुपा देगा। साथ ही, जब दूसरा प्रपत्र बंद हो जाता है तो वह पहले प्रपत्र को दिखा सकता है।

कृपया Form जैसे प्रकारों के लिए बड़े अक्षरों में नामों का उपयोग करें और mainForm = new Form() जैसे चरों के लिए पास्कलकेस का उपयोग करें।

फॉर्म1.सीएस

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var f2 = new Form2();
        f2.Show(this);
    }
}

फॉर्म2.सीएस

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        this.FormClosing += Form2_FormClosing;
        this.Owner.Visible = false;
    }
    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        Owner.Visible = true;
    }

    public bool IsNameBlank { get => string.IsNullOrWhiteSpace(textBox1.Text); }
}

यह बुनियादी ढांचा है। मैंने कुछ तर्क भी जोड़े हैं जहां Form1 Form2 में टेक्स्टबॉक्स की जांच करता है। Form2 में एक संपत्ति जोड़ें जो चेक लौटाती है:

और इसे फ़ॉर्म From1 एक्सेस करें

    private void button1_Click(object sender, EventArgs e)
    {
        var f2 = new Form2();
        f2.Show(this);

        if (f2.IsNameBlank)
        { 
            // textBox is empty.
        }
    }
0
JAlex 30 सितंबर 2020, 22:52