尽管文本框包含值,但分配给它们的变量不包含值;t、 为什么

本文关键字:包含值 变量 为什么 文本 分配 | 更新日期: 2023-09-27 17:58:43

我有一个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);
}

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

我到底做错了什么?有人能帮忙吗?

尽管文本框包含值,但分配给它们的变量不包含值;t、 为什么

我认为您的问题在于以下语句:

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

在第一次访问Globals类时立即执行。

这意味着它将始终在执行构造函数Globals(Rotor_Calc Rotor)之前执行,即在为eff_coldeff_hot分配值之前执行。

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

如果您试图使用全局参数从应用程序的每一点访问TextBoxes的值,则应在全局参数中保留一个指向Form的指针,而不是值。构造函数中的语句只执行一次。这意味着此时您正在将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;(也许用在Rotor_Calc的InitializeComponent()之后的Globals.Rotor = this;)。

无论如何,我不喜欢在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);
        }
     }
}