【问题标题】:How do I make a class in c# so I can click a button on 1 form to update data on a second form?如何在 c# 中创建一个类,以便我可以单击一个表单上的按钮来更新第二个表单上的数据?
【发布时间】:2019-04-16 22:28:13
【问题描述】:

我目前正在为一个学校项目使用 Winforms 制作 rpg。但是,我对课程的了解非常有限,以至于我无法制作一个合适的课程,该课程从一种形式中获取数据,用于第二种形式,然后发送回第一种形式。

我要完成的过程是这样的:

  • 主窗体打开第二个窗体,在列表框中显示项目。 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,导致表格二关闭后什么都没有发生。

【问题讨论】:

  • 处理这种情况的正确方法是通过events你的第二个表单定义一个事件,你的第一个表单订阅这个事件,你的第二个表单引发事件,你的第一个表单接收通知和订阅时给定的事件处理程序中所需的所有数据。
  • 感谢您的快速回答!您是否碰巧有有关如何执行此操作的链接或在与我类似的情况下如何查看的示例?我们还没有在我们的计划中处理事件,任何关于如何做到这一点的参考都会有所帮助!此外,如果这最终解决了我的问题,请将其发布为答案而不是评论,以便我可以选择它作为我问题的正确答案:)

标签: c# winforms class button


【解决方案1】:

我将为您提供一个基于事件定义和引发的解决方案的一般指导

让我们从您需要向第一个表单传达事件的第二个表单开始

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 
     }
}

在上面的示例中,我选择传递一个简单的字符串,但当然您可以传递任何内容,包括引用类型,例如包含所有信息的类的实例 项目选择所需的。

【讨论】:

  • 在您有“frm.ItemSlected += handleItemSelection”的第一个表单上,这代表什么?有什么具体的东西我应该放在这里还是一个笼统的术语或短语?
  • 这是当您想将方法 (handleItemSelection) 分配给第二个表单实例中的事件时使用的语法。这样,第二个表单就拥有了回调第一个表单实例中的代码所需的一切。
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多