Gửi giá trị từ biểu mẫu này sang biểu mẫu khác


84

Tôi muốn chuyển các giá trị giữa hai Biểu mẫu (c #). Tôi làm nó như thế nào?

Tôi có hai biểu mẫu: Form1 và Form2.

Form1 chứa một nút. Khi tôi nhấp vào nút đó, Form2 sẽ mở và Form1 sẽ ở chế độ không hoạt động (tức là không thể chọn).

Form2 chứa một hộp văn bản và một nút gửi. Khi tôi nhập bất kỳ thông báo nào vào hộp văn bản của Form2 và nhấp vào nút gửi, thì Form2 sẽ đóng và Form1 sẽ đánh dấu bằng giá trị đã gửi.

Tôi làm nó như thế nào? Ai đó có thể giúp tôi làm điều này với một ví dụ đơn giản.


Bạn có ví dụ nào cho điều này không?
Millar

Câu trả lời:


58

Có một số giải pháp cho điều này nhưng đây là mô hình tôi có xu hướng sử dụng.

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

Và ...

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

Tôi nghĩ đây là quy tắc ứng xử tồi. Điều này là tuyệt vời sau đó. Tôi cũng sẽ sử dụng mô hình này
CasperT

Vâng, tôi không nghĩ đó là "hạnh kiểm" xấu, tuy nhiên có những tác động bảo mật cần xem xét trước khi sử dụng mẫu này. (Nhưng, ví dụ đơn giản tuyệt vời +1)

1
Cũng đừng quên rằng bạn cũng sẽ cần phải có trên form2 thay vì form2.Close (); sử dụng "DialogResult = DialogResult.OK;" hoặc nó sẽ không phát hiện biểu mẫu đã được mở.
Burgo855

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
Tôi đã kiểm tra mã này, nếu chúng tôi không gọi hàm tạo mặc định của Form2, public Form2(string qs):this(){}biểu mẫu sẽ không được hiển thị tốt.
rene

Đây là tùy chọn tôi đã sử dụng và nó hoạt động tốt đối với tôi!
Symon

14

Xác định một thuộc tính

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

bên trong form2

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

Lấy dữ liệu trong form1form3

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

6

Sau một loạt đấu tranh để chuyển dữ liệu từ dạng này sang dạng khác, cuối cùng, tôi đã tìm ra câu trả lời ổn định. Nó hoạt động giống như sự quyến rũ.

Tất cả những gì bạn cần làm là khai báo một biến như public static datatype 'variableName'trong một biểu mẫu và gán giá trị cho biến này mà bạn muốn chuyển sang một biểu mẫu khác và gọi biến này trong một biểu mẫu khác bằng cách sử dụng trực tiếp tên biểu mẫu ( Không tạo đối tượng của biểu mẫu này dưới dạng biến static có thể được truy cập trực tiếp ) và truy cập giá trị biến này.

Ví dụ về điều đó là,

Hình thức 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
Vấn đề của phương pháp này là nếu bạn có nhiều Form1 được mở, chúng sẽ ghi đè giá trị "số lượng". Và Form2 của bạn nhận giá trị của Form1 được mở mới nhất.
Arash Aghlara

4

Khai báo một chuỗi công khai trong form1

public string getdata;

Trong nút của form1

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

Để gửi dữ liệu cho form1bạn, bạn có thể thử bất kỳ sự kiện nào và mã sau trong sự kiện đó

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

Bây giờ sau khi đóng form2và mở form1, bạn có thể sử dụng dữ liệu trả về trong getdatachuỗi.


Tôi và thực hiện giống như bạn đề xuất trong các biểu mẫu của tôi nhưng vấn đề tôi nhận được là giá trị trả về không xuất hiện trong trường văn bản miễn là tôi nhấn nút nhấn một lần nữa.
wsDev

3

Tôi đã làm việc trên các dự án winform khác nhau và khi các ứng dụng trở nên phức tạp hơn (nhiều hộp thoại và tương tác giữa chúng hơn) thì tôi đã bắt đầu sử dụng một số hệ thống tổ chức sự kiện để giúp tôi, bởi vì việc quản lý mở và đóng cửa sổ theo cách thủ công sẽ khó duy trì và phát triển hơn nữa.

Tôi đã sử dụng CAB cho các ứng dụng của mình, nó có một hệ thống sự kiện nhưng nó có thể là quá mức cần thiết trong trường hợp của bạn :) Bạn có thể viết các sự kiện của riêng mình cho các ứng dụng đơn giản hơn


+1 cho các sự kiện, chúng có quy mô độc đáo. Nhưng bạn thực sự lưu trữ các giá trị ở đâu? Một lớp tĩnh là đủ đơn giản, nhưng gần với việc sử dụng một biến toàn cục, nó cảm thấy ... tệ. Mỗi biểu mẫu có biến cục bộ riêng cho các cài đặt liên quan đến nó không?

2

khai báo chuỗi trong form1 public string TextBoxString;

trong form1 nhấp chuột sự kiện thêm

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

trong trình tạo form2

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

trong biến thùng form2 Form1 firstformRef;

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

    }

Tại sao phải tạo mới Form1? Tại sao không chuyển thischo hàm Form2tạo?

2

Mã Form1:

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
}

Mã Form2:

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

        }

Nó hoạt động!


2

Trong mã này, bạn chuyển một văn bản đến Form2. Form2 hiển thị văn bản đó trong textBox1. Người dùng nhập văn bản mới vào textBox1 và nhấn nút gửi. Form1 lấy văn bản đó và hiển thị nó trong hộp văn bản trên Form1.

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

Và đây là mã Form1:

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

Ok, Form1có một hộp văn bản, trước hết bạn phải đặt Form1hộp văn bản này thành công khai trong thuộc tính hộp văn bản.

Mã Mẫu1:

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

Vượt qua Form1nhưthis trong hàm tạo.

Mã Mẫu2:

Private Form1 _firstForm;

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

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

Đến với bài viết này vì một sự khác biệt. Câu hỏi tôi đã trả lời. Điều này được ưu tiên và trong một Chương trình hiện đại, việc chuyển biểu mẫu chính sang biểu mẫu trẻ em thường sẽ hữu ích. Đây nên là câu trả lời ưa thích imo
Nico Walsemann

1

bạn có thể chuyển dưới dạng tham số hộp văn bản của Form1, như sau:

Trên xử lý mông của Biểu mẫu 1:

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

Trên Mẫu 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

Trình tạo là cách tốt nhất để truyền dữ liệu giữa các biểu mẫu hoặc Đối tượng Gui mà bạn có thể làm điều này. Trong nút bấm của form1, bạn nên có:

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

Ở dạng 2, khi người dùng nhấp vào nút, nó sẽ có mã như thế này hoặc tương tự:

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

Khi bên trong tải biểu mẫu của biểu mẫu 1, bạn có thể thêm mã để làm bất cứ điều gì khi bạn nhận các giá trị từ hàm tạo.


Cảm ơn. Điều này có ý nghĩa nhất đối với tôi. Tôi đã thử mọi thứ khác trên trang này và đây là trang duy nhất hoạt động!
Chud37

0

Cách chuyển các giá trị từ biểu mẫu sang biểu mẫu khác

1.) Goto Form2 rồi nhấp đúp vào nó. Tại mã gõ này.

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

2.) Goto Form1 rồi nhấp đúp vào nó. Tại mã gõ này. // Tại nút lệnh của bạn trong Form1

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

0

Điều này rất đơn giản. giả sử bạn có 2 dạng cửa sổ Form1 và Form2 và bạn muốn gửi bản ghi của textbox1 từ Form1 sang Form2 và hiển thị bản ghi này trong label1 của Form2; sau đó trong Biểu mẫu2 tạo một nhãn có tên là label1 và chuyển đến thuộc tính của label1 và đặt 'Modifiers' = public và trong Biểu mẫu một, tạo một textBox với id textBox1 và một nút tên gửi rồi viết mã sau vào sự kiện nhấp vào nút

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

vậy đó ... theo cách này, bạn có thể liên kết bản ghi tập dữ liệu với chế độ xem dữ liệu của biểu mẫu khác ......


0

Bạn có thể sử dụng một cách tiếp cận khác nếu muốn.

  1. Sử dụng System.Action (Ở đây bạn chỉ cần chuyển hàm main form làm tham số cho biểu mẫu con giống như một hàm gọi lại)
  2. Phương pháp OpenForms (Bạn gọi trực tiếp một trong các biểu mẫu đang mở của mình)

Sử dụng System.Action

Bạn có thể nghĩ về nó như một hàm gọi lại được truyền cho biểu mẫu con.

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

Phương pháp OpenForms

Phương pháp này rất dễ dàng ( 2 dòng ). Nhưng chỉ hoạt động với các biểu mẫu đang mở. Tất cả những gì bạn cần làm là thêm hai dòng này vào bất cứ nơi nào bạn muốn chuyển một số dữ liệu.

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

Tôi đã cung cấp câu trả lời của mình cho một câu hỏi tương tự ở đây


0

Bạn có thể sử dụng cái này;

Form1 button1 click

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

Và thêm nó vào Form2

public string info = "";

Form2 button1 click

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

nếu bạn thay đổi Thuộc tính bổ trợ của điều khiển trong Biểu mẫu thành Công khai, thì Biểu mẫu khác có thể truy cập vào điều khiển đó. 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

Còn về việc sử dụng Sự kiện công khai

Tôi sẽ làm nó như thế này.

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

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

và gọi nó từ Form1 như thế này.

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

        frm.ShowDialog();
    }
}

Sau đó, Form1 có thể nhận được một văn bản từ Form2 khi Form2 bị đóng

Cảm ơn bạn.


-1
// In form 1
public static string Username = Me;

// In form 2's load block
string _UserName = Form1.Username;
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.