C # में फ़ॉर्म से मान कैसे लौटाएं?


185

मेरे पास एक मुख्य रूप है (चलो इसे frmHireQuote कहते हैं) जो कि मुख्य MDI फॉर्म (frmMainMDI) का एक बच्चा है, जो ShowDialog () के माध्यम से एक अन्य रूप (frmImportContact) दिखाता है जब एक बटन क्लिक किया जाता है।

जब उपयोगकर्ता frmImportContact पर 'OK' पर क्लिक करता है, तो मैं frmHireQuote पर कुछ टेक्स्ट बॉक्स में कुछ स्ट्रिंग चर वापस देना चाहता हूं।

ध्यान दें कि frmHireQuote के कई उदाहरण हो सकते हैं, यह स्पष्ट रूप से महत्वपूर्ण है कि मैं उस उदाहरण पर वापस लौटता हूं जिसे frmImportContact का उदाहरण कहा जाता है।

ऐसा करने का सबसे अच्छा तरीका क्या है?

जवाबों:


367

अपने उप-प्रपत्र पर कुछ सार्वजनिक गुण बनाएँ जैसे

public string ReturnValue1 {get;set;} 
public string ReturnValue2 {get;set;}

फिर इसे अपने उप-फॉर्म ओके बटन क्लिक हैंडलर के अंदर सेट करें

private void btnOk_Click(object sender,EventArgs e)
{
    this.ReturnValue1 = "Something";
    this.ReturnValue2 = DateTime.Now.ToString(); //example
    this.DialogResult = DialogResult.OK;
    this.Close();
}

फिर अपने frmHireQuote फॉर्म में , जब आप उप-फॉर्म खोलते हैं

using (var form = new frmImportContact())
{
    var result = form.ShowDialog();
    if (result == DialogResult.OK)
    {
        string val = form.ReturnValue1;            //values preserved after close
        string dateString = form.ReturnValue2;
        //Do something here with these values

        //for example
        this.txtSomething.Text = val;
    }
}

Additionaly अगर आप से बाहर रद्द करना चाहते हैं उप प्रपत्र तुम सिर्फ फ़ॉर्म में एक बटन जोड़ सकते हैं और इसके सेट DialogResult करने Cancelऔर आप भी सेट कर सकते हैं CancelButton कहा बटन को फार्म की संपत्ति - इस को रद्द करने से बच कुंजी सक्षम हो जाएगा फार्म का।


33
महत्वपूर्ण दोषों की एक जोड़ी। ShowDialog () के साथ प्रदर्शित किया गया एक फ़ॉर्म का निपटान नहीं किया गया है। आपको यहां दिए गए स्टेटमेंट का उपयोग करना होगा । ShowDialog () एक DialogResult मान लौटाता है, इसे अनदेखा न करें या उपयोगकर्ता द्वारा संवाद रद्द करने पर आप संवाद गुणों का उपयोग करने का प्रयास करेंगे।
हंस पैसेंट

चीयर्स, मैंने इसके लिए जिम्मेदार है।
जेज क्लार्क

मिनी-समालोचना: सेट की जरूरत अर्धविराम संलग्न है।
बी क्ले शैनन

16

मैं आमतौर पर फ़ॉर्म / संवाद पर एक स्थिर विधि बनाता हूं, जिसे मैं कॉल कर सकता हूं। यह सफलता (ओके-बटन) या विफलता को लौटाता है, साथ ही उन मूल्यों के साथ जो भरने की आवश्यकता है।

 public class ResultFromFrmMain {
     public DialogResult Result { get; set; }
     public string Field1 { get; set; }


 }

और फार्म पर:

public static ResultFromFrmMain Execute() {
     using (var f = new frmMain()) {
          var result = new ResultFromFrmMain();
          result.Result = f.ShowDialog();
          if (result.Result == DialogResult.OK) {
             // fill other values
          }
          return result;
     }
}

अपने फॉर्म को कॉल करने के लिए;

public void MyEventToCallForm() {
   var result = frmMain.Execute();
   if (result.Result == DialogResult.OK) {
       myTextBox.Text = result.Field1; // or something like that
   }
}

इस दृष्टिकोण का उपयोग किया है, अच्छी तरह से काम करता है। हालाँकि परिणाम वर्ग को उपसर्ग के साथ frm(और बस तब जब मैंने इसे पढ़ा था) भ्रम की स्थिति पैदा कर सकता है ...
रिचर्ड मित्र

मैंने सिर्फ प्रश्न (+ तेज़ टाइपिंग) से नाम का पुन: उपयोग किया। मैं इसे बेहतर नाम में बदल दूंगा।
GvS

6

इस कोड के साथ एक और छोटी समस्या मिली ... या कम से कम यह समस्याग्रस्त थी जब मैंने इसे लागू करने की कोशिश की।

FrmMain में बटन एक संगत मूल्य नहीं देते हैं, VS2010 का उपयोग करके मैंने निम्नलिखित को जोड़ा और सब कुछ ठीक काम करना शुरू कर दिया।

public static ResultFromFrmMain Execute() {
     using (var f = new frmMain()) {

          f.buttonOK.DialogResult = DialogResult.OK;
          f.buttonCancel.DialogResult = DialogResult.Cancel;

          var result = new ResultFromFrmMain();
          result.Result = f.ShowDialog();

          if (result.Result == DialogResult.OK) {
             // fill other values
          }
          return result;
     }
}

दो बटन मूल्यों को जोड़ने के बाद, संवाद ने शानदार काम किया! उदाहरण के लिए धन्यवाद, यह वास्तव में मदद की।


1

मैं सिर्फ संदर्भ के द्वारा कुछ निर्माण करता हूं, इसलिए सबफॉर्म अपना मूल्य बदल सकता है और मुख्य फॉर्म सबफॉर्म से नई या संशोधित वस्तु प्राप्त कर सकता है।


0

मैं एमडीआई का उपयोग बहुत अधिक करता हूं, मुझे कई फ्लोटिंग रूपों की तुलना में यह बहुत अधिक (जहां इसका उपयोग किया जा सकता है) पसंद है।

लेकिन इससे सबसे अच्छा पाने के लिए आपको अपनी खुद की घटनाओं के साथ पकड़ना होगा। यह आपके लिए जीवन को इतना आसान बना देता है।

एक कंकाल का उदाहरण।

अपने स्वयं के इंटरप्ट प्रकार हैं,

//Clock, Stock and Accoubts represent the actual forms in
//the MDI application. When I have multiple copies of a form
//I also give them an ID, at the time they are created, then
//include that ID in the Args class.
public enum InteruptSource
{
    IS_CLOCK = 0, IS_STOCKS, IS_ACCOUNTS
}
//This particular event type is time based,
//but you can add others to it, such as document
//based.
public enum EVInterupts
{
    CI_NEWDAY = 0, CI_NEWMONTH, CI_NEWYEAR, CI_PAYDAY, CI_STOCKPAYOUT, 
   CI_STOCKIN, DO_NEWEMAIL, DO_SAVETOARCHIVE
}

फिर अपने खुद के Args प्रकार

public class ControlArgs
{
    //MDI form source
    public InteruptSource source { get; set; }
    //Interrupt type
    public EVInterupts clockInt { get; set; }
    //in this case only a date is needed
    //but normally I include optional data (as if a C UNION type)
    //the form that responds to the event decides if
    //the data is for it.
    public DateTime date { get; set; }
    //CI_STOCKIN
    public StockClass inStock { get; set; }

}

फिर अपने नाम स्थान के भीतर प्रतिनिधि का उपयोग करें, लेकिन एक वर्ग के बाहर

namespace MyApplication
{
public delegate void StoreHandler(object sender, ControlArgs e);
  public partial class Form1 : Form
{
  //your main form
}

अब या तो मैन्युअल रूप से या जीयूआई का उपयोग करके, बच्चे के रूपों की घटनाओं के लिए MDIparent प्रतिक्रिया है।

लेकिन अपने उल्लू आर्ग्स के साथ, आप इसे एक ही फ़ंक्शन में कम कर सकते हैं। और आप डिबगिंग के लिए अच्छा है, इंटरप्‍ट को इंटरप्‍ट करने का प्रावधान कर सकते हैं, लेकिन अन्‍य तरीकों से भी उपयोगी हो सकते हैं।

बस अपने mdiparent ईवेंट कोड्स को एक फ़ंक्शन के लिए इंगित करें,

        calendar.Friday += new StoreHandler(MyEvents);
        calendar.Saturday += new StoreHandler(MyEvents);
        calendar.Sunday += new StoreHandler(MyEvents);
        calendar.PayDay += new StoreHandler(MyEvents);
        calendar.NewYear += new StoreHandler(MyEvents);

एक साधारण स्विच तंत्र आमतौर पर घटनाओं को उपयुक्त रूपों में पारित करने के लिए पर्याप्त है।


0

यदि आप form2से डेटा पास करना चाहते हैंform1 नए तरह गुजर बिनाform(sting "data");

उस तरह से करें 1 फार्म में

using (Form2 form2= new Form2())
{
   form2.ReturnValue1 = "lalala";
   form2.ShowDialog();
}

फॉर्म 2 में जोड़ें

public string ReturnValue1 { get; set; }

private void form2_Load(object sender, EventArgs e)
{
   MessageBox.Show(ReturnValue1);
}

इसके अलावा आप में मूल्य का उपयोग कर सकते हैं form1 इस तरह से यदि आप कुछ में स्वैप करना चाहते हैंform1

सिर्फ फॉर्म 1 में

textbox.Text =form2.ReturnValue1

0

पहले आपको फॉर्म 2 (बच्चे) में विशेषता को परिभाषित करना होगा आप इस विशेषता को फॉर्म 2 और फॉर्म 1 (माता-पिता) से भी अपडेट करेंगे:

 public string Response { get; set; }

 private void OkButton_Click(object sender, EventArgs e)
 {
    Response = "ok";
 }

 private void CancelButton_Click(object sender, EventArgs e)
 {
    Response = "Cancel";
 }

फॉर्म 1 (माता-पिता) से फॉर्म 2 (बच्चे) की कॉलिंग:

  using (Form2 formObject= new Form2() )
  {
     formObject.ShowDialog();

      string result = formObject.Response; 
      //to update response of form2 after saving in result
      formObject.Response="";

      // do what ever with result...
      MessageBox.Show("Response from form2: "+result); 
  }

0

मैं मान सेट करने वाले फ़ॉर्म में एक ईवेंट बढ़ाता हूं और फॉर्म (नों) में उस ईवेंट की सदस्यता लेता हूं, जिसे मूल्य परिवर्तन से निपटने की आवश्यकता होती है।


सुनो! क्या आप अपने उत्तर पर थोड़ा और विस्तार कर सकते हैं और संभवतः भावी उपयोगकर्ताओं की मदद के लिए एक कोड नमूना प्रदान कर सकते हैं?
जेरेमी हैरिस

0

प्रतिनिधियों को एक फॉर्म से दूसरे फॉर्म में डेटा भेजने का सबसे अच्छा विकल्प है।

public partial class frmImportContact : Form
{
     public delegate void callback_data(string someData);
    public event callback_data getData_CallBack;

    private void button_Click(object sender, EventArgs e)
    {
      string myData = "Top Secret Data To Share";
      getData_CallBack(myData);
    }

}

public partial class frmHireQuote : Form
{
     private void Button_Click(object sender, EventArgs e)
    {

      frmImportContact obj = new frmImportContact();
      obj.getData_CallBack += getData;
    }

    private void getData(string someData)
    {
         MessageBox.Show("someData");
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.