Làm cách nào để trả về giá trị từ Biểu mẫu trong C #?


185

Tôi có một biểu mẫu chính (hãy gọi nó là frmHireQuote) là con của biểu mẫu MDI chính (frmMainMDI), hiển thị một biểu mẫu khác (frmImportContact) qua ShowDialog () khi nhấp vào nút.

Khi người dùng nhấp vào 'OK' trên frmImportContact, tôi muốn chuyển một vài biến chuỗi trở lại một số hộp văn bản trên frmHireQuote.

Lưu ý rằng có thể có nhiều phiên bản của frmHireQuote, điều quan trọng là tôi phải quay lại trường hợp được gọi là phiên bản này của frmImportContact.

Phương pháp tốt nhất để làm điều này là gì?

Câu trả lời:


366

Tạo một số Thuộc tính công khai trên biểu mẫu con của bạn như vậy

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

sau đó đặt cái này bên trong biểu mẫu phụ của bạn , nhấn nút xử lý

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

Sau đó, ở dạng frmHireQuote của bạn , khi bạn mở biểu mẫu con

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 nếu bạn muốn hủy ra khỏi tiểu dạng bạn chỉ có thể thêm một nút vào form và thiết lập của nó DialogResult để Cancelvà bạn cũng có thể thiết lập các CancelButton tài sản của các hình thức để nút nói - điều này sẽ cho phép các phím Esc để hủy bỏ ra của hình thức.


33
Một vài sai sót quan trọng. Một biểu mẫu được hiển thị với ShowDialog () không được xử lý. Bạn phải sử dụng câu lệnh sử dụng ở đây. ShowDialog () trả về giá trị DialogResult, đừng bỏ qua nó hoặc bạn sẽ thử sử dụng các thuộc tính hộp thoại khi người dùng hủy hộp thoại.
Hans Passant

Chúc mừng, tôi đã tính đến điều này.
Jez Clark

Mini-phê bình: thiết lập cần thêm dấu chấm phẩy.
B. Clay Shannon

16

Tôi thường tạo một phương thức tĩnh trên biểu mẫu / hộp thoại mà tôi có thể gọi. Điều này trả về thành công (nút OK) hoặc thất bại, cùng với các giá trị cần được điền vào.

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


 }

Và trên mẫu:

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;
     }
}

Để gọi mẫu của bạn;

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

Đã sử dụng phương pháp này cũng được, hoạt động tốt. Tuy nhiên, tiền tố của lớp kết quả với frmcan (và chỉ làm khi tôi đọc nó) dẫn đến sự nhầm lẫn ...
Richard Friend

Tôi chỉ sử dụng lại tên từ câu hỏi (+ gõ nhanh). Tôi sẽ đổi nó thành một cái tên tốt hơn.
GvS

6

Tìm thấy một vấn đề nhỏ khác với mã này ... hoặc ít nhất là nó có vấn đề khi tôi cố gắng thực hiện nó.

Các nút trong frmMain không trả về giá trị tương thích, sử dụng VS2010 tôi đã thêm vào như sau và mọi thứ bắt đầu hoạt động tốt.

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;
     }
}

Sau khi thêm hai giá trị nút, hộp thoại hoạt động rất tốt! Cảm ơn ví dụ, nó thực sự có ích.


1

Tôi chỉ đưa vào constructor một cái gì đó bằng cách tham chiếu, vì vậy biểu mẫu con có thể thay đổi giá trị của nó và biểu mẫu chính có thể lấy đối tượng mới hoặc sửa đổi từ biểu mẫu con.


0

Tôi sử dụng MDI khá nhiều, tôi thích nó nhiều hơn (nơi có thể sử dụng nó) hơn nhiều dạng nổi.

Nhưng để có được điều tốt nhất từ ​​nó, bạn cần nắm bắt được các sự kiện của riêng bạn. Nó làm cho cuộc sống dễ dàng hơn nhiều cho bạn.

Một ví dụ về bộ xương.

Có loại xen kẽ của riêng bạn,

//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
}

Sau đó, loại đối số của riêng bạn

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; }

}

Sau đó sử dụng ủy nhiệm trong không gian tên của bạn, nhưng bên ngoài một lớp

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

Bây giờ, bằng tay hoặc sử dụng GUI, có MDIparent trả lời các sự kiện của biểu mẫu con.

Nhưng với đối số owr của bạn, bạn có thể giảm hàm này xuống một hàm duy nhất. và bạn có thể có điều khoản để xen vào các phần xen kẽ, tốt cho việc gỡ lỗi, nhưng cũng có thể hữu ích theo những cách khác.

Chỉ cần có mã sự kiện mdiparent của bạn trỏ đến một chức năng,

        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);

Một cơ chế chuyển đổi đơn giản thường là đủ để chuyển các sự kiện sang các hình thức thích hợp.


0

Nếu bạn muốn truyền dữ liệu form2từ form1mà không truyền như mớiform(sting "data");

Làm như vậy trong mẫu 1

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

ở dạng 2 thêm

public string ReturnValue1 { get; set; }

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

Ngoài ra, bạn có thể sử dụng giá trị form1như thế này nếu bạn muốn trao đổi một cái gì đó trongform1

chỉ trong mẫu1

textbox.Text =form2.ReturnValue1

0

Trước tiên, bạn phải xác định thuộc tính trong form2 (con), bạn sẽ cập nhật thuộc tính này trong form2 và cũng từ form1 (cha mẹ):

 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";
 }

Gọi form2 (con) từ form1 (cha mẹ):

  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

Tôi đưa ra một sự kiện trong biểu mẫu đặt giá trị và đăng ký sự kiện đó trong (các) biểu mẫu cần xử lý thay đổi giá trị.


Này đó! Bạn có thể giải thích thêm một chút về câu trả lời của mình và có thể cung cấp một mẫu mã để giúp đỡ người dùng trong tương lai không?
Jeremy Harris

0

đại biểu là lựa chọn tốt nhất để gửi dữ liệu từ dạng này sang dạng khác.

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");
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.