0

在 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

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

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

干杯

亚伦

4

3 回答 3

0

如果不创建实例,就无法访​​问实例的属性,这是无稽之谈(或 VB 相同)。而且您已经创建了然后传递给的实例Application.Run()。无论如何,你不能对你的表单做任何事情,Application.Run()因为它只有在应用程序退出时才会返回。如果你想对表格做任何事情,你需要在其他地方做。当然,您不能将表单类设为静态,因为您需要创建实例。

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

于 2012-04-30T10:46:29.483 回答
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.

注意:这是一个后台线程访问文本框的简单情况的简单工作解决方案。如果您有更多线程访问它,这将中断. 有关需要更多工作的最佳实践方法,请阅读此内容

于 2012-04-30T10:55:04.657 回答
-1

请试试这个:

pingerform myForm = new pingerform();    
Application.Run(myForm);
myForm.textBox2Text = "this is text";
于 2012-04-30T10:47:18.967 回答