2011-12-14 2 views
2

Я пытаюсь изменить свойства объекта из другого класса, например.Изменение свойств объекта в другом классе?

abilities.cs (класс)

 public static void hideAllButtons() 
     { 
      frmFight fight = new frmFight(); 
      fight.btnAbility1.Visible = false; 
      fight.btnAbility2.Visible = false; 
      fight.btnAbility3.Visible = false; 
      fight.btnAbility4.Visible = false; 
      fight.btnAbility5.Visible = false; 
      fight.btnAbility6.Visible = false; 
      vars.buttonsVisible = false; 
     } 

Я пытаюсь использовать метод из предыдущего класса, чтобы изменить свойство объекта в следующей форме;

frmFight.cs (форма)

 
     private void btnAbility1_Click(object sender, EventArgs e) 
     { 
      abilities.hideAllButtons(); 
      btnAbilities.Enabled = false; 
     } 

Я пробовал все, что в моих знаниях и понимании, и много глядя в Интернете. Я попытался сделать объекты статичными, общедоступными, создав объект внутри класса. Но ничего не работает. Обычно я получаю ошибки StackOverFlow.

Я тоже очень новичок в ООП, но я не идиот, поэтому не думайте, чтобы я слишком «слегка» относился ко мне с возможным исправлением или причиной моей проблемы - если вы понимаете, то есть.

+0

Привет Брайан. Можете ли вы объяснить, почему вы создаете новый экземпляр frmFight в hideAllButtons()? – SquidScareMe

+0

Эй. Да, объекты btnAbilityX были сделаны в форме frmFight. Разве я не должен создавать новый экземпляр из них в классе способностей, для которого они должны быть представлены? – Brian

+0

, в этом случае нет необходимости создавать новый экземпляр frmFight. Я вижу пару хороших решений ниже, поэтому я не буду публиковать ответ. Удачи в ООП! – SquidScareMe

ответ

4

Метод hideAllButtons является статическим, так должен иметь форму аргумент.

public static void hideAllButtons(frmFight fight) 
{ 
    fight.btnAbility1.Visible = false; 
    fight.btnAbility2.Visible = false; 
    fight.btnAbility3.Visible = false; 
    fight.btnAbility4.Visible = false; 
    fight.btnAbility5.Visible = false; 
    fight.btnAbility6.Visible = false; 
    //vars.buttonsVisible = false; // What about this??? 
} 

и вызывать этот метод в обработчик щелчка,

hideAllButtons(this); 
+0

Спасибо! Это сработало отлично. Будет ли вам неприятность, если вы скажете мне, почему я ошибался, и что это делает? Если нет, то это не проблема! Еще раз спасибо за ответ. – Brian

+1

Вы создавали новый экземпляр frmFight и скрывали кнопки на нем, но не меняли кнопки в исходной форме. Эта вторая форма останется скрытой до тех пор, пока она не будет удалена сборщиком мусора. Этот код передает объект frmFight методу hideAllButtons, поэтому изменения выполняются в видимой форме. – TheEvilPenguin

2

Это действительно не будет работать, потому что ваши элементы управления находятся на вашем frmFight.

Вам нужно сделать, это место

private void hideAllButtons() 
    { 
     btnAbility1.Visible = false; 
     btnAbility2.Visible = false; 
     btnAbility3.Visible = false; 
     btnAbility4.Visible = false; 
     btnAbility5.Visible = false; 
     btnAbility6.Visible = false; 
     vars.buttonsVisible = false; 
    } 

на вашем frmFight.cs (форма) как частный метод и просто вызовите его на кнопке мыши, чтобы сделать его проще.

private void btnAbility1_Click(object sender, EventArgs e) 
    { 
     hideAllButtons(); 
     btnAbilities.Enabled = false; 
    } 

С уважением

Смежные вопросы