表单向 UserControls 发送数据

Forms sending data to UserControls

我是 C# 的新手,只是想学习基础知识。我正在创建的是一个程序,它读取我玩的 2 个游戏的 .txt 文件(日志文件)。 Everquest 和 MUD。我想要做的是当我加载 .txt 文件时,它会检测它是 EQ 日志还是 MUD 日志,然后显示它将开始填充的正确数据字段(文本框等)

起初,我打算使用一个 groupBox,然后 hide/show 根据加载的日志选择合适的 groupbox。然而,在我的研究中,我了解了 UserControls。

我喜欢将用户控件加载到面板中的想法,这样文本框和用于浏览文本文件的按钮始终保持不变,然后它只是根据加载的文本文件更改它们下面的数据。

我的问题是我的所有代码都在 "form1.cs" 中,当我尝试更新用户控件中的代码时,它会抛出有关保护级别的错误。

我的问题是,我用来打开和读取日志文件的代码是一个 FileSystemWatcher。此代码是否必须位于 usercontrol.cs 文件中,或者是否可以位于 form1.cs 文件中,如果可以位于 form1.cs 文件中,我该如何填充文本框或任何用户控件上的其他类型的字段?

我正在尝试:

myControl.textbox1.Text = "Test";

我是根据 form.cs 代码执行此操作的,在它读取了一行日志并匹配了某个短语后,它只是说保护级别错误并且无法工作。我将用户控件上的所有内容都定义为 public 但显然我没有正确考虑这个问题。

我是否必须以某种方式 "include" form1.cs 上的 usercontrol.cs?我一直在努力研究这个,但我找不到任何对我有帮助的东西,所以要么 a) 它真的很明显,但我只是不明白,要么 b) 我做的完全错了,根本不理解。

也许 groupBox 最适合我要做的事情?用户控件是否设计为独立于自己的代码工作,而不是作为可以打开和关闭的东西?

我来自 PHP/Web 的背景,所以我试着想像我如何根据发生的事情将 DIV 的内容变为可见和不可见。也许用户控件不是那样工作的,不应该与主窗体交互并且应该有自己的代码?

如果需要我可以提供代码,但这更多的是理解概念问题而不是代码问题。一旦我理解了它应该如何运行,我可能就能弄清楚代码。

编辑: 这是一些代码,显示了我正在尝试学习的内容。我已将其简化为不包括 FileWatcherSystem,因为两者都会生成相同的错误。

我有 form1.cs,我在其中定义了我的 UserControl2,它只是一个用户控件框和一个名为 "textBox1"

的文本框
UserControl2 myControl = new UserControl2();

此控件加载到 form1.cs 上的 panel1 中。 我在 form1.cs 上还有一个按钮,当我单击它时,我试图用 "test"

这个词填充 textBox1

代码如下所示:

private void button1_Click(object sender, EventArgs e)
    {
        myControl.textBox1.Text = "Test";
    }

在这种情况下,上面的 "textBox1" 带有红色下划线,将鼠标悬停在上面时出现的错误是:

"UserControl2.textBox1" is inaccessible due to its protection level.

我可以使用按钮 运行 成功执行以下命令:

panel1.Controls.Clear();

这将从面板中清除预加载的控件 (myControl),所以我相信我开始了解如何在面板内制作控件 appear/dissappear,但我仍然无法获得 form1.cs 与 UserControl2.cs 文件中的控件交互的代码。

确保用户控件中的 textBox1 具有 "public" 访问修饰符,而不是定义它的 "private" 或 "protected"。

为了帮助概念位,您的用户控件是它自己的 class。 textbox1 是此 class 的成员,因此只有您的 class 才能访问它,除非它被标记为 public。 (如果它受到保护,那么从您的用户控件继承的 classes 也可以访问它,但这在这里并不真正相关。)