2012-04-21 3 views
0

私はこの質問が以前に尋ねられたか、似たような質問があることを知っていますが、解決策のどれもまだ私の問題を解決していません。別のクラスのボタンを無効にする

ボタンがhitButtonのwinformがあります。私がする必要があるのは、このボタンを別のクラス(フォームクラスではない)から無効にすることだけです。

私のフォームクラスは次のとおりです。

public partial class BlackJackTable : Form 
{ 
} 

私の別のクラスには、次のとおりです。

public void DisableButtons() 
{ 
    hitButton.Enabled = false; 
} 

からのアクセス:私はこのようなBlackJackTableでパブリックメソッドを暴露しようとしている

class GameWon 
{ 
} 

GameWonコンストラクタ(クラスIのどこにアクセスしても問題ありません。ただしからt)は次のように:

public BlackJackTable blackJackTable = new BlackJackTable(); 

public GameWon() 
{ 
    blackJackTable.DisableButtons(); 
} 

IはGameWonに変数を使用して試みた:

public Button hit; 

とblackJackTableから割り当て:

GameWon gameWon = new GameWon(); 

public void Assign() 
{ 
    gameWon.hit = this.hitButton; // or just = hitButton; 
} 

GameWonから無効:

hit.Enabled = false; 

私はいくつかのことを試しましたが、どれもうまくいきませんでした。私は、私が試した方法のどれもが働いていないので、何かが明らかに欠けていると思います。

感謝しています。

更新

私はテキストボックスとpictureboxesと後者の方法を行うために管理している、ボタンとの違いは何ですか?あなたは元のクラスに値を返すことができ

+0

私はあなたが右のボタンのためにそれをやっていないと想像することができます。 DisableButtonsを呼び出すときにfalseをEnabledに設定すると、それは完全にトリックを行うはずです。それはすべてシングルスレッドですよね? – SimpleVar

+0

@ YoryeNathanうん、それは右のボタンであり、それはすべてシングルスレッドです。私はそれを理解していない。 –

+0

実際にボタンがあるフォームのctorでEnabledをfalseに設定してみてください。ちょうど物事をテストする。 – SimpleVar

答えて

0

後者の方法を使用してこれを修正しましたが、Button変数を静的にしました。

public static Button hit; 

クラスのレベルが混ざっている必要があります。あなたのアイデアをありがとう。

0

、ボタンを無効にします。 を見てみましょう:それは動作しない理由は、あなたがBlackJackTableの間違ったインスタンスDisableButtonsを呼び出しているということである How to call properties inside of a script runat at server

+0

ありがとうございますが、winforms、aspではありません。 –

3

GameWonクラスは、それ自身の不可視のBlackJackTableオブジェクトを作成し、変数BlackJackTable blackJackTableに格納し、そのボタンを無効にします。あなたに見えるフォームオブジェクトは変更されません。

これを修正するには、あなたがGameWonのコンストラクタにごBlackJackTableフォームのインスタンスを渡し、それを変数に設定する必要があります。

private readonly BlackJackTable blackJackTable; 

public GameWon(BlackJackTable blackJackTable) { 
    this.blackJackTable = blackJackTable; 
} 

GameWonクラスのインスタンスを作成するコードは、フォームを渡す必要があります

GameWon gameWon = new GameWon(myBjTable); 
+0

申し訳ありませんが、これは試しましたが、まだ運がありません。 –

+0

@BaliC 'GameWon'の作成方法を示す変更と、そのコンストラクタのパラメータとして渡すものを変更して質問を更新してください。 'BlackJackTable'のメソッドから作成した場合、その呼び出しは'新しいGameWon(this);のようになります。 – dasblinkenlight

0

コンストラクタで多くの作業をしています。これは、しばしばフォームの場合、悪い習慣です。フォームが表示される前に、フォーム上のオブジェクトのプロパティを変更しているように思われます。これは予期しない動作を引き起こすことには驚きません。私が推測しなければならないのは、コードが実行された後、ボタンの状態がフォームの初期化によってリセットされていると思います。フォームは自分のライフサイクル要件をかなり保護しているので、フォームがどのように表示を準備するかを行うためには、特有の機能に慣れていなければなりません。

私はあなたがここでかなり奇妙なアーキテクチャを提示したことを指摘しなければなりません。私はあなたがこのようにあなたのアプリケーションを手配する理由を理解するのに苦労しています。コントローラークラスからのフォームとゲームクラスとのやりとりが、おそらくコントローラーで発生したイベントを使用してフォームが自分自身を変更できるようにすることが望ましいと思います。画面上に表示されている間にフォームを独自の状態に変更すると、常に動作するはずです。

関連する問題