如何将值从一种形式发送到另一种形式

本文关键字:一种 另一种 | 更新日期: 2023-09-27 18:18:32

public string str;
private DataGridViewCell ActiveCell = null;
private void CopyClick(object sender, EventArgs e)
{
    if (ActiveCell != null && ActiveCell.Value != null)
    str = authLeaveView.Rows[ActiveCell.RowIndex].Cells[0].Value.ToString();
    Clipboard.SetText(str);
    recLeavePop rlp = new recLeavePop();
    rlp.Show();
}

这是我的代码,它工作完美。现在我的问题是,如果我想把the value of "str"发送到另一种形式,我应该如何实现?

如何将值从一种形式发送到另一种形式

您可以将str实现为具有私有setter的公共属性

public string Str { get; private set; }
private DataGridViewCell ActiveCell = null;
private void CopyClick(object sender, EventArgs e)
{
    if (ActiveCell != null && ActiveCell.Value != null)
    Str = authLeaveView.Rows[ActiveCell.RowIndex].Cells[0].Value.ToString();
    Clipboard.SetText(Str);
    recLeavePop rlp = new recLeavePop();
    rlp.Show();
}

另一种形式,调用YourFormNameWithStrProperty.Str使用该值

编辑

我在你的评论中看到了这段代码:

在另一种形式中,我使用Form1 form = new Form1(),但随后str给出null。

这是一个明显的行为。就像我在评论中说的,你得到null是因为你在值被设置之前查询了它。当一个新的实例被构造时,一切都是新的和未定义的,包括你的Str属性。

如果您希望每个新的Form1对象以某种方式照顾来自其他Form1实例的Str值,我建议您这样做:

Form1的构造函数更改为private,并创建一个返回实例的函数。在函数中,如果我们已经有一个新实例,则将Str值预先设置为新实例:

private Form1()
{
    // do your construction here
    Initialize();
}
private Form1(string strValue)
{
    // do default construction first
    Initialize();
    // set the Str value
    Str = strValue;
}
public static Form1 GetInstance()
{
    return string.IsNullOrEmpty(Str) ?  new Form1() : new Form1(Str);
}

然后在你的"另一种形式"中,调用Form1.GetInstance()来构造对象。

编辑2

不管怎样,前面的方法有一些限制,似乎与你的问题无关。试试下面的方法:

不是在Form1中创建公共属性,而是在需要该值的"the other form"中创建一个公共属性。也就是说,在你的Form1:

private void CopyClick(object sender, EventArgs e)
{
    if (ActiveCell != null && ActiveCell.Value != null)
    // by the way is this rlp your "The other form"?
    recLeavePop rlp = new recLeavePop();
    TheOtherForm.Str = authLeaveView.Rows[ActiveCell.RowIndex].Cells[0].Value.ToString();
    Clipboard.SetText(TheOtherForm.Str);
    rlp.Show();
}

应用范围内变量的概念与类中的相同。

我有一个表单叫做form 1 -

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            lblText.Text = Form2.testVariable;
        }
    }
}

现在看看我正在接收变量的FORM。夸张地说,它的工作原理,我链接到你- dotnetfiddle.net/YfKNX9

表格2

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public static string testVariable = "potato";
        public Form2()
        {
            InitializeComponent();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
        }
    }
}
恐怕不能说得更清楚了。

为str变量使用static关键字

public static string str;

在一种形式中赋值,在另一种形式中使用相同的变量。

编辑:-

用MyClass创建一个新类,并在其中创建一个静态变量。

public static class MyClass
{
    public static string str;
}

赋值form1为

MyClass.str="Some Value";

以另一种形式使用

MyClass.str

您可以为表单创建第二个构造函数,该构造函数接受字符串参数并将其保存在内部变量

private string Str {get;set;}
public void recLeavePop(string str)
{
    Str = str;
}

或声明一个全局静态属性,并在声明

表单之前设置它
public static class MyClass
{
    public static string Str {get;set;}
}

和你的代码

MyClass.Str = str;
recLeavePop rlp = new recLeavePop();
rlp.Show();

,然后在表单中使用

访问它
MyClass.Str;

如果你想传递另一个表单数据,那么添加一个"SetData"方法,并从传递数据的另一个表单调用。

public partial class Form1 : Form
{
    Form1Data _data;
    public Form1()
    {
        InitializeComponent();
    }
    public SetData(Form1Data data)
    {
        _data = data;
    }
}
struct MyData
{
    public string Name;
    public string Address;
}

我会避免在构造函数中传递数据,因为您可能希望在构造之后设置数据,而且如果您混淆了构造函数,表单设计器可能会变得有点疯狂。