2016-05-12 53 views
1

我想從另一種形式使用一些公共方法。我想知道是否有辦法做到這一點,我試圖公開的方法和形式,但是當我試圖將它稱爲另一種形式的方法時,它只是出現任何東西。如何使用其他形式的方法進入我的主表單?

這裏是我的主要形式有:

namespace GUI 
{ 
    public partial class frmPrincipal : Form 
    { 
     public frmPrincipal() 
     { 
      InitializeComponent(); 
     } 

     private void categoriaToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      frmCadastroCategoria f = new frmCadastroCategoria(); 
      f.ShowDialog(); 
      f.Dispose(); 
     } 

     private void categoriaToolStripMenuItem1_Click(object sender, EventArgs e) 
     { 
      frmConsultaCategoria f = new frmConsultaCategoria(); 
      f.ShowDialog(); 
      f.Dispose(); 
     } 

,這是我嘗試調用

public void LocalizarCategoria() 
    { 
     frmConsultaCategoria f = new frmConsultaCategoria(); 
     f.ShowDialog(); 
     if (f.codigo != 0) 
     { 
      DALConexao cx = new DALConexao(DadosDaConexao.StringDeConexao); 
      BLLCategoria bll = new BLLCategoria(cx); 
      ModeloCategoria modelo = bll.CarregaModeloCategoria(f.codigo); 
      txtCodigo.Text = modelo.CatCod.ToString(); 
      txtNome.Text = modelo.CatNome; 
      alteraBotoes(3); 
     } 
     else 
     { 
      this.LimpaTela(); 
      this.alteraBotoes(1); 
     } 
     f.Dispose(); 
    } 

我試圖做的是這樣的形式:

{ 
     LocalizarCategoria() 
    } 

但我不能,它只是找不到方法。

+2

「我想使用其他表單的一些公共方法。」 - 不要這樣做,因爲儘管他們可能不會,但它會使你的表格依賴。如果一種方法是另一種形式,那麼它就屬於那裏。你可能想要做的是將該方法移到另一個地方(例如基類)。 –

+1

我同意@Quality Catalyst的評論,並建議您接受他的答案 - 在這種情況下,基類想法是一個更好的解決方案。 – CoolBots

+0

目前還不完全清楚你正在嘗試做什麼。但是有兩種明顯的可能性,並且都可以通過以前提出的問題得到很好的解決:https://stackoverflow.com/questions/1665533/communicate-between-two-windows-forms-in-c-sharp和https:/ /stackoverflow.com/questions/25394337/how-to-use-the-same-method-with-two-different-forms(如果@Quality發佈的答案解決了您的問題,那麼您的問題是第二個這些鏈接)。 –

回答

4

不要調用該方法,因爲它會使您的表單不依賴於它們。如果一種方法是另一種形式,那麼它就屬於這個原因。

你可能想要做的是將該方法移到另一個地方(如基類)。

實施例:

public partial class frmPrincipal : MyFormBase // inherit from your own base 
{ 
    ... 
} 

public partial class frmMyOtherForm : MyFormBase // inherit from your own base 
{ 
    ... 
} 

public class MyFormBase : Form // your own base with the to be shared method 
{ 
    protected void LocalizarCategoria() // protected might be enough 
    { 
     ... 
    } 
} 
+0

OP發佈的方法使用了兩個字段,這兩個字段幾乎可以肯定是包含該方法的表單所特有的,並且可以在同一個類中調用另外兩個方法,其中任何一個方法都很容易要求同一表單的成員。OP將無法簡單地將他的代碼移動到基類中,而無需移動很多其他成員(坦率地說,VS Designer不會很好地處理子類「Form」對象,所以這樣做會引入一個主機的其他頭痛)。 –

+0

是的,正確的,這就解釋了爲什麼它應該從形式中轉移到更合適的地方。像這樣的設計會導致長期的頭痛,需要更重的重新分解,以便更好地設計和實施,以便稍後避免返工。 –

+0

那麼,我將不得不像20種方法一樣使用另外20種形式,我會說它效率不高,所以我試圖在盒子外面思考,並根據我的需要提出了另一種解決方案。但是,因爲這看起來像是最好的解決方案,我會指出這是最好的答案。感謝您的努力和您的共享知識。 –

0

LocalizarCategoria實例方法(因爲它不是static)。因此,你需要其他形式的一個實例,然後你可以這樣調用:

var myOtherForm = new frmOtherForm(); 
myOtherForm.LocalizarCategoria(); 

另外,如果LocalizarCategoria不需要訪問任何實例字段,屬性或方法,那麼你可以把它static

public static void LocalizarCategoria() 
{ 
    // etc.. 

然後通過引用(而不是一個具體的實例)的其它形式的類稱之爲:

frmOtherForm.LocalizarCategoria(); 
+0

可行的解決方案,但使形式相互依賴。 –

0

您需要創建的第一個實例e Form您要使用的對象:

var form = new FormThatHasTheMethod_LocalizarCategoria(); 
form.LocalizarCategoria(); 
+0

可行的解決方案,但使形式相互依賴。 –

+1

我同意,這不是一般的良好做法;然而,我認爲OP需要這種情況......我個人會尋找一個更好的解決方案,也許這兩種形式都可以使用的靜態類,或者基類(如你所建議的)等等。 – CoolBots

相關問題