সি # তে একটি ফর্ম থেকে কীভাবে কোনও মান ফেরত পাবেন?


185

আমার একটি প্রধান ফর্ম রয়েছে (আসুন একে frmHireQuote বলি) এটি একটি প্রধান এমডিআই ফর্মের একটি শিশু (frmMainMDI), যা বোতামটি ক্লিক করার পরে শোডায়ালগ () এর মাধ্যমে অন্য ফর্ম (frmImportContact) দেখায়।

যখন ব্যবহারকারী frmImportContact এ 'Ok' ক্লিক করেন, আমি frmHireQuote- এ কিছু পাঠ্য বাক্সে কয়েকটি স্ট্রিং ভেরিয়েবলগুলি পাস করতে চাই।

নোট করুন যে frmHireQuote এর একাধিক উদাহরণ থাকতে পারে, এটি স্পষ্টতই গুরুত্বপূর্ণ যে আমি frmImportContact এর এই দৃষ্টান্তটিকে ডেকে আছি to

এটি করার সর্বোত্তম পদ্ধতিটি কী?

উত্তর:


366

আপনার সাব-ফর্মের মতো কিছু সরকারী সম্পত্তি তৈরি করুন

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 বলেন বাটন ফর্মের সম্পত্তি - এই আউট বাতিল করতে Escape কী সক্ষম করবে ফর্মের।


33
গুরুত্বপূর্ণ ত্রুটি একটি দম্পতি। শোডায়ালগ () সহ প্রদর্শিত একটি ফর্ম নিষ্পত্তি হয় না। আপনার অবশ্যই এখানে ব্যবহারের বিবৃতিটি ব্যবহার করতে হবে । শোডায়ালগ () একটি ডায়ালগ রেজাল্ট মান প্রদান করে, এটিকে এড়িয়ে যাবেন না বা ব্যবহারকারী যখন ডায়ালগটি বাতিল করেন আপনি ডায়ালগের বৈশিষ্ট্যগুলি ব্যবহার করার চেষ্টা করবেন।
হান্স প্যাস্যান্ট

চিয়ার্স, আমি এর জন্য হিসাব করেছি
জেজ ক্লার্ক

মিনি-সমালোচনা: সেটের জন্য সেমিকোলন সংযুক্ত করা দরকার।
বি ক্লে শ্যানন

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যেতে পারে (এবং আমি যখন এটি পড়েছিলাম কেবল তখনই) বিভ্রান্তির কারণ হতে পারে ...
রিচার্ড ফ্রেন্ড

আমি প্রশ্ন (+ দ্রুত টাইপিং) থেকে নামটি পুনরায় ব্যবহার করেছি। আমি এটিকে আরও ভাল নামে পরিবর্তন করব।
জিভিএস

6

এই কোডটি দিয়ে অন্য একটি ছোট সমস্যা পাওয়া গেছে ... বা আমি এটি প্রয়োগ করার চেষ্টা করার সময় কমপক্ষে সমস্যাযুক্ত ছিল।

ফর্মমেনের বোতামগুলি ভিএস 2010 ব্যবহার করে একটি সামঞ্জস্যপূর্ণ মান ফেরত দেয় না আমি নিম্নলিখিতটি যুক্ত করেছিলাম এবং সবকিছু ঠিকঠাক কাজ শুরু করে।

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
}

তারপরে আপনার নিজের আরগস টাইপ করুন

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
}

এখন হয় ম্যানুয়ালি বা জিইউআই ব্যবহার করে, শিশু ফর্মগুলির ইভেন্টগুলিতে এমডিআইপিয়ারেন্টদের সাড়া দিন।

তবে আপনার owr আরগ্সের সাহায্যে আপনি এটিকে একটি ফাংশনে হ্রাস করতে পারবেন। এবং আপনার ইন্টারবাটগুলি ইন্টারবাট করার বিধান থাকতে পারে, ডিবাগিংয়ের জন্য ভাল তবে অন্যান্য উপায়েও এটি কার্যকর হতে পারে।

কেবলমাত্র আপনার সমস্ত এমডিপেন্ট ইভেন্ট কোডগুলির একটি ফাংশনে নির্দেশ করুন,

        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

শুধু form1 এ

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");
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.