1

私は C# 初心者で、次の問題に遭遇しました。

Form1デザイン ビューに多数のコントロールを含むクラスがあります。

Staffから継承しForm1、とりわけPlayAll、ユーザーが音楽キーボードで演奏したすべての音符を次々に再生するというメソッドを含む別のクラスがあります。

メソッドPlayAllでは、ユーザーがメモを押したかどうかを判断する条件を実装しました。

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

これはPlayAll()(Staff.cs内の)の関連コードです

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
    }
}

私の問題は、ErrorTextBox(Form1.csにある)に何も表示されないことです。どうすればこの問題を解決できますか? ありがとう。

4

4 に答える 4

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ます。

この問題に対する2つの異なる解決策を提案します。

  1. Form1開く代わりにStaff

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

コンストラクターインジェクションを介して#2を実行できます。のコンストラクタを次のように変更Staffします。

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
    }
}

Form1これで、のインスタンスを次のStaffように渡すことができます。

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

Staff staff = new Staff(form1);
于 2013-01-05T15:53:21.273 に答える
0

このリンクは、その問題を解決する 3 つの方法を示しています。ソリューションに対するケビンの答えに集中することをお勧めします。

1-フォーム1でハンドルを作成し、ラベル修飾子を公開し、フォーム2でアクセスします(リンクの質問で説明されているため、お勧めできません)

2-変数パラメーターをform2に渡す(ケビンの回答の最初のオプション)

3-値を更新するイベントの作成(ケビンの回答の2番目のオプション)

さらに情報が必要な場合は、コメントを残してください。

于 2011-12-31T12:23:21.057 に答える
0

別のクラスからフォーム コントロールにアクセスすることはできません。それらにアクセスする簡単な方法は安全でない方法です。ここでは..form1コントロール Textbox1 を持つクラスがあり、別のクラスがあるとし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);
 // ...
}

ただし、そうするのは危険な操作であることを忘れないでください。このコードは、デバッグ モードでエラーをスローします。したがって、デバッグせずに実行してください..

于 2013-01-05T15:26:20.013 に答える
0

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

それがあなたがこの問題に直面している理由です。

ご不明な点がございましたらお問い合わせください。

于 2011-12-31T10:37:15.983 に答える