我是Windows Form编程的新手,我遇到了一个问题。
我有一个Windows窗体Form1
,带有一个文本框:tbx_Log
。
在同一个项目的另一个类中,我想在日志文本框中写一些内容,但我不能在该类中引用tbx_Log。我怎样才能做到这一点?
答案 0 :(得分:4)
访问其他类实例(对象)中的对象是错误的样式并且违反了数据封装。将方法添加到Form1
:
public void SetLogText(String text)
{
tbx_Log.Text = text;
}
这样,您可以通过使用其他控件或稍后记录到文件来更改方法的实现,而无需修改所有调用站点。总是试着让课外的代码不要知道里面的内容。类实现应该是外部代码的“黑盒子”。
答案 1 :(得分:2)
您需要公开文本框(不推荐)或向表单类添加一个公共方法,该方法会将字符串写入文本框(更好)。
public class Form1
{
protected Textbox tbx_Log;
public void Log(string str)
{
tbx_Log.Text += str + Environment.NewLine;
}
}
public class Program
{
private void DoStuff()
{
Form1 myForm = new Form1();
//Make form visible, etc...
myForm.Log("Test Log");
}
}
答案 2 :(得分:2)
我建议您在Form类上创建一个写入日志文本框的方法。然后,您将该方法作为委托(回调)传递给非Form类。这为您提供了更多的灵活性。例如,如果您想从不同的类调用同一个类,并且您想要对日志信息执行不同的操作(例如将其写入文件),那么您可以传递不同的回调函数。
答案 3 :(得分:1)
我建议您至少在表单中添加一个负责执行更新的方法,而不是直接引用tbx_Log。然后,您可以为您的类提供对Form的引用,并让您的类调用Forms日志记录功能,然后将该文本添加到文本框中。
我至少说过,因为你可能想要定义一个接口并让你的Form或更高版本的更具体的日志类来实现接口,让你的类与实现定义接口的任何东西进行交互。
答案 4 :(得分:0)
您可以在表单上创建一个公共方法。并且如果从不同于UI线程的线程调用它,也可以使其成为线程安全的。
其他类如何访问您的方法取决于您的应用程序的工作方式以及表单类与其他类之间的关系。
public void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.tbx_Log.Text = text;
}
}
有关winforms上线程安全调用的完整示例和说明,请检查MSDN,其中还说明了如何使用BackgroundWorker来实现线程安全,这是执行此操作的首选方法。