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

C# 尽管文本框包含值,但分配给它们的变量不';t、 为什么??,c#,textbox,C#,Textbox,我有一个windows窗体,其中有几个文本框,用于介绍将在几个方法中使用的值 我的意图是定义全局变量,以便它们可以在整个程序中使用,但尽管我没有得到编译错误,但当我检查时,变量是空的(所有变量中都写有数字)。下面是一些变量,可能是我赋值错误: //This is in the mainform, where all the textboxes are stored namespace WindowsFormsApplication1{ public partial class Rotor

我有一个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);
}
当然,最后一个不起作用,因为中间的计算给出了无限的值


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

我想你的问题在于以下事实:

public static double effcold=Convert.ToDouble(eff_cold); 
第一次访问Globals类时立即执行

这意味着它总是在构造函数
Globals(Rotor\u Calc Rotor)
执行之前执行,即在
eff\u cold
eff\u hot
赋值之前执行

也许您应该移动
effcold=Convert.ToDouble(eff\u cold)
effhot=Convert.ToDouble(eff_hot)在构造函数中,但我不确定,因为我不太清楚您要做什么

如果您试图使用Globals从应用程序的每个点访问文本框的值,那么应该在Globals中保留指向表单的指针,而不是值。构造函数中的语句只执行一次。这意味着此时您正在将文本框的值存储在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,这项功能就会起作用;(也许有一个
Globals.Rotor=this;
在Rotor\u Calc的初始化组件()之后

无论如何,我不喜欢在全局中保留对表单的引用,我更喜欢某种数据绑定

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

您只需为Rotor编写一个setter,在那里分配值,并在InitializeComponent()之后调用setter:


您是如何创建文本框的,是否已将它们添加到窗体的控件集合中?实例类可能比静态类更适合您您您没有使用rotor.showform()或类似的东西来显示窗体。我在windows窗体中创建了文本框。显示窗体是什么意思?所有文本框所在的表单?如果我改为创建实例,会不会很混乱?我只举了两个例子,但是表单有20个文本框,20个单选按钮和复选框,它有点大。我已经用VisualBasic编写了这个程序,但我真的需要翻译它。但即使在一开始,我只想从文本框中获取值,它仍然被赋值为零。应用程序开始读取Globals类,而不是主窗体,因此它为我将用于计算的实际变量/参数指定了一个值零,而不是之后从文本框读取的值。如果我照你说的做,那么我想用于计算的变量就不再在Globals类中了。你的意思是想让Globals反映在文本框中所做的更改吗?也就是说,开始时该值为0,但将其更改为10 Globals.effcold值为10.0?不完全正确。让我们看看我是否能更好地解释我自己。我有一堆文本框,用户必须在其中写入值。一旦写入值并运行应用程序,这些值就不会改变(在上面的代码中是Thotin.Text,即)。这些应该在开始时就已经可用,无需计算即可获得值,只需读取即可。然后,使用这些设置为变量的值,我有几种计算方法,比如eff_cold。如果第一个变量的值改变,它就会改变。我看到的问题是,因为它以前访问过Globals类,所以在读取文本框后,值不会改变。我认为,如果我们找到了解决方法,应用程序将运行良好(或者会出现其他隐藏的错误!),谢谢!我现在就来试试,我在这方面很新,相比之下,VisualBasic很简单。
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);
        }
     }

}