2016-05-12 6 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() 
    } 

をが、私はできません、それはちょうど方法を見つけるdosn't。

+2

"別の形式のパブリックメソッドを使用したいと思います。" - そうでないかもしれないにもかかわらず、フォームが依存するようになるので、そうしないでください。あるメソッドが別のフォームにある場合、そのメソッドはそこに属します。おそらく、別の場所(基本クラスなど)にメソッドを移動することです。 –

+1

私は@Quality Catalystのコメントに同意し、自分の答えを受け入れることをお勧めします - この場合、基本クラスの考え方ははるかに良い解決策です。 – CoolBots

+0

あなたがしようとしていることは完全にはっきりしていません。しかし、2つの明らかな可能性があり、どちらも以前に尋ねられた質問(https://stackoverflow.com/questions/1665533/communicate-between-two-windows-forms-in-c-sharp)とhttps:/ /questions/25394337/how-to-use-the-same-method-with-two-different-forms(@Qualityが投稿した回答があなたの懸念に対応している場合、質問は2番目のそれらのリンク)。 –

答えて

4

フォームを依存する必要がない場合にフォームに依存するため、メソッドを呼び出さないでください。あるメソッドが別のフォームにある場合、それは理由のためにそこに属します。

おそらく何かしたいのは、メソッドを別の場所(基本クラスなど)に移動することです。

例:(それはstaticないため)

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が投稿したメソッドは、メソッドが含まれているフォームにほぼ固有の2つのフィールドを使用し、同じクラス内の他の2つのメソッドを呼び出すだけでなく、同じフォームのメンバーも簡単に要求できます。OPは、他の多くのメンバーを移動させることなく、コードを基本クラスに単純に移動することはできません(そして、正に、VS Designerはサブクラス化された 'Form'オブジェクトをうまく処理しません。他の頭痛の)。 –

+0

はい、正解です。これがフォームからより適切な場所に取り出される理由を説明しています。このようなデザインは、長期間の頭痛を引き起こし、より重いリファクタリングを必要とするので、後でやり直す必要がないように、より良いデザインと優れたインプリメンテーションが得られます。 –

+0

さて、私は別の20のフォームに20のメソッドのように使用しなければならないでしょう、私はそれが効率的ではないと思いますので、ボックスの外で考えようとし、私のニーズに基づいて別の解決策を作った。しかし、これは最良の解決策のように見えるので、私はこれを最善の答えとして指摘します。あなたの努力とあなたの知識を共有してくれてありがとう。 –

0

LocalizarCategoriaインスタンスメソッドあります。ですから、他のフォームのインスタンスを必要とし、その後、あなたはこのようにそれを呼び出すことができます。

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

関連する問題