Доступ / Установка элементов управления в другой форме - PullRequest
0 голосов
/ 29 августа 2009

Я не очень хорош в C #, я просто не понимаю логику. Но В.Б. Я, кажется, понимаю лучше, так как это кажется гораздо более логичным. Удовольствие для меня.

Итак, я столкнулся с чем-то, что вообще не является проблемой в 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 = new SoundProperties (); И я получаю доступ к элементам управления. Но нужно ли добавить этот бит кода в обе части этого оператора IF? Похоже, что я делаю, но тем не менее, добавление этой строки в последнюю часть этого кода ничего не делает и дает мне сообщение об ошибке:

«Локальная переменная с именем« SoundProperties »не может быть объявлена ​​в этой области, поскольку она придала бы другое значение« SoundProperties », который уже используется в« дочерней »области для обозначения чего-то другого» * ​​1015 *

Удаление строки дает мне следующую ошибку:

"Ссылка на объект требуется для нестатического поля, метода или свойства '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;
            }

Ответы [ 2 ]

4 голосов
/ 29 августа 2009

Пожалуйста, не ненавидите меня за это - но я думаю, что это проблема, с которой я сталкивался во многих 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 # заключается в том, что вам также нужно сделать (создать экземпляр) свою первую копию Form2 - C # не сделает это за вас.

Теперь, чтобы ответить на ваш вопрос:

Если у вас есть действительный объект, который был создан, вам нужно сделать «Button1» общедоступным, а не приватным.

Для этого - в Form2 - выберите Button1 и посмотрите свойства ... Найдите свойство «Модификаторы» и установите для него значение public.

Теперь вы сможете видеть «Button1» как в window1, так и в window2.

Надеюсь, это помогло.

2 голосов
/ 29 августа 2009

Вы также можете получить доступ к другой форме в c #. Но вам нужна ссылка на экземпляр Form, с которым вы хотите взаимодействовать.

Итак, вы должны держать переменную 2-го экземпляра формы и обращаться к ней через нее.

т.д .: Из кода первой формы звоните:

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

Обязательно установите для модификатора доступа Button1 общедоступный или внутренний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...