2013-12-03 2 views
1

Я пытаюсь правильно добавить элементы управления (фактически это объекты, которые я создал) к панели в Form1.cs. Например, класс MusicNote является объектом окна изображения, который, когда он создается из метода FORM1_LOAD METHOD и добавлен в объект MusicStaff (другой класс), который затем добавляется в панель, отлично работает. Смотрите ниже ...Добавление элементов управления в форму форм Windows

MusicStaff ms; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    ms = new MusicStaff(); 
    panel2.Controls.Add(ms); 

    //Test of Music Note 
    MusicNote musNote = new MusicNote(1, ""); 
    ms.Controls.Add(musNote); 

Проблема заключается в том, что я хочу MusicNote быть создан и добавлен в мс и panel2 (которые разные классы) при нажатии кнопки. У меня есть событие нажатия кнопки на другом классе, который работает нормально. Проблема в том, что ms и panel2 недоступны из этого класса, и я не знаю, как получить к ним доступ. Я знаю, что если я создам новые экземпляры MusicStaff и Form1, они будут новым объектом, а не действительными.

 protected void MusKey_Click(object sender, EventArgs e) 
     { 
      this.BackColor = Color.Green; 
      txt1.Text = Convert.ToString(musicNote); //To test if musicNote refers to the correct pitch integer. 
      MusicNote musNote = new MusicNote(this.musicNote, " "); 
      //HERE I NEED THE CODE TO ADD MUSNOTE TO MUSICSTAFF WHICH IS ALREADY ADDED TO THE PANEL IN FORM1.CS } 

Я надеюсь, что я объяснил, что мне нужно достаточно четко ...

+0

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

просто создать MusicNote и мс как частное поле статического класса и сделать их как общественное статическое свойство

 static MusicStaff ms; 
    statuc MusicNote musNote 

private void Form1_Load(object sender, EventArgs e) 
{ 
    ms = new MusicStaff(); 
    panel2.Controls.Add(ms); 

    //Test of Music Note 
    musNote = new MusicNote(1, ""); 
    ms.Controls.Add(musNote); 

public static MusicStaff Ms 
{ 
    get {return ms; } 
} 


public static MusicNote Mn 
{ 
    get {return ms; } 
} 

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

Form1.Ms or Form1.Mn 
+0

Возможно, я был недостаточно ясен ... чего я хочу достичь, так это возможность доступа к панели2 из других классов ... например. Form1.panel2.Controls.Add (musicNote), но Form1.panel2 не будет работать в C# .. – user2307236

+0

Да, он будет работать со статическим свойством попробовать –

+2

@JulieShannon, вам нужно будет пометить 'ms' и' musNote' как 'public' или, по крайней мере,' internal' для этого. –

2

Вы можете сделать это одним из двух способов. Easy one first:

Просто объявите свой контроль MusicStaff за пределами метода Form1_Load (сделайте это поле на форме).

MusicStaff ms = null; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    ms = new MusicStaff(); 
    //etc... 
} 

Во-вторых, вы можете получить элемент управления из коллекции элементов управления с помощью Linq. Эта линия предполагает, что существует только один контроль типа MusicStaff в коллекции:

var ms = Controls.First(c => c is MusicStaff) as MusicStaff; 
+0

Я не могу комментировать сообщение Джулии, но ее ответ по существу тот же, что и мой, ЗА ИСКЛЮЧЕНИЕМ НЕ следует делать поле статичным. Если вы сделаете это, ВСЕ экземпляры вашей формы будут совместно использовать этот элемент управления. Добавление примечания к одному добавит его ко всем. Я очень сомневаюсь, что это ваше желаемое поведение. –

+0

Первый способ - это точно то же самое, что я сделал ... исправьте меня, если я ошибаюсь .. – user2307236

+0

Я думаю, что то, что я ответил Джулии, это то, что вы указали на MusicNotes ... Tks – user2307236

0

Проблема заключается в том, что мс и panel2 не доступны из этого класса, и я не знаю, как получить к ним доступ. Это связано с тем, что по умолчанию элементы управления формы имеют private. Как правило, это хорошо, чтобы предотвратить excessive coupling между Формой и другими объектами, включая другие Формы. Вы можете изменить свойство Visibility элемента управления, используя конструктор формы VS.

Лучший подход, на мой взгляд, состоит в том, чтобы сделать каждый объект максимально самодостаточным, чтобы минимизировать зависимость между объектами (как описано в ссылке выше). Так, например, форма, которая отображает/редактирует музыкальный персонал, должна нести полную ответственность за создание/перемещение/удаление персонала и любых заметок или других обозначений персонала. Тогда другие объекты могут спросить у персонал, чтобы внести изменения в персонал, а не вносить изменения напрямую. Вы можете сделать это путем добавления общественности/внутренний метода для Form1, AddMusicNote(int value, string description), а затем вызвать его из другого класса/формы:

protected void MusKey_Click(object sender, EventArgs e) 
{ 
    this.BackColor = Color.Green; 
    txt1.Text = Convert.ToString(musicNote); //To test if musicNote refers to the correct pitch integer. 
    form1.AddMusicNote(musicNote, " "); 
} 
Смежные вопросы