2013-05-14 49 views
0

我有一個form1(運行程序)和form2(這是一個供用戶輸入的表單)。 Form2具有清除用戶輸入的功能(文本框,複選框,組合框,它清除它們)。如何調用只接受另一種形式的參數的方法?

功能如下:

public void CleartheForm(Control groupofcontrols) 
{ 
    foreach (Control c in groupofcontrols.Controls) 
    { 
     if (c is TextBox) 
     { 
      ((TextBox)c).Clear(); 
     } 

     if (c.HasChildren) 
     { 
      CleartheForm(c); 
     } 

     if (c is CheckBox) 
     { 
      ((CheckBox)c).Checked = false; 
     } 

     label3.Text = ""; 
     comboBox1.SelectedIndex = -1; 
     comboBox2.SelectedIndex = -1; 
    } 
} 

這工作對自己。在我的主要形式,我需要調用這個函數,它應該是這樣的:

我做窗口2的實例調用Inputform然後:

private void Addrecord_Click(object sender, EventArgs e) 
{ 
    Inputform.ShowDialog(); 

    if(Inputform.Addedrecord == true) 
    { 
     Inputform.Addrecord(); 
     Inputform.CleartheForm(WHAT DO I PUT IN HERE??); 
    }     
} 

所以,一旦記錄已添加的輸入表單自行清除並準備添加另一條記錄。

問題是如上,我在那裏放什麼?我如何從form1中調用位於form2中的Inputform.CleartheForm()中的groupofcontrols?我試圖在Form2的頂部創建一個公共Control對象,然後將我的Form1保留爲Inputform.CleartheForm(Control groupofcontorls),但之後它說我沒有對象引用。如果我把它留空,它說Inputform.CleartheForm();不需要0爭論。

回答

0

好吧,如果你想清楚所有的控件,你可以寫的CleartheForm()另一個版本不帶參數的InputForm,並調用版本參數從它,就像這樣:

public void CleartheForm() 
{ 
    ClearTheForm(this); // Passes all the controls in the Form. 
} 

或者您可以將原始的ClearTheForm(Control)作爲參數傳遞給InputForm的引用:InputForm.ClearTheForm(InputForm)

如果你總是想清除所有的控制,我會寫一個單獨的無參數方法來清晰。

但是,只有在清除InputForm中的所有控件時纔有用。

+0

但他還需要使該方法遞歸,因爲他現在的人會在任何嵌套控件突破。 – Vedran 2013-05-14 07:55:56

+0

@Vedran但是它調用*遞歸的那個(即在OP中接受'Control'參數的那個) – 2013-05-14 08:29:48

+0

我得到它的工作,謝謝^^ – csharpnewbie 2013-05-14 08:45:23

0

因爲FormControl繼承,你可以用形式作爲參數調用你的方法 - 它會清除所有TextBoxesCheckBoxes它:

Inputform.CleartheForm(Inputform); 

然而,或許,你可以簡單地創建新的(和空!)每次輸入形式。

而且,對於你的方法 - 你應該把

label3.Text = ""; 
comboBox1.SelectedIndex = -1; 
comboBox2.SelectedIndex = -1; 

遠離循環。

0

從你所說的話(即你把groupofcontrols作爲窗口2公開),這應該工作:

Inputform.CleartheForm(Inputform.groupofcontrols); 

(這是考慮到Inputform是主窗體上的屬性或字段 - 我觀察它是因爲你打電話給它ShowDialog。)

+0

Inputform是form1的一個實例,我把form1比如「form2 Inputform = new form2();」但做你以上張貼我得到的「對象引用未設置爲對象的實例」錯誤 – csharpnewbie 2013-05-14 08:10:55

+0

然後,我認爲你已經把錯誤的groupofcontrols作爲公共,看看你的CleartheForm調用form2的工作。從中你可以找到哪個字段(可能位於form2.designer.cs中),你必須公開。 – Vedran 2013-05-14 08:16:48

0

我不明白你的程序的工作流程。

如果是:

  1. Form1中打開窗體2
  2. 用戶輸入數據到窗體2
  3. 用戶按下OK按鈕在Form2
  4. 窗體2關閉
  5. Form1中反映這是由所做的更改Form2中的用戶
  6. 用戶可以從步驟1重複操作

您應該使用的Form2新實例每次迭代

爲了做到這一點,你應該從你的窗體2刪除任何明確的代碼,並改變你的代碼到下一個:

private void Addrecord_Click(object sender, EventArgs e) 
{ 
    var inputForm = new Form2(); 
    inputForm.ShowDialog(); 

    if(inputForm.Addedrecord == true) 
    { 
     ...Reflect changes here... 
    } 
} 

但是,如果你需要一個窗體2應該保持打開而Form1的每一次增加了新的記錄時,在窗體2

您應該從Form2的調用Form1中,下一個設計將是很好

用戶點擊「確定」按鈕
interface IDataTarget 
{ 
    void Update(int id, string name); // you should reflect here all of your data 
} 

class Form1 
    : Form, IDataTarget 
{ 
    public void Update(int id, string name) 
    { 
    // add new record here 
    } 

    private void AddButton_Click(...) 
    { 
    using(var form2 = new Form2(this)) 
    { 
     form.ShowDialog(this); 
    } 
    } 
} 

class Form2 
    : Form 
{ 
    private readobly IDataTarget dataTarget; 

    public Form2(IDatatarget dataTarget) 
    { 
    this.dataTarget = dataTarget; 
    } 

    private OK_Click(...) 
    { 
    dataTarget.Update(textBox1.Text, textBox2.Text); 
    ClearTheControls(); 
    } 
} 
+0

是的,程序工作流程與您所說的完全相同,4)form2關閉並將Inputform.Addedrecord傳遞給form1,如果它爲true,則form1添加記錄並清除表單。 – csharpnewbie 2013-05-14 08:15:38

0

就我個人而言,我會將此方法移入類庫。你可以把它靜態類,然後就打電話

FromControls.CleartheForm(Inputform.groupOfControls) 

所以,在類庫新類(並沒有什麼已經在這裏測試,所以失誤都有可能!)

public static class FormControls 
{ 
    public static void CleartheForm(Control groupofcontrols) 
    { 
     foreach (Control c in groupofcontrols.Controls) 
     { 
      if (c is TextBox) 
       ((TextBox)c).Clear(); 

      if (c.HasChildren) 
       CleartheForm(c); 

      if (c is CheckBox) 
       ((CheckBox)c).Checked = false; 
     } 
    } 
} 

我會刪除以下代碼:

label3.Text = ""; 
comboBox1.SelectedIndex = -1; 
comboBox2.SelectedIndex = -1; 

...正如上面的CleartheForm代碼將清除它。

所以,你的代碼是(記住要引用添加到您的類庫)

private void Addrecord_Click(object sender, EventArgs e) 
{ 
    AddRecord();  
} 

private void AddRecord() 
{ 
    Inputform.ShowDialog(); 

    if(Inputform.Addedrecord) 
    { 
     Inputform.Addrecord(); 
     FromControls.CleartheForm(GetControlOnPage()) 
    }  
} 

private control GetControlOnPage() 
{ 
    //logic to return control if needed although it may just be this: 
    return Inputform.groupofcontrols 
} 
相關問題