在Form2上调用函数时,从Form1上的文本框中获取文本

时间:2017-07-24 11:07:19

标签: c# .net winforms

背景/背景

所以我正在构建一个带有2个Excel文件的程序,并比较它们突出显示的差异。这工作正常。现在我正在开发第二种形式,它做了一个非常相似的事情,但基本上是#34;应用"变化。现在在第一种形式中我有两个包含文件位置的文本框,但是在突出显示更改后出现的第二个表单上只有一个Apply按钮,因此我需要从Form1下拉文件的文本框路径这似乎不适用于mt代码:

CODE

public partial class Form2 : Form
{
    Form1 form1 = new Form1();

    public Form2()
    {
        InitializeComponent();
        btnApply1.Click += new EventHandler(this.btnApply_Click);
        btnCancel1.Click += new EventHandler(this.btnCancel1_Click);
    }

    private void btnApply_Click(object sender, EventArgs e)
    {
        foreach (Process clsProcess in Process.GetProcesses())
        {
            if (clsProcess.ProcessName.Equals("EXCEL"))
            {
                clsProcess.Kill();
                break;
            }
        }

        new CRCCompareWorksheets.CompareHelper().ApplyChanges(
            form1.ExcelPath1.Text, form1.ExcelPath2.Text, "CRC");
    }

    private void btnCancel1_Click(object sender, EventArgs e)
    {
        new CRCCompareWorksheets.CompareHelper().CancelApplication();
    }
}

问题

因此,在我调用应用更改的函数的行中,变量form1.ExcelPath1.Textform1.ExcelPath1.Text都是空白的,因此文件位置没有被拉过,没有任何作用:(

2 个答案:

答案 0 :(得分:2)

这里的问题是,您创建了Form1的新实例。我想,Form2打开了Form1。在这种情况下,我会将调用表单的引用提供给新生成的Form2。这可能类似于以下内容:

<强>窗体2

public partial class Form2 : Form
{

    Form1 form1 = null;

    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
        btnApply1.Click += new EventHandler(this.btnApply_Click);
        btnCancel1.Click += new EventHandler(this.btnCancel1_Click);
    }

    private void btnApply_Click(object sender, EventArgs e)
    {
        foreach (Process clsProcess in Process.GetProcesses())
        {
            if (clsProcess.ProcessName.Equals("EXCEL"))
            {
            clsProcess.Kill();
            break;
            }
        }

        new CRCCompareWorksheets.CompareHelper().ApplyChanges(form1.ExcelPath1.Text, form1.ExcelPath2.Text, "CRC");
    }
    private void btnCancel1_Click(object sender, EventArgs e)
    {
        new CRCCompareWorksheets.CompareHelper().CancelApplication();
    }
}

Form1中,您需要将Form2的调用更改为以下内容:

Form2 frm = new Form2(this);
frm.Show();

此外,最好为您想要从TextBoxes读取的值创建属性,而不是将控件公开:

// Properties in Form1
public string ExcelPath1Text
{
    get
    {
        return this.ExcelPath1.Text;
    }

    set
    {
        this.ExcelPath1.Text = value;
    }
}

public string ExcelPath2Text
{
    get
    {
        return this.ExcelPath2.Text;
    }

    set
    {
        this.ExcelPath2.Text = value;
    }
}

然后使用Form2中的属性:

CRCCompareWorksheets.CompareHelper().ApplyChanges(form1.ExcelPath1Text, form1.ExcelPath2Text, "CRC");

答案 1 :(得分:1)

目前您正在使用form2创建一个新的form1,而不是使用包含您想要传递给form2的数据的现有form1。

您应该将form1传递给form2构造函数:

public partial class Form2 : Form
{
    Form1 form1 = { get; set; }

    public Form2(Form form1)
    {
        this.form1 = form1;
        InitializeComponent();
        btnApply1.Click += new EventHandler(this.btnApply_Click);
        btnCancel1.Click += new EventHandler(this.btnCancel1_Click);
    }

当你创建form2时(我假设这是在form1中):

Form2 form2 = new Form2(this);