如何将值从一个表单发送到另一个表单

时间:2014-08-19 08:41:30

标签: c# winforms

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"发送到另一个表单,我该如何实现呢?

5 个答案:

答案 0 :(得分:2)

您可以将str作为公共财产与私人设定者一起实施。

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,因为你在设置之前查询了它。当一个新实例刚刚构建完成后,所有内容都是新的并且未定义,包括 Str 属性。

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

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

然后在“另一种形式”中,调用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(); } 来构建对象。

修改2

无论如何,之前的方法遇到了一些限制,似乎对你的问题没有任何影响。请尝试以下方法:

不是在Form1中创建公共属性,而是以“另一种形式”创建需要该值的公共属性。也就是说,在 Form1

{{1}}

答案 1 :(得分:2)

appwide变量的概念与类相同。

我有一个名为表单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中工作得很好 - 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)
        {

        }
    }
}

我害怕它更加清晰。

答案 2 :(得分:1)

对str变量使用static关键字

public static string str;

以一种形式分配值,并以第二种形式使用相同的变量。

修改: -

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

public static class MyClass
{
    public static string str;
}

将值为form1指定为

MyClass.str="Some Value";

并以其他形式使用

MyClass.str

答案 3 :(得分:1)

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

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;

答案 4 :(得分:1)

如果您想传递另一个表单数据,请添加" 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;
}

我会避免在构造函数中传递数据只是因为你可能想在构造之后设置数据,如果你搞乱了构造函数iirc,表单设计者也会有点疯狂。