2009-08-28 6 views
0

私はC#をよく使っていません。論理を理解できません。しかし、VBは、はるかに論理的なので、私はよく理解しているようです。私には少なくとも。だから私は、あなたが現在でいる、その後1異なるフォーム上のコントロールにアクセスして、VBには全く問題はありません何かに遭遇しています。別のフォームでコントロールをアクセス/設定する

VBで、私は設定したい場合は

ボタンの状態は、Form2で言う。私は次のように入力します。

Form2.Button1.Text = "Text" 

C#では、私はこれを行うように見えることはできません。どうして?この権利にはかなりの理由があるでしょうか?

編集:このコードがあると、他のフォームのコントロールにアクセスできるように見えますか?

if (!AsioOut.isSupported()) 
      { 
       SoundProperties.radioButtonAsio.Enabled = false; 
       SoundProperties.buttonControlPanel.Enabled = false; 
       SoundProperties.comboBoxAsioDriver.Enabled = false; 
      } 
      else 
      { 
       // Just fill the comboBox AsioDriver with available driver names 
       String[] asioDriverNames = AsioOut.GetDriverNames(); 
       foreach (string driverName in asioDriverNames) 
       { 

        SoundProperties.comboBoxAsioDriver.Items.Add(driverName); 
       } 

       SoundProperties.comboBoxAsioDriver.SelectedIndex = 0; 
      } 

はちょうどこの「SoundProperties SoundPropertiesは=新しいSoundProperties()を追加しようとしました。 そして私は、コントロールへのアクセスを得るかしかし、私は、このIF文の両方の部分にコードのこのビットを追加する必要がありますか。?私のように見えますが、このコードの最後の部分にその行を追加するとエラーメッセージは表示されません。

"「SoundProperties」という名前のローカル変数は、このスコープでは宣言できません'SoundProperties'とは別の意味を持ちますが、これは既に別のものを示すために '子'スコープで使用されています。

は、行を削除すると、私は次のエラーを与える:

「オブジェクト参照が非静的フィールド、メソッド、またはプロパティのために必要とされる 『NAudio.SoundProperties.comboBoxAsioDriver』」

をここでは、これらの行を追加した後のコードです2つの場所で:

if (!AsioOut.isSupported()) 
      { 
       SoundProperties SoundProperties = new SoundProperties(); 
       SoundProperties.radioButtonAsio.Enabled = false; 
       SoundProperties.buttonControlPanel.Enabled = false; 
       SoundProperties.comboBoxAsioDriver.Enabled = false; 
      } 
      else 
      { 
       // Just fill the comboBox AsioDriver with available driver names 
       String[] asioDriverNames = AsioOut.GetDriverNames(); 
       foreach (string driverName in asioDriverNames) 
       { 
        SoundProperties SoundProperties = new SoundProperties(); 
        SoundProperties.comboBoxAsioDriver.Items.Add(driverName); 
       } 

       SoundProperties SoundProperties = new SoundProperties(); 
       SoundProperties.comboBoxAsioDriver.SelectedIndex = 0; 
      } 
+0

「新しいSoundProperties()」を実行するたびに、SoundPropertiesウィンドウの新しいコピーが実際に作成されます。「IF」ステートメントの外に作成して、同じコピーにアクセスしますif、else、およびforeachブロック。これは「スコープ」と関係があります。ここで何が起こっているのかを理解するのに役立つ「変数スコープ」を読んだと思います。上記のコードを実行した場合、目に見えないSoundProperties(表示されないため、不可視なので)の束になります。 – DataDink

+0

あなたのインスタンス名はあなたのクラス名とまったく同じですが、これはc#の正当なコードですが、混乱を避けるためにインスタンス名を変更する方が良いでしょう。 – Mez

答えて

4

私はこれを言うのを憎んではいけません。しかし、これは私が多くのVBコーダーが走っているのを見た問題です。

VBでは、あなたがしたくない場合はクラスを扱うことができません。 C#では、プロジェクトにフォームを追加しています。ビジュアルスタジオは「フォーム」から継承するクラスファイルを作成しています。

C#では、実際にこれをオブジェクトにインスタンス化し、そのオブジェクトで作業する必要があります。 VBでは、既にインスタンス化されているかのようにクラスにアクセスすることができますが、実際には新しい "Form2"を作成するだけです。

実際に "Form2"を2つ以上持ちたい場合は、次のようにします。

Dim window1 as new Form2() 
Dim window2 as new Form2() 

window1.Show() 
window2.Show() 

これを実行すると、画面に「Form2」という2つのコピーが表示されます。 VBとC#の違いは、Form2の最初のコピーを実際に作成(インスタンス化)する必要があるということです.C#はそれを実行しません。あなたが実際に「は、ボタン1」、公共の代わりに、プライベートにする必要があります - あなたがインスタンス化されている実際のオブジェクトを持っていたら

は今、あなたの質問に答えます。

これを行うには - Form2でButton1を選択し、プロパティを見てください... "修飾子"プロパティを見つけてpublicに設定してください。

これで、window1とwindow2の両方で「Button1」が表示されるようになりました。

希望しました。

+0

ああ、私はあなたを全く嫌っていない! :)実際には、これは多くを説明し、実際には完全に理にかなっています。ちょうどこれがなぜ必要なのか、それがなぜVBにそんなに違わないのか不思議です。おそらくC#は私が推測する別の方法で動作します:) –

+0

しかし、まだコードはどのように見えますか? 他のフォームのコントロールにアクセスする必要があるたびに、新しいインスタンスを作成する必要がありますか? 最初の投稿を更新して、私が持っているコードを追加します –

+0

いいえ - あなたがすでに作成したForm2の "インスタンス"を追跡するだけです - これはすべてOOP用のものですここでは、 "クラス"、 "クラスのインスタンス化"、 "変数スコープ"、 "オブジェクト指向プログラミング"、 "継承"、そしてええと、いくつかのことがあります。私があなたがしたいと思うのは、本当にクラスの「何と、なぜ」を理解することです。私はそれが束を助けると思う。 – DataDink

2

あなたはC#でも別のフォームにアクセスできます。 しかし、対話したいフォームインスタンスへの参照が必要です。

したがって、2番目のフォームインスタンスの変数を保持し、これを介してアクセスする必要があります。最初のフォームの呼び出しのコードから

例えば: :

Form2 my2ndForm = new Form2(); 
my2ndForm.Button1.Text = "Text"; 

パブリックまたは内部へのButton1のアクセス修飾子を設定してください。