Как сделать класс в C #, чтобы я мог нажать кнопку на 1 форме, чтобы обновить данные на второй форме? - PullRequest
0 голосов
/ 16 апреля 2019

В настоящее время я делаю RPG, используя Winforms для школьного проекта. Однако мои знания о классах настолько ограничены, что у меня возникают проблемы с созданием правильного класса, который берет данные из 1 формы, используется во второй форме, а затем отправляется обратно в первую форму.

Процесс, который я пытаюсь выполнить, выглядит следующим образом:

  • Основная форма открывает вторую форму, которая отображает элементы в списке. 1

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

  • Данные для эффекта находятся в первой форме, где много других вычислений сделаны с теми же данными. 3

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

Это функция, которую я хочу запустить в первой форме при нажатии кнопки во второй форме.

public void SmallPot()
        {

            currentPHP += pHP * .25;

            if (newPHP > pHP)
            {

                newPHP = pHP;

            }

            pHPBarUpdate = (int)(newPHP / pHP * 377);

            pnlCurrentPHP.Width = pHPBarUpdate;

            newPHP = currentPHP;

        }

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

Что происходит: Поскольку я создаю новый объект формы один в форме два, все мои переменные сбрасываются в 0 до вычисления, в результате чего ничего не происходит после закрытия второй формы.

1 Ответ

0 голосов
/ 16 апреля 2019

Я дам вам общее руководство для реализации решения, основанного на определении события и повышении

Давайте начнем со второй формы, где вам нужно сообщить первой форме событие

public class Form2 : Form
{
    // start creating the delegate type
    public delegate void OnItemSelected(string itemName);

    // declare the public event that this form will raise
    public event OnItemSelected ItemSelected;


    protected void cmdItemUse_Click(object sender, EventArgs e)
    {
         // When the user clicks to select an item....
         string itemName = GetItemSelectedFromList();

         // Check if someone is interested in this item selection
         if(ItemSelected != null)
             ItemSelected.Invoke(itemName);
    }
}

Теперь мы что-то изменим в первой форме.Нам нужно создать вторую форму, и перед ее отображением мы подписываемся на событие, открываемое второй формой

public class Form1 : Form
{
     ... other stuff....

     protected void cmdOpenSelection_Click(object sender, EventArgs e)
     {
         using(Form2 frm = new Form2())
         {
             // Subscribe the event giving it a method inside this class
             // that doesn't return anything and receives a string
             // as required by the delegate type of the event
             frm.ItemSelected += handleItemSelection;
             frm.ShowDialog(); // frm.Show();
         }
     }
     private void handlerItemSelection(string itemName)
     {
         // This method is a custom Event handler and inside Form1 
         // will be called by Form2 through the Invoke on the event variable 
     }
}

. В приведенном выше примере я предпочитаю передавать простую строку, но, конечно, вы можете передать все, включаяссылочный тип, такой как экземпляр класса, содержащий всю информацию, необходимую для выбора элемента.

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