Взаимодействие с элементом управления Windows из другого класса C # - PullRequest
1 голос
/ 31 декабря 2011

Я новичок в 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 ]

1 голос
/ 05 января 2013

Наследование не создает связь между экземплярами (объектами) участвующих классов.

public class Form1 : Form
{
    public TextBox ErrorTextBox;
}

public class Staff : Form1
{ 
    public void PlayAll() { }
}

Давайте создадим два экземпляра

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

Staff staff = new Staff();
staff.Show();

Это откроет две формы.Теперь существуют два разных поля ErrorTextBox: один в форме form1 и один в форме staff.

Я предлагаю два разных решения этой проблемы:

  1. Вместо открытияForm1 открыть Staff.

  2. Передать ссылку form1 или form1.ErrorTextBox на staff.

Youможно сделать # 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);
0 голосов
/ 31 декабря 2011

Эта ссылка покажет вам 3 способа преодоления этой проблемы. Я предлагаю вам сосредоточиться на ответе Кевина для решения.

1 - Создание дескриптора в форме 1, публичный доступ к модификатору метки и доступ к нему в форме 2 (не рекомендуется, объяснено в вопросе о ссылке)

2- Передача параметра переменной в form2 (первый вариант в ответе Кевина)

3 - Создание события, которое обновит значение (второй вариант в ответе Кевина)

Оставьте комментарий, если вам нужна дополнительная информация.

0 голосов
/ 05 января 2013

Вы не можете получить доступ к любому элементу управления формы из другого класса. Простой способ доступа к ним небезопасен, вот он .. предположим, у вас есть класс 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);
 // ...
}

Но помните, это небезопасная операция. Этот код выдаст ошибку в режиме отладки. Так что запустите его без отладки ..

0 голосов
/ 31 декабря 2011

Здесь основная проблема заключается в том, что вы наследуете класс form1 в классе персонала.Невозможно получить доступ к членам формы (ярлыку) формы1 через персонал.

Вот почему вы столкнулись с этой проблемой.

Свяжитесь, если у вас есть какие-либо сомнения.

...