2009-08-28 82 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的访问修饰符设置为公开或内部。

相关问题