2009-08-28 41 views
0

我不擅長C#,我只是不懂邏輯。但VB似乎更好地理解,因爲它看起來更合乎邏輯。至少我。在另一個表單上訪問/設置控件

所以我碰到一些東西,是沒有問題的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'賦予不同的含義,'SoundProperties'已經被用在'子'範圍內來表示別的東西「

卸下行給出我以下錯誤:

「的對象引用是所必需的非靜態字段,方法或屬性‘NAudio.SoundProperties.comboBoxAsioDriver’」

下面的代碼添加這些行之後在兩個地方:

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(隱形,因爲你從來沒有.Show)。 – DataDink 2009-08-28 22:31:39

+0

您的實例名稱與您的類名稱完全相同,儘管這是c#中的合法代碼,但最好更改實例名稱以避免混淆。 – Mez 2009-08-29 00:12:25

回答

4

請不要討厭我這麼說 - 但我認爲這是一個我見過很多VB編程人員遇到的問題。

VB允許你不處理類,如果你不想。當你在C#中添加一個表單到你的項目時 - visual studio只是爲你創建一個從「Form」繼承的類文件。

在C#中,您必須實際將其實例化爲一個對象,然後使用該對象。 VB允許你像剛剛實例化一樣訪問類,但實際上它只是爲你創建一個新的「Form2」。

在vb中,如果你想有超過1個實際的「Form2」,你會這樣說...

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

window1.Show() 
window2.Show() 

現在,當您運行此操作時,屏幕上將出現兩個「Form2」副本。 VB和C#之間的區別是,你還需要實際上使(實例)的窗體2的第一個副本 - C#不會爲你做。

現在回答你的問題:

一旦你已被實例化的實際對象 - 你需要真正讓「Button1的」公衆而不是私人的。

爲此 - 在Form2上 - 選擇Button1並查看屬性... 找到「Modifiers」屬性並將其設置爲public。

現在,您將可以看到「Button1的」兩個窗口1窗口2和。

希望這有助於。

+0

哦,我根本不討厭你! :)其實這解釋了很多,真的很有意義。只是想知道爲什麼這甚至是必要的,爲什麼它不像VB那樣。可能只是C#以不同的方式工作,我猜:) – 2009-08-28 22:00:09

+0

但是,代碼實際上是什麼樣子? 我的意思是,每次我需要訪問其他表單中的控件時,是否必須創建一個新實例? 我會更新後的第一個添加一些代碼我有 – 2009-08-28 22:07:45

+0

沒有 - 你只需要保持跟蹤你已經創建窗體2的「實例」 - 這一切只是一堆OOP的東西,所以這裏有一些谷歌的東西:「類」,「類實例化」,「變量範圍」,「面向對象的程序設計」,「繼承」,嗯......我認爲這應該讓你開始。我認爲你想要做的是真正理解類的「什麼和爲什麼」。我認爲這將有助於一堆。 – DataDink 2009-08-28 22:20:02

2

你也可以在c#中訪問另一個表單。 但是,您需要對要與之交互的表單實例的引用。

所以你必須保存第二個Form實例的變量並通過它訪問它。

例如: - 從第一種形式調用的代碼:

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

務必將Button1的訪問修飾符設置爲公開或內部。

相關問題