2011-12-31 8 views
1

私はC#初心者ですが、次の問題が発生しました。別のクラスのWindowsコントロールと対話するC#

私はForm1というクラスを持っています。このクラスには、デザインビューでいくつかのコントロールが含まれています。

私はForm1と、そこから継承Staffと呼ばれる別のクラスを持っているが、とりわけ、音楽用キーボード次々にユーザーが再生されるすべての音符を果たしPlayAllと呼ばれるメソッドが含まれています。

PlayAllの方法では、ユーザーがノートを押したかどうかを判断する条件を実装しました。

ユーザーがない押してメモをしなかった場合は、エラーメッセージが(Form1.csの中に含まれる)ErrorTextBoxに表示されます。

これは私の問題は何も(Form1.csので見つかった)ErrorTextBoxに表示されていないということである(Staff.cs中)PlayAll()の関連するコード

public void PlayAll() 
{ 
    ErrorTextBox.Text = ""; 
    if (Pressed_Notes.Count == 0) //check if the user pressed a key 
    { 
     ErrorTextBox.Text = "There are no music notes to play!"; 
    } 
    else 
    { 
     //Play the music notes 
    } 
} 

です。どうすればこの問題を解決できますか?ありがとう。

+0

あなたは(例えば 'Exception')のいずれかのエラーメッセージを取得しないStaffへのコンストラクタを変更しますか? – Adam

+0

いいえErrorTextBoxはブランクのままです。 – Joe

+0

この関数が呼び出されているか、実行されると思われる 'if'ブロックの部分が実行されていますか? –

答えて

0

他のクラスのフォームコントロールにアクセスすることはできません。それらにアクセスする簡単な方法はここでは安全ではありません。 コントロールのTextbox1があるform1があります。 と別のクラスmyClassがあります。 refで引数として目的のコントロールを渡すだけです。例:

public Class myClass 
{ 
TextBox tb; 
public myClass(ref TextBox mtb) 
    { 
    tb = mtb; 
    } 
//...Now you can use tb as your textbox and the value in it will be 
//...displayed on form1 control 
} 

public Class form1 
{ 
myClass mc = new myClass(ref textBox1); 
// ... 
} 

ただし、安全でない操作を行うことを忘れないでください。このコードは、デバッグモードでエラーをスローします。デバッグなしで実行してください。

0

ここでの主な問題は、スタッフクラスのform1クラスを継承するときです。スタッフからフォーム1のフォームメンバー(ラベル)にアクセスすることはできません。

これは、この問題に直面している理由です。

疑問があればお問い合わせください。

0

This linkは、この問題を解決する3つの方法を示します。私はソリューションのケビンの答えに集中することをお勧めします。 Form2のに可変のパラメータを渡す(リンクの問題の説明、お勧めできません)

2-、Form1のハンドルを作成するラベル修飾公衆を作り、Form2の上でそれをアクセスしてる

1-(最初のオプションでケビンの答え)値(ケビンの答えで2番目のオプションを更新するイベントを作成する

3-)

あなたはより多くの情報が必要な場合はコメントを残します。

1

継承は、関連するクラスのインスタンス(オブジェクト)間のリンクを作成しませんでした。

public class Form1 : Form 
{ 
    public TextBox ErrorTextBox; 
} 

public class Staff : Form1 
{ 
    public void PlayAll() { } 
} 

の2つのインスタンス

Form1 form1 = new Forms1(); 
form1.Show(); 

Staff staff = new Staff(); 
staff.Show(); 

このオープン2つのフォームを作成してみましょう。今度は2つの異なるErrorTextBoxが存在します:1つはフォームform1にあり、もう1つはフォームstaffにあります。代わりに、開口部Form1オープンStaff

  1. は、私はこの問題には2つの異なる解決策を提案します。

  2. form1またはform1.ErrorTextBoxからstaffの参照を渡します。

コンストラクタインジェクションによって#2を行うことができます。

private TextBox _form1ErrorTextBox; 

public Staff (Form1 form1) 
{ 
    InitializeComponent(); 
    _form1ErrorTextBox = form1.ErrorTextBox; 
} 

public void PlayAll() 
{ 
    _form1ErrorTextBox.Text = ""; 
    if (Pressed_Notes.Count == 0) { 
     _form1ErrorTextBox.Text = "There are no music notes to play!"; 
    } else { 
     //Play the music notes 
    } 
} 

は今、あなたはこのようなStaffForm1のインスタンスを渡すことができます:

Form1 form1 = new Forms1(); 
form1.Show(); 

Staff staff = new Staff(form1); 
関連する問題