2014-06-16 34 views
1

我有兩個窗體。 F1有一個充滿數據的表格的GridView。理想情況下,用戶點擊「導出到Excel」按鈕,將出現一個彈出窗口窗體F2,並要求用戶鍵入文件名以保存在其文本框中,然後返回到F1。在兩個打開的表單之間傳遞一個TextBox?

我嘗試了幾種在線方法,包括重載構造函數。它確實幫助我在兩種形式之間傳遞值,但是在用戶確認一個新文件名後,它會用用戶輸入打開一個新的F1。基本上我結束了與兩個F1(一個與我的數據在gridview,一個新的obe與用戶的輸入一箇舊的一個)

任何人都可以建議?

我已經試過這... http://www.daniweb.com/software-development/csharp/threads/358513/pass-the-text-box-value-from-one-form-to-another-form-textbox

//form1: 
public partial class Form1 : Form 
{ 
    Form2 f2; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (f2 == null) 
      f2 = new Form2(); 
     f2.ValueFromForm1(textBox1.Text); 
     f2.Show(); 
    } 
} 

//form2: 
public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public void ValueFromForm1(string value) 
    { 
     textBox1.Text = value; 
    } 
} 
+0

你需要出示你已經嘗試了什麼。 –

+0

當你回答「回到1」時,你會發生什麼?從你的問題來看,你打算做什麼並不清楚。在我看來,你可能也想考慮一個更系統化的方法,比如MVC或者類似的模式...... – Kris

+0

通常,最好的方法是創建一個核心程序,然後用它來通過所有的核心程序不同形式之間的值。 – Elias

回答

0

有一個適當的常見對話框,選擇一個文件名。這些常見的對話框存在,因爲像打開/保存文件或選擇顏色或字體這樣的常見操作應該在任何應用程序中都是相同的。不使用它們會強制用戶學習新的用戶界面。
因此建議使用通用對話框(如果沒有令人信服的理由,有什麼不同)

private void button1_Click(object sender, EventArgs e) 
{ 
    SaveFileDialog dlg = new SaveFileDialog(); 
    dlg.Filter = "Excel files (*.xls)|*.xls"; 
    if(dlg.ShowDialog() == DialogResult.OK) 
     textBox1.Text = dlg.FileName; 
} 

SaveFileDialog class

但是,如果你真的想擁有自己的形式選擇一個文件名字,那麼你需要改變這種方式

private void button1_Click(object sender, EventArgs e) 
{ 

    using(Form2 f2 = new Form2()) 
    { 
     // Pass the current text 
     f2.FileSelected = textBox1.Text; 
     if(DialogResult.OK == f2.ShowDialog()) 
     { 
      // read back the changes.... 
      textBox1.Text = f2.FileSelected; 
     } 
    } 
} 


//form2: 
public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    // The property used to exchange the text between the two forms 
    public string FileSelected {get;set;} 

    private void Form_Load(object sender, EventArgs e) 
    { 
     // Let the user edit an initial value 
     textBoxOnForm2.Text = this.FileSelected; 
    } 

    private void cmdOK_Click(object sender, EventArgs e) 
    { 
     // Save the edited text to the property 
     this.FileSelected = textBoxOnForm2.Text; 
    } 
} 
+0

感謝您的時間。我最終使用了你推薦的通用對話框。 – CherylG

0

如果我理解正確,你的代碼,它聽起來就像你不一定想傳遞一個值從Form1Form2,但從Form2返回Form1。要做到這一點,千萬不要打開Form1Form2內的實例,而是創建Form2參考Form1,您可以設置該參考值。事情是這樣的:

public class Form1 : Form 
{ 
    // other stuff 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (f2 == null) 
      f2 = new Form2(this); 
     f2.Show(); 
    } 
} 

public class Form2 : Form 
{ 
    private Form1 Form1Reference { get; set; } 

    // other stuff 

    public Form2(Form1 form1Reference) 
    { 
     Form1Reference = form1Reference; 
    } 
} 

現在你可以對Form1打開實例從內部Form2訪問和設定值。例如,如果Form1有一個屬性:

public string SomeValue { get; set; } 

隨後的Form2的情況下,你可以得到內/設置該屬性:

Form1Reference.SomeValue = textBox1.Text;