在Windows窗体之间传递值c#

时间:2013-07-24 14:07:35

标签: c# winforms

我正在努力研究如何在表单之间传递值。我有四种形式,我想将Login检索到的信息传递给第四种也是最终形式。

这是我到目前为止所做的。

在此功能中:

private void btnLogin_Click(object sender, EventArgs e)

我已将我想要的数据反序列化:

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

然后,当我打电话给下一个表格时,我已经这样做了:

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

然后,我的VoiceOver表单如下所示:

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

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

当我调试时,我可以看到第二种形式的数据在loginData,但我似乎无法在btnVoiceOverNo_Click事件中访问它。我如何访问它以便将其传递给下一个表单?

2 个答案:

答案 0 :(得分:11)

您需要将loginData放入frmVoiceOver类中的局部变量,才能从其他方法访问它。目前它的范围是构造函数:

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

此外,如果两个表单在同一个进程中,您可能不需要序列化数据,只需将其作为表单构造函数的标准引用传递。

谷歌之类的“C# variable scope”可以在这个领域了解更多,因为你会一直遇到这个概念。我很感激你是自学成才所以我只是想加强它: - )

答案 1 :(得分:3)

在某些情况下,我们可能需要在某些事件发生时将值从一个表单传递到另一个表单。以下是如何实现此功能的简单示例。

考虑您有两种形式Form1Form2,其中Form2是Form1的子级。这两个表单都有两个文本框,每当Form2的文本框中的文本发生更改时,Form1的文本框都会更新。

以下是 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;            
}

以下是 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);
     }
}

为了传递值,我们应该将您的数据存储在一个派生自EventArgs

的类中
public class TextChangeEventArgs : EventArgs
{
    private string strDataToPass;

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

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

现在,只要Form2中的文本发生更改,相同的文本就会在Form1的文本框中更新。