C# 在没有新实例的情况下在表单之间传递特定值

C# Specific value passing between forms without new instance

我有一个 C# 应用程序,允许用户记录游戏中发生的某些事件。为简单起见,我将它们称为 ParentFormChildForm.

ParentForm 99% 的时间用于记录常见事件。这表示为用户单击 PictureBox 并且 PictureBoxTag 属性 被添加到 ListBox。当"rare"事件发生时,用户可以点击ParentForm上的一个"log rare event"按钮打开ChildForm,从而打开一组"rare event"PictureBoxes,其功能与 ParentForm 中的相同。挑战在于我希望将这些常见事件和罕见事件记录到相同的 ListBox,因此我试图了解如何从中获得 PictureBox 点击(以及后续 Tag ChildForm 上的 PictureBox) 到 Parent 表格上的 ListBox

ParentFormChildForm 打开时 不会 关闭,并且需要保持打开状态。

ParentForm 代码中,我已经有了捕获 PictureBox 次点击和抓取 Tag 以及将其添加到ListBox,如果我能用这些就好了。

这是我目前为Parent所做的尝试:

// This file is EventLogger.cs
using rareEvent;
namespace mainWindow {
    public partial class EventLogger : Form {
        // In the ParentForm (listeners for PictureBox clicks are handled elsewhere)
        public void pictureBox_Click(object sender, EventArgs e) {

            PictureBox pbSender = (PictureBox) sender;

            // Open new window and handle "rare" drops
            if (pbSender.Tag.ToString() == "rare") {

                // Open rare form
                EventLogger.RareForm rare = new EventLogger.RareForm();
                rare.Show();
            }
        }
    }
}

这里是 child:

// This file is Rare.cs
using EventLogger;
namespace rareEvent {
    public partial class rareEventForm : Form {

        // In the ChildForm
        private void pictureBox_Click(object sender, EventArgs e) {

            // Does not compile if form is not instantiated, but I do not
            // want a new instance
            EventLogger form;
            form.pictureBox_Click(sender, e);
        }
    }
}

我认为这样的事情可行,但它给出了错误

The type or namespace name 'EventLogger' does not exist in the namespace
'mainWindow' (are you missing an assembly reference?)

如有任何帮助,我们将不胜感激。我发现的所有其他关于在表单之间传递值的示例似乎都创建了我不想要的新实例,或者已经 8 年没有工作了。

欣赏!

编辑: 代码已更新为每个文件中都有 using <namespace>。问题仍然存在,无法使用 new 在没有 的情况下在两种形式 之间发送值。 (请参阅对 this 回答的评论)

在第一个表单中创建一个(它的)实例,就像我的 form1。它必须是静态的,您要访问的所有数据类型都应该是 public.

//FORM1
public partial class Form1 : Form
{
    //Instance of this form
    public static Form1 instance;

    //For testing
    public string myProperty = "TEST";

    //Assign instance to this either in the constructor on on load like this 
    public Form1()
    {

        InitializeComponent();
        instance = this;
    }
    //or
    private void Form1_Load(object sender, EventArgs e)
    {
        //Assign the instance to this class
        instance = this;
    }

然后在form2中调用EventLogger.RareForm rare = new EventLogger.RareForm();而不是新形式做

EventLogger.RareForm rare = EventLogger.RareForm.instance

或者在我的情况下

Form1 frm = Form1.instance;

然后我像这样从 form2 检查 form 1 的 属性

Console.WriteLine(frm.myProperty);

输出为 "Test"

有什么麻烦喊。