2016-03-08 50 views
0

对于C#我很新,我只是想学习基础知识。我正在创建的是一个为我玩的2个游戏读取.txt文件(日志文件)的程序。无尽的任务和MUD。我想要做的是当我加载.txt文件时,它会检测它的EQ日志或MUD日志,然后显示它将开始填充的正确数据字段(文本框等)向UserControls发送数据的表格

At首先,我打算使用一个groupBox,根据哪个日志被加载,隐藏/显示正确的groupbox。然而在我的研究中,我了解了UserControls。

我喜欢加载用户控件到面板的想法,这样的文本框和按钮浏览到该文本文件是始终不变,那么它只是改变了其不同的文本文件被加载在它们下面的数据。

我的问题是我所有的代码都在我的“form1.cs”中,当我尝试更新usercontrol中的代码时,它会引发有关保护级别的错误。

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

我尝试:

myControl.textbox1.Text = "Test"; 

我从form.cs代码这样做的,之后读取一行的日志,它相匹配的某些特定的词组,但它只是说,保护水平是错误的并不会工作。我将usercontrol上的所有东西都定义为public,但显然我没有正确地考虑这个问题。

我必须以某种方式“包含”form1.cs上的usercontrol.cs吗?我一直在试图研究这个,但是我找不到任何能够帮助我的事情,所以要么a)其真正的明显,我只是没有得到它或b)我做的事情完全错误,根本不理解。

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

我来自一个PHP/Web背景,所以我想这样想怎么变成DIV的可见和不可见取决于发生了什么。也许usercontrols不这样工作,不应该与主窗体交互,并应该有自己的代码?

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

编辑: 下面是一些代码,显示了我想学的东西。我已将其简化为不包含FileWatcherSystem,因为两者都生成相同的错误。

我有Form1.cs和里面,我很确定我的UserControl2这仅仅是一个用户控件框和名为“textBox1的”

UserControl2 myControl = new UserControl2(); 

文本框此控件加载到PANEL1这是在Form1的.cs。 我也在form1上有一个按钮。CS,当我点击它,我试图填补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),所以我相信我开始了解如何使控件在面板内出现/消失,但我仍然无法获取form1.cs代码来进行交互与UserControl2.cs文件中的控件一起使用。

+0

您能否发布实际的异常消息,我怀疑您的错误是由于跨线程访问引起的。也就是说,一个控件(用户或其他)只能从UI线程访问,但是你的'FileSystemWatcher'正在使用backgound线程来完成它的工作。 – CodingGorilla

回答

1

请确保您的用户控件中的textBox1具有“public”访问修饰符,而不是“private”或“protected”,在其中定义。

为了帮助理解这个概念,您的用户控件是它自己的类。 textbox1是此类的成员,因此只有您的课程才能访问它,除非它被标记为公开。 (如果它受到保护,那么继承自用户控件的类也可以访问它,但在这里并没有真正相关。)

+0

哦,我明白了。我不得不在文本框本身的属性上改变它。请参阅,我只是将.cs文件中的代码公开而不是私有。我从未意识到控制本身也必须公之于众。非常感谢!! – DerekConlon