2013-07-24 26 views
5

Tôi đang cố gắng tìm ra cách để chuyển các giá trị giữa các biểu mẫu. Tôi có bốn biểu mẫu và tôi muốn chuyển thông tin được truy xuất bởi Login đến biểu mẫu thứ tư và cuối cùng.Chuyển các giá trị giữa các mẫu Windows C#

Đây là những gì tôi có cho đến nay.

Trong chức năng này:

private void btnLogin_Click(object sender, EventArgs e) 

Tôi đã deserialized dữ liệu tôi muốn như thế này:

NewDataSet resultingMessage = (NewDataSet)serializer.Deserialize(rdr); 

Sau đó, khi tôi gọi là hình thức tiếp theo tôi đã làm điều này:

Form myFrm = new frmVoiceOver(resultingMessage); 
myFrm.Show(); 

Sau đó, biểu mẫu VoiceOver của tôi trông giống như sau:

public frmVoiceOver(NewDataSet loginData) 
{ 
    InitializeComponent(); 
} 

private void btnVoiceOverNo_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
    Form myFrm = new frmClipInformation(); 
    myFrm.Show(); 
} 

Khi tôi gỡ lỗi, tôi có thể thấy dữ liệu ở dạng loginData ở dạng thứ hai, nhưng dường như tôi không thể truy cập dữ liệu trong sự kiện btnVoiceOverNo_Click. Làm thế nào để truy cập vào nó để tôi có thể chuyển nó sang biểu mẫu tiếp theo?

+2

Bạn cần một thành viên của frmVoiceOver mà bạn chuyển thông tin đăng nhập vào. Một cái gì đó giống như _loginData = loginData, nơi _loginData tồn tại trong lớp biểu mẫu như NewDataSet _loginData. –

+1

có thể trùng lặp của [giá trị truyền giữa các biểu mẫu (biểu mẫu thắng)] (http://stackoverflow.com/questions/3062575/passing-values-between-forms-winforms) –

+0

Đăng nhập và biểu mẫu có thuộc cùng một ứng dụng (exe) không? Nếu vậy, không cần serialization/deserialization: tốt cũ đồng bằng tài sản sẽ làm. Nó cũng có vẻ là "kéo" logic (các hình thức yêu cầu đăng nhập cho các thông tin) là tốt hơn ở đây hơn là "đẩy" logic khi đăng nhập gửi dữ liệu vào các hình thức. –

Trả lời

11

Bạn cần đặt loginData vào biến cục bộ bên trong lớp frmVoiceOver để có thể truy cập nó từ các phương pháp khác. Hiện nay nó được scoped để các nhà xây dựng:

class frmVoiceOver : Form 
{ 
    private NewDataSet _loginData; 

    public frmVoiceOver(NewDataSet loginData) 
    { 
     _loginData = loginData; 

     InitializeComponent(); 
    } 

    private void btnVoiceOverNo_Click(object sender, EventArgs e) 
    { 
     // Use _loginData here. 
     this.Close(); 
     Form myFrm = new frmClipInformation(); 
     myFrm.Show(); 
    } 
} 

Ngoài ra, nếu hai hình thức đang trong quá trình tương tự bạn có thể không cần phải sắp đặt từng hàng dữ liệu và chỉ có thể vượt qua nó như là một tài liệu tham khảo tiêu chuẩn để constructor của form.

Google giống như "C# variable scope" để hiểu thêm về lĩnh vực này vì bạn sẽ gặp phải khái niệm này mọi lúc. Tôi đánh giá cao bạn là người tự học nên tôi chỉ cố gắng củng cố rằng :-)

3

Trong các trường hợp khác nhau, chúng tôi có thể cần chuyển các giá trị từ một biểu mẫu này sang biểu mẫu khác khi xảy ra sự kiện. Dưới đây là một ví dụ đơn giản về cách bạn có thể triển khai tính năng này.

Hãy xem xét bạn có hai biểu mẫu Form1Form2 trong đó Form2 là con của Form1. Cả hai biểu mẫu đều có hai hộp văn bản trong đó bất cứ khi nào văn bản được thay đổi trong hộp văn bản của Form2, hộp văn bản của Form1 được cập nhật.

Tiếp theo là mã của Form1

private void btnShowForm2_Click(object sender, EventArgs e) 
{ 
    Form2 form2 = new Form2();    
    form2.UpdateTextBox += new EventHandler<TextChangeEventArgs>(txtBox_TextChanged); 
    form2.ShowDialog();   
} 

private void txtBox_TextChanged(object sender, TextChangeEventArgs e) 
{ 
    textBox1.Text = e.prpStrDataToPass;    
} 

Tiếp theo là mã của Form2

public event EventHandler<TextChangeEventArgs> UpdateTextBox; 

private string strText; 

public string prpStrText 
{ 
    get { return strText; }   
    set 
    { 
      if (strText != value) 
      { 
       strText = value; 
       OnTextBoxTextChanged(new TextChangeEventArgs(strText)); 
      } 
    } 
} 

private void textBox_Form2_TextChanged(object sender, EventArgs e) 
{ 
    prpStrText = txtBox_Form2.Text; 
} 

protected virtual void OnTextBoxTextChanged(TextChangeEventArgs e) 
{    
    EventHandler<TextChangeEventArgs> eventHandler = UpdateTextBox; 
    if (eventHandler != null) 
    { 
      eventHandler(this, e); 
    } 
} 

Để vượt qua những giá trị chúng ta nên lưu trữ dữ liệu của bạn trong một lớp học đó là có nguồn gốc từ EventArgs

public class TextChangeEventArgs : EventArgs 
{ 
    private string strDataToPass; 

    public TextChangeEventArgs(string _text) 
    { 
     this.strDataToPass = _text; 
    } 

    public string prpStrDataToPass 
    { 
     get { return strDataToPass; } 
    } 
} 

Bây giờ bất cứ khi nào văn bản thay đổi trong Form2, cùng một văn bản được cập nhật trong hộp văn bản của Form1.

Các vấn đề liên quan