2017-07-24 64 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);