我正在努力研究如何在表单之间传递值。我有四种形式,我想将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
事件中访问它。我如何访问它以便将其传递给下一个表单?
答案 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)
在某些情况下,我们可能需要在某些事件发生时将值从一个表单传递到另一个表单。以下是如何实现此功能的简单示例。
考虑您有两种形式Form1
和Form2
,其中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的文本框中更新。