winforms C# double,从另一个类中的List解析TextBox始终为“0”或“NaN”

ff29svar  于 2023-10-23  发布在  C#
关注(0)|答案(1)|浏览(129)

让我们从预期的工作流程开始:
1.文本框列表在Class 1中创建并添加到Panel中。
1.在Class 2中调用List以使用double。在Windows窗体中使用用户输入进行分析。
1.类3中的按钮使用解析后的值激活一些几何计算。
问题是,当我显示一条消息来验证对象是否具有正确的值时,我总是得到一个值“0”或“NaN”。
我试着让List静态化,我用Dictionary替换了List,但没有结果;我试图解析List中的文本框,为Class 2中的一些公共变量赋值,生成了一个overflowexception。这是目前最后一次尝试:

CustomTextBox类:

{
public List<System.Windows.Forms.TextBox> GetTextBoxCon()
        {
            return TextBoxCon();
        }
        public List<System.Windows.Forms.TextBox> TextBoxCon()
        {
            List<System.Windows.Forms.TextBox> txtBoxCon = new List<System.Windows.Forms.TextBox>();

            System.Windows.Forms.TextBox txtConD = DefaultTextBox();
            txtConD.Location = p1;
            txtConD.Tag = 0;

            System.Windows.Forms.TextBox txtCon_d = DefaultTextBox();
            txtCon_d.Location = p2;
            txtCon_d.Tag = 1;

            txtBoxCon.Add(txtConD);
            txtBoxCon.Add(txtCon_d);

            // n more textboxes...            

            foreach (var textBox in txtBoxCon)
            {
                textBox.TextChanged += new EventHandler(ConTextBox_TextChanged);
            }
            
            return txtBoxCon;
        }
    }

Class2:

{
public void ConeCalculation()
        {
            CustomTextBox ctb = CustomTextBox.Vent();
            List<System.Windows.Forms.TextBox> txtBoxCon = ctb.GetTextBoxCon();

            //Previous attempt
            /*System.Windows.Forms.TextBox txtConD = txtBoxCon[0];
            System.Windows.Forms.TextBox txtCon_d = txtBoxCon[1];*/

            //Last attempt
            double pre_dimLarge = double.Parse(txtBoxCon[0].Text);
            double dimSmall = double.Parse(txtBoxCon[1].Text);

            string message = "";
            message += "pre_dimLarge: " + pre_dimLarge.ToString() + '\n' + '\n';
            message += "dimSmall: " + dimSmall.ToString() + "\n" + '\n';
            MessageBox.Show(message, "Verified values");
        }
    }

**注意:**如果您想查看其他方法的定义。好了

public static CustomTextBox inst = null;
public static CustomTextBox Vent()
{
    if (inst == null)
    {
        inst = new CustomTextBox();
        return inst;
    }
    return inst;
}

private void ConTextBox_TextChanged(object sender, EventArgs e)
{
    if (sender is System.Windows.Forms.TextBox textBox)
    {
        if (!string.IsNullOrEmpty(textBox.Text) && !double.TryParse(textBox.Text, out double _))
        {
            textBox.ForeColor = Color.Red;
            MessageBox.Show("Write just numbers.");
        }
        else
        {
            textBox.ForeColor = Color.Black;
        }
    }
}

public ConPanel()
{
    Size = new System.Drawing.Size(258, 300);
    Location = new System.Drawing.Point(12, 61);
    CustomTextBox ctb = CustomTextBox.Vent();
    AddTextBox(ctb);
}

public void AddTextBox(CustomTextBox ctb)
{
    List<System.Windows.Forms.TextBox> conTextB = ctb.TextBoxCon();
    foreach (System.Windows.Forms.TextBox textBox in conTextB)
    {
        Controls.Add(textBox);
    }
}
9w11ddsr

9w11ddsr1#

GetTextBoxCon()方法总是创建一组新的文本框。新文本框不包含文本。
在ConeCalculation()方法中,调用GetTextBoxCon()方法,将结果赋给局部临时变量txtBoxCon,然后使用这些新的空文本框。而不是你在面板中看到的原始文本框!这就是为什么在ConeCalculation()方法中得到0或NaN的原因。
要使用添加到表单中的真实的文本框,只需调用一次GetTextBoxCon()方法(可能在表单的构造函数中),将结果赋给表单/面板的成员变量(可能也称为txtBoxCon)。然后,您只需从ConeCalculation()中删除GetTextBoxCon()方法的调用即可。

相关问题