【问题标题】:Passing Values Between Windows Forms c# [duplicate]在Windows窗体c#之间传递值[重复]
【发布时间】:2013-07-24 14:07:35
【问题描述】:

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

【问题讨论】:

  • 您需要将 loginData 传递给的 frmVoiceOver 的成员。类似_loginData = loginData,其中_loginData 存在于NewDataSet _loginData 等表单类中。
  • 登录和表单是否属于同一个应用程序(exe)?如果是这样,则不需要序列化/反序列化:好的旧的普通属性就可以了。当登录将数据发送到表单时,“拉”逻辑(表单向登录询问信息)似乎比“推送”逻辑更好。

标签: c# winforms


【解决方案1】:

您需要将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();
    }
}

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

Google 诸如“C# variable scope”之类的内容,以了解更多有关这方面的信息,因为您会一直遇到这个概念。我很欣赏你是自学成才的,所以我只是想加强这一点:-)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多