访问表单变量

时间:2012-04-30 10:40:42

标签: c# forms object properties

在C#中使用基本表单应用程序时,我无法访问其中的变量标签。

所以在表格类中我有

public partial class pingerform : Form 
{
  ..
  ..

  private System.Windows.Forms.TextBox textBox2;

  public string textBox2Text
  {
      get { return textBox2.Text; }
      set { textBox2.Text = value; }
  }

然后在我的主要应用程序中

Application.Run(new pingerform());
...
...

pingerform.textBox2Text.text() = str;

但我被告知没有对象参考。

  

错误1
  非静态字段需要对象引用,   方法或财产   'pingerform.textBox2Text.get'C:\ Users \ aaron.street \ Documents \ Visual   Studio 11 \ Projects \ PingDrop \ PingDrop \ Program.cs 54 21 PingDrop

所以我认为我会让pinger表类静态,但它不会让我这样做?

  

错误1
  无法创建静态类的实例   'PingDrop.pingerform'C:\ Users \ aaron.street \ Documents \ Visual Studio   11 \ Projects \ PingDrop \ PingDrop \ Program.cs 21 29 PingDrop

如何在不创建表单的特定实例的情况下访问表单属性

我有一个运行后台线程,我想定期更新表单中提交的文本?

干杯

亚伦

3 个答案:

答案 0 :(得分:0)

如果不创建该实例,则无法访问实例的属性,这是无意义的(或VB是相同的)。您已经创建了一个实例,然后将其传递给Application.Run()。无论如何,在Application.Run()之后你无法对你的表单做任何事情,因为它只在app退出时返回。如果您想对表单执行任何操作,则需要在其他位置执行此操作。当然,您不能将表单类设置为静态,因为您需要创建实例。

如果您需要对另一个线程中的表单执行某些操作,则需要在创建时将表单实例传递给该线程。请注意,直接搞乱来自非GUI线程的GUI元素是一个坏主意,您应该使用Control.BeginInvoke()

答案 1 :(得分:0)

您别无选择,只能创建新实例并将其作为参数传递给线程,或将其存储为主Program类的成员。

第二个选项的示例:

private static pingerform myPingerform = null;
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    myPingerform = new pingerform();
    Thread thread = new Thread(new ThreadStart(UpdateTextBox));
    thread.Start();
    Application.Run(myPingerform);
}

private static void UpdateTextBox()
{
    while (true)
    {
        myPingerform.textBox2.Text = DateTime.Now.Ticks.ToString();
        Thread.Sleep(1000);
    }
}

不要忘记将文本框更改为public

注意:对于访问文本框的一个后台线程的简单情况,这是一个简单的工作解决方案。如果您有更多线程访问它,会破坏。对于需要更多工作的最佳实践方法,请read this

答案 2 :(得分:-1)

请试试这个:

pingerform myForm = new pingerform();    
Application.Run(myForm);
myForm.textBox2Text = "this is text";