7

我正在努力研究如何在表单之间传递值。我有四个表格,我想将检索到的信息传递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事件中访问它。如何访问它以便将其传递给下一个表单?

4

2 回答 2

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# 变量范围”之类的东西来了解这个领域的更多信息,因为你会一直遇到这个概念。我很欣赏你是自学成才的,所以我只是想加强这一点:-)

于 2013-07-24T14:10:51.463 回答
4

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

考虑您有两个表单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 的文本框中都会更新相同的文本。

于 2014-11-19T12:04:48.040 回答