0

我有一个 Windows 窗体,其中有几个文本框来介绍将使用多种方法的值。

我的意图是定义全局变量,这样它们就可以在整个程序中使用,但是虽然我没有编译错误,但当我检查时变量是空的(所有变量都写了数字)。这里有一些变量,也许我分配了错误的值:

//This is in the mainform, where all the textboxes are stored


namespace WindowsFormsApplication1{


public partial class Rotor_Calc:Form

{

        public  Rotor_Calc()
        {
            InitializeComponent();
        }


        public string T_HotIn
        {
            get { return Temphotin.Text; }
            set { Temphotin.Text = value; }
        }

        public string F_Cold
        {
            get { return flowCold.Text; }
            set { flowCold.Text = value; }
        }

// this is in a class named Globals

public class Globals

{
    public static string THotIn;
    public static string FlowCold;

     public Globals(Rotor_Calc Rotor)

     {
         THotIn = Rotor.T_HotIn;

         FlowCold = Rotor.F_Cold;
}

     public static double Thin = Convert.ToDouble(Globals.THotIn);

     public static double speedCold = Convert.ToDouble(Globals.FlowCold);
}

然后,在下面的方法中,我编写了 Globals.Thin,所以它可以从文本框中获取值,但是当我编译时它仍然是空的。

我还想获取另一个变量的计算值并将其写入结果文本框中。为此,我向后遵循相同的过程:

//在主窗体中定义文本框

        public string Eff_Hot
        {
            get { return effecthot.Text; }
            set { effecthot.Text = value; }
        }

        public string Eff_Cold
        {
            get { return effectcold.Text; }
            set { effectcold.Text = value; }
        }

//in the globals method, take the value from the calculation method:

public class Globals{


    public static string eff_cold;

    public static string eff_hot;


public Globals(Rotor_Calc Rotor){


         eff_cold = Rotor.Eff_Cold;
         eff_hot = Rotor.Eff_Hot;
}

     public static double effcold=Convert.ToDouble(eff_cold);

     public static double effhot = Convert.ToDouble(eff_hot);
}

当然最后一个不起作用,因为中间的计算给出了无限的值。

我到底在做什么错?有人可以帮忙吗?

4

1 回答 1

0

我认为您的问题在于以下声明:

public static double effcold=Convert.ToDouble(eff_cold); 

首次访问 Globals 类时立即执行。

这意味着它总是会在你的构造函数被执行之前Globals(Rotor_Calc Rotor)被执行,也就是说它会在你的构造函数被执行之前被执行eff_cold并且eff_hot被赋值。

也许您应该移动effcold=Convert.ToDouble(eff_cold);effhot = Convert.ToDouble(eff_hot);进入构造函数,但我不确定,因为我不太清楚您要做什么。

如果您尝试使用 Globals 从应用程序的每个点访问您的 TextBoxes 的值,您应该在 Globals 中保留一个指向您的表单的指针,而不是值。构造函数中的语句只执行一次。这意味着您当时将 TextBox 的值存储在 eff_cold 和 eff_hot 中,除非您再次执行构造函数,否则这些值不会更改。

此外,我不喜欢为仅包含静态内容的类创建构造函数的想法。

您的代码的一个可能的工作版本(如果我做对了)可能是这个:

public class Globals    
{
    public static Rotor_Calc Rotor;

     public static double EffHot
     {
         get { return Convert.ToDouble(Rotor.EffHot); }
         set { Rotor.EffHot = value.ToString(); }
     }

     public static double EffCold
     {
         get { return Convert.ToDouble(Rotor.EffCold); }
         set { Rotor.EffCold = value.ToString(); }
     }
}

只要您设置 Globals.Rotor = yourInstanceOfRotor_Calc; 这应该可以工作 (可能 Globals.Rotor = this;在Rotor_Calc 的InitializeComponent() 之后加上)。

无论如何,我不喜欢在 Globals 中保留对 Forms 的引用,我更喜欢某种 DataBinding。

根据您的最后评论进行编辑:

你可以为Rotor编写一个setter,在那里分配值并在InitializeComponent()之后调用setter:

public class Globals    
{
    public static double EffHot;
    public static double EffCold;
    public static Rotor_Calc Rotor
    {
        set 
        {
            EffHot = Convert.ToDouble(Rotor.EffHot);
            EffCold = Convert.ToDouble(Rotor.EffCold);
        }
     }

}
于 2013-02-11T13:35:19.500 回答