2017-07-24 63 views
-1

背景/上下文获取从文本框中的文本在Form1上

所以我建立一个程序,它需要2个Excel文件并对它们进行比较突出的差异。这工作正常。现在我正在开发第二种形式,它做了一个非常类似的事情,但基本上“适用”了这些变化。现在在第一种形式中,我有两个包含文件位置的文本框,但在突出显示更改后出现的第二个表单上只有一个“应用”按钮,因此我需要从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都是空的,因此文件位置没有被拉过,没有任何工作:(

+0

正在创建Form1的一个新实例您窗体2。我认为这与您创建的格式不同,其中填充了文本字段。我不认为你应该有两种形式,但是如果你坚持要保留它们(而不是在第一个表单上添加一个应用按钮),你需要将form1的实际实例传递给form2,或者仅仅传递它的文本文本框。 –

+0

您可以在窗体中创建静态的'string'字段,并使用文本框中的文本初始化它们,并从另一个类访问它们。 – wdc

+0

Form1是否启动Form2?在form2中,你只需要新的Form1,所以它没有设置任何值。当你创建它时,你可能需要将Form1传递给Form2? – Derek

回答

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

此外,它会为想要读取的值创建属性的良好实践,而不是公开制作控件:

// 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"); 
+0

感谢您的帮助,这已经解决了这个问题!你会发生什么,在我得到这两个文件后,我通过ExcelWBB1 = ExcelApp.Workbooks.Open(excelFile1);在Excel的一个不可见的实例中打开它们;'但是现在它说“找不到文件,可能它有被感动了吗?“即使它肯定没有被触及或只读或任何东西......任何想法可能会导致这种情况? – SBozhko

+0

我不太确定。你应该在一个单独的问题中发布。具有更多Excel Interop知识的合适人员会仔细查看它 –

+0

够公平的,现在我自己也不知道自己在看什么。感谢您的帮助! – SBozhko

1

此刻的你在窗口2创建一个新的Form1上,而不是使用现有的Form1中有你想传递给Form2的数据。

你应该通过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); 
    } 

而且当你创建窗口2(我想这是在Form):

Form2 form2 = new Form2(this);