मूल्यों को एक रूप से दूसरे रूप में भेजें


84

मैं दो फॉर्म (c #) के बीच मानों को पास करना चाहता हूं। मैं यह कैसे कर सकता हूं?

मेरे पास दो फॉर्म हैं: फॉर्म 1 और फॉर्म 2।

फॉर्म 1 में एक बटन होता है। जब मैं उस बटन पर क्लिक करता हूं, तो फॉर्म 2 खुला होना चाहिए और फॉर्म 1 निष्क्रिय मोड में होना चाहिए (यानी चयन करने योग्य नहीं)।

फॉर्म 2 में एक टेक्स्ट बॉक्स और एक सबमिट बटन होता है। जब मैं फॉर्म 2 के टेक्स्ट बॉक्स में कोई संदेश टाइप करता हूं और सबमिट बटन पर क्लिक करता हूं, तो फॉर्म 2 को बंद करना चाहिए और फॉर्म 1 को प्रस्तुत मूल्य के साथ हाइलाइट करना चाहिए।

मैं यह कैसे कर सकता हूं? क्या कोई मुझे एक सरल उदाहरण के साथ ऐसा करने में मदद कर सकता है।


क्या आपको इसके लिए कोई उदाहरण मिला?
मिलर

जवाबों:


58

इसके कई समाधान हैं लेकिन यह वह पैटर्न है जिसका मैं उपयोग करता हूं।

// Form 1
// inside the button click event
using(Form2 form2 = new Form2()) 
{
    if(form2.ShowDialog() == DialogResult.OK) 
    {
        someControlOnForm1.Text = form2.TheValue;
    }
}

तथा...

// Inside Form2
// Create a public property to serve the value
public string TheValue 
{
    get { return someTextBoxOnForm2.Text; }
}

मुझे लगा कि यह खराब कोड आचरण था। यह तब महान है। मैं इस पैटर्न का उपयोग भी
करूंगा

खैर, मुझे नहीं लगता कि यह बुरा "आचरण" है, हालांकि इस पैटर्न का उपयोग करने से पहले विचार करने के लिए सुरक्षा निहितार्थ हैं। (लेकिन, महान सरल उदाहरण +1)

1
यह भी मत भूलो कि आपको form2 के बजाय form2 पर भी होना चाहिए। Close (); "DialogResult = DialogResult.OK?" का उपयोग करें या यह पता नहीं लगाएगा कि फॉर्म खोला गया था।
बरगो 855

39
private void button1_Click(object sender, EventArgs e)
{
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();    
}

 public Form2(string qs)
    {
        InitializeComponent();
        textBox1.Text = qs;

    }

2
मैंने इस कोड का परीक्षण किया है, अगर हम public Form2(string qs):this(){}फॉर्म 2 के डिफॉल्ट कंस्ट्रक्टर को नहीं बुलाते हैं, तो फॉर्म को अच्छी तरह से नहीं दिखाया जाएगा।
रेने

यह मेरे द्वारा उपयोग किया गया विकल्प है और इसने मेरे लिए ठीक काम किया है!
सिमोन

14

एक संपत्ति को परिभाषित करें

public static class ControlID {  
    public static string TextData { get; set; }
}

में form2

private void button1_Click(object sender, EventArgs e)
{  
    ControlID.TextData = txtTextData.Text;   
}

में डेटा हो रही है form1औरform3

private void button1_Click(object sender, EventArgs e)
{   
    string text=  ControlID.TextData;   
}

6

डेटा को एक रूप से दूसरे रूप में पारित करने के लिए संघर्ष की एक श्रृंखला के बाद आखिरकार मुझे एक स्थिर जवाब मिला। यह आकर्षण की तरह काम करता है।

आपको बस public static datatype 'variableName'एक फॉर्म के रूप में एक वैरिएबल घोषित करना होगा और इस वैरिएबल को वैल्यू असाइन करना होगा, जिसे आप दूसरे रूप में पास करना चाहते हैं और इस वेरिएबल को किसी दूसरे रूप में सीधे फॉर्म के नाम का उपयोग करके कॉल करें ( इस फॉर्म का ऑब्जेक्ट न बनाएं। स्थैतिक चर सीधे पहुँचा जा सकता है ) और इस चर मूल्य तक पहुँच सकते हैं।

इस तरह का उदाहरण है,

फॉर्म 1

public static int quantity;
quantity=TextBox1.text; \\Value which you want to pass

Form2

TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2

3
इस दृष्टिकोण का मुद्दा यह है कि यदि आपके पास कई फॉर्म 1 खुले हैं, तो वे "मात्रा" मान को ओवरराइड करते हैं। और आपके फॉर्म 2 को नवीनतम खोले गए फॉर्म 1 का मूल्य मिलता है।
अर्श अघलारा

4

में सार्वजनिक स्ट्रिंग घोषित करें form1

public string getdata;

के बटन में form1

form2 frm= new form2();
this.hide();
form2.show();

form1आपको डेटा भेजने के लिए उस घटना के बाद किसी भी घटना और कोड की कोशिश कर सकते हैं

form1 frm= new form1();
form1.getdata="some string to be sent to form1";

अब बंद करने form2और खोलने के बाद form1, आप getdataस्ट्रिंग में लौटा डेटा का उपयोग कर सकते हैं ।


मैं और मेरे रूप में आपके द्वारा सुझाए अनुसार ही कर रहा हूं, लेकिन मुझे जो मुद्दा मिल रहा है, वह यह है कि रिटर्न वैल्यू तब तक टेक्स्ट फील्ड में दिखाई नहीं देती, जब तक कि मैं फिर से पुश बटन नहीं मारता।
wsDev

3

मैंने विभिन्न विनफॉर्म परियोजनाओं पर काम किया है और जैसे-जैसे एप्लिकेशन अधिक जटिल होते जाते हैं (उनके बीच अधिक संवाद और बातचीत) तब मैंने मेरी मदद करने के लिए कुछ ईवेंटिंग सिस्टम का उपयोग करना शुरू कर दिया है, क्योंकि मैन्युअल रूप से विंडो खोलने और बंद करने का प्रबंधन कठिन होगा आगे बनाए रखना और विकसित करना।

मैंने अपने अनुप्रयोगों के लिए CAB का उपयोग किया है , इसमें एक ईवेंटिंग सिस्टम है, लेकिन यह आपके मामले में एक ओवरकिल हो सकता है :) आप सरल अनुप्रयोगों के लिए अपने स्वयं के ईवेंट लिख सकते हैं


घटनाओं के लिए +1, वे अच्छी तरह से स्केल करते हैं। लेकिन आप वास्तव में मूल्यों को कहाँ संग्रहीत करते हैं? एक स्थिर वर्ग काफी सरल है, लेकिन यह एक वैश्विक चर का उपयोग करने के करीब है, ऐसा लगता है ... icky। क्या प्रत्येक फॉर्म में सेटिंग्स के लिए अपना स्थानीय चर है जो इससे संबंधित है?

2

Form1 सार्वजनिक स्ट्रिंग TextBoxString में घोषणा स्ट्रिंग;

form1 में ईवेंट जोड़ें क्लिक करें

private void button1_Click(object sender, EventArgs e)
    {
        Form1 newform = new Form1();
        newform = this;
        this.Hide();
        MySecform = new Form2(ref newform);
        MySecform.Show();
    }

form2 कंस्ट्रक्टर में

public Form2(ref Form1 form1handel)
    {
        firstformRef = form1handel;
        InitializeComponent();
    }

form2 टोकरा चर में Form1 FirstformRef;

private void Submitt_Click(object sender, EventArgs e)
    {
        firstformRef.TextBoxString = textBox1.Text;
        this.Close();
        firstformRef.Show();

    }

नया क्यों बनाएं Form1? कंस्ट्रक्टर thisको पास क्यों नहीं Form2?

2

फॉर्म 1 कोड:

private void button1_Click(object sender, EventArgs e)
{
            Form2 f2 = new Form2();
            f2.ShowDialog();
            MessageBox.Show("Form1 Message :"+Form2.t.Text); //can put label also in form 1 to show the value got from form2
}

फॉर्म 2 कोड:

        public Form2()
        {
            InitializeComponent();
            t = textBox1;                        //Initialize with static textbox
        }
        public static TextBox t=new TextBox();   //make static to get the same value as inserted
        private void button1_Click(object sender, EventArgs e)
        {

            this.Close();

        }

यह काम करता हैं!


2

इस कोड में, आप फॉर्म 2 में एक पाठ पास करते हैं। फॉर्म 2 टेक्स्टबॉक्स 1 में उस टेक्स्ट को दिखाता है। उपयोगकर्ता टेक्स्टबॉक्स 1 में नया पाठ टाइप करता है और सबमिट बटन दबाता है। फॉर्म 1 उस टेक्स्ट को पकड़ लेता है और फॉर्म 1 पर टेक्स्टबॉक्स में दिखाता है।

public class Form2 : Form
{
    private string oldText;

    public Form2(string newText):this()
    {
        oldText = newText;
        btnSubmit.DialogResult = DialogResult.OK;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        textBox1.Text = oldText;
    }

    public string getText()
    {
        return textBox1.Text;
    }

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            DialogResult = System.Windows.Forms.DialogResult.OK;
        }
    }
}

और यह फॉर्म 1 कोड है:

public class Form1:Form
{
    using (Form2 dialogForm = new Form2("old text to show in Form2"))
    {
        DialogResult dr = dialogForm.ShowDialog(this);
        if (dr == DialogResult.OK)
        {
            tbSubmittedText = dialogForm.getText();
        }
        dialogForm.Close();
    }
}

2

ठीक है तो Form1एक टेक्स्टबॉक्स है, सबसे पहले आपको इस Form1टेक्स्टबॉक्स को टेक्स्टबॉक्स संपत्ति में सार्वजनिक करना होगा।

कोड फॉर्म 1:

Public button1_click()
{
    Form2 secondForm = new Form2(this);
    secondForm.Show();
}

दर्रा Form1के रूप में thisनिर्माता में।

कोड फॉर्म 2:

Private Form1 _firstForm;

Public Form2(Form1 firstForm)
{
    _firstForm = firstForm:
}

Public button_click()
{
    _firstForm.textBox.text=label1.text;
    This.Close();
}

एक अंतर के कारण इस पोस्ट पर आया। प्रश्न मैंने उत्तर दिया। यह पसंद किया जाता है और एक आधुनिक कार्यक्रम में, बच्चों के लिए मेनफॉर्म को पास करना अक्सर सहायक होगा। यह पसंदीदा उत्तर imo होना चाहिए
निको वाल्समैन

1

आप इस तरह से फॉर्म 1 के टेक्स्टबॉक्स को पैरामीटर के रूप में पारित कर सकते हैं:

फॉर्म 1 बटॉम हैंडलर:

private void button2_Click(object sender, EventArgs e)
{
Form2 newWindow = new Form2(textBoxForReturnValue);
newWindow.Show(); 
}

फॉर्म 2 पर

public static TextBox textBox2; // class atribute

public Form2(TextBox textBoxForReturnValue)
{
    textBox2= textBoxForReturnValue;
}

private void btnClose_Click(object sender, EventArgs e)
{

    textBox2.Text = dataGridView1.CurrentCell.Value.ToString().Trim();
    this.Close();
}

1

कंस्ट्रक्टर फॉर्म या गुई ऑब्जेक्ट्स के बीच डेटा पास करने का सबसे अच्छा तरीका है। फॉर्म 1 क्लिक बटन में आपके पास होना चाहिए:

Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();

प्रपत्र 2 में, जब उपयोगकर्ता बटन पर क्लिक करता है तो उसके पास इस तरह का कोड होना चाहिए या समान:

this.Close();
Form1 form = new Form1(textBox1.Text)
form.Show();

फॉर्म 1 के फॉर्म लोड के अंदर एक बार आप कुछ भी करने के लिए कोड जोड़ सकते हैं क्योंकि आपको कंस्ट्रक्टर से मान मिलते हैं।


धन्यवाद। यह मेरे लिए सबसे ज्यादा मायने रखता है। मैंने इस पृष्ठ पर और सब कुछ करने की कोशिश की और यह एकमात्र ऐसा काम था!
चुड 37

0

मूल्यों को एक रूप से दूसरे रूप में कैसे पारित किया जाए

1.) गोटो फॉर्म 2 फिर इसे डबल क्लिक करें। कोड पर यह लिखें।

public Form2(string v)
{
  InitializeComponent();
  textBox1.Text = v;
}

2.) गोटो फॉर्म 1 फिर डबल क्लिक करें। कोड पर यह लिखें। // Form1 में आपके कमांड बटन पर

private void button1_Click(object sender, EventArgs e)
{
   Form2 F2 = new Form2(textBox1.Text);
   F2.Show();
}

0

यह बहुत सरल है। मान लें कि आपके पास 2 विंडो फॉर्म Form1 और Form2 हैं और आप Form1 से Form2 तक textbox1 का रिकॉर्ड भेजना चाहते हैं और Form2 के लेबल 1 में इस रिकॉर्ड को प्रदर्शित करते हैं; फिर Form2 में एक लेबल बनाएं जिसका नाम लेबल 1 है और लेबल 1 की संपत्ति पर जाएं और 'संशोधक' = सार्वजनिक सेट करें और फॉर्म में एक व्यक्ति idboxBox1 के साथ एक टेक्स्टबॉक्स बनाएं और नाम सबमिट करें का एक बटन फिर बटन पर क्लिक करें घटना पर निम्नलिखित कोड लिखें

button1_Click(object sender, EventArgs e)
{
  Form2 obj=new Form2();
  obj.label1.text=textBox1.text.ToString();
  obj.show();
}

यही कारण है कि ... इस तरह से आप डेटासेट रिकॉर्ड को दूसरे फॉर्म के डेटाग्रिड्यू से जोड़ सकते हैं ......


0

आप चाहें तो एक अलग दृष्टिकोण का उपयोग कर सकते हैं।

  1. System.Action का उपयोग करना (यहाँ आप मुख्य रूप फ़ंक्शन को कॉलबैक फ़ंक्शन जैसे चाइल्ड फॉर्म के पैरामीटर के रूप में पास करते हैं)
  2. OpenForms विधि (आप सीधे अपने खुले रूपों में से एक कहते हैं)

System.Action का उपयोग करना

आप इसे बच्चे के रूप में दिए गए कॉलबैक फ़ंक्शन के रूप में सोच सकते हैं।

// -------- IN THE MAIN FORM --------

// CALLING THE CHILD FORM IN YOUR CODE LOOKS LIKE THIS
Options frmOptions = new Options(UpdateSettings);
frmOptions.Show();

// YOUR FUNCTION IN THE MAIN FORM TO BE EXECUTED
public void UpdateSettings(string data)
{
   // DO YOUR STUFF HERE
}

// -------- IN THE CHILD FORM --------

Action<string> UpdateSettings = null;

// IN THE CHILD FORMS CONSTRUCTOR
public Options(Action<string> UpdateSettings)
{
    InitializeComponent();
    this.UpdateSettings = UpdateSettings;
}

private void btnUpdate_Click(object sender, EventArgs e)
{
    // CALLING THE CALLBACK FUNCTION
    if (UpdateSettings != null)
        UpdateSettings("some data");
}

OpenForms विधि

यह विधि आसान ( 2 लाइन ) है। लेकिन केवल उन रूपों के साथ काम करता है जो खुले हैं। आपको बस इन दो लाइनों को जोड़ने की जरूरत है जहां आप कभी भी कुछ डेटा पास करना चाहते हैं।

Main frmMain = (Main)Application.OpenForms["Main"];
frmMain.UpdateSettings("Some data");

मैंने यहां एक ऐसे ही सवाल का जवाब दिया


0

आप इसका उपयोग कर सकते हैं;

Form1 बटन 1 क्लिक करें

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

और इसे Form2 में जोड़ें

public string info = "";

फॉर्म 2 बटन 1 पर क्लिक करें

private void button1_Click(object sender, EventArgs e)
{

    info = textBox1.Text;
    this.Hide();
    BeginInvoke(new MethodInvoker(() =>
    {
        Gogo();
    }));
}

public void Gogo()
{
    Form1 frm = new Form1();
    frm.Show();
    frm.Text = info;
}

0

यदि आप एक सार्वजनिक रूप में एक नियंत्रण के संशोधक संपत्ति को बदलते हैं, तो दूसरा प्रपत्र उस नियंत्रण तक पहुंच सकता है। fe:

    Form2 frm;
    private void Form1_Load(object sender, EventArgs e)
    {
        frm = new Form2();
        frm.Show();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(frm.txtUserName.Text); 
        //txtUserName is a TextBox with Modifiers=Public        
    }

-1

कैसे एक सार्वजनिक घटना का उपयोग करने के बारे में

मैं इसे इस तरह से करूंगा।

public class Form2
{
   public event Action<string> SomethingCompleted;

   private void Submit_Click(object sender, EventArgs e)
   {
       SomethingCompleted?.Invoke(txtData.Text);
       this.Close();
   }
}

और इसे फॉर्म 1 से इस तरह से कॉल करें।

private void btnOpenForm2_Click(object sender, EventArgs e)
{
    using (var frm = new Form2())
    {
        frm.SomethingCompleted += text => {
            this.txtData.Text = text;
        };

        frm.ShowDialog();
    }
}

फिर, फॉर्म 1 बंद होने पर फॉर्म 1 फॉर्म 2 से एक पाठ प्राप्त कर सकता है

धन्यवाद।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.