1

这是我的代码:

namespace Class_Properties {
    public partial class Form1 : Form {
        private string firstHeight1 = "";
        public int firstHeight {
            get {
                        return Convert.ToInt32( firstHeight1 );
            }
        }

        public Form1() {
            InitializeComponent();
        }

        private void button1_Click( object sender, EventArgs e ) {
            firstHeight1 = textBox2.Text;

            Form2 secondForm = new Form2();
            secondForm.Show();
        }
    }
}

然后是另一个类:

namespace Class_Properties {
    public partial class Form2 : Form {
        public Form2() {
            InitializeComponent();
            Form1 mainWindow = new Form1();
            this.Height = mainWindow.firstHeight;
        }
    }
}

当我运行时,我键入200textbox2并单击button1,然后 Visual Studio 会出现以下异常:

在此处输入图像描述

我能做些什么来解决这个错误?

4

6 回答 6

1

这是失败:

        InitializeComponent();
        Form1 mainWindow = new Form1();
        this.Height = mainWindow.firstHeight;  //<--

无论您在 other 上做了什么Form1,它都不会出现在这个中,因为它是一个新实例,因此firstHeight == string.Empty解析失败。

您必须将现有的 Form1 发送到 Form2:

public Form2(Form1 parent)
{
    this.Height = parent.firstHeight;
}

// called like so from Form1:
var form2 = new Form2(this);

虽然不可否认,最好只发送您需要的内容:

public Form2(int desiredHeight)
{
    this.Height = desiredHeight;
}

// called like so from Form1:
var form2 = new Form2(this.firstHeight);
于 2012-10-02T18:46:45.993 回答
0

Form2你说:

Form1 mainWindow = new Form1();
this.Height = mainWindow.firstHeight;

您没有访问Form1之前使用的内容,而是创建了一个带有空文本框值的全新内容。

您应该做的是在创建时将高度值传递给第二种形式:

public Form2(int height) 
{
   // use height here
}

并在按钮中单击:

Form2 secondForm = new Form2(firstHeight);
secondForm.Show();
于 2012-10-02T18:46:37.637 回答
0

你可以做这样的事情。

public int? FirstHeight
{
    get
    {
        int? returnValue = null;

        int temp;
        if (int.TryParse(textBox2.Text, out temp))
        {
            returnValue = temp;
        }

        return returnValue;
    }
}

然后,您只需在需要该值时调用该FirstHeight属性:

if (FirstHeight.HasValue)
{
    // Access the int value like so:
    int height = FirstHeight.Value;
}

如果你不想使用 Nullable 类型,你可以这样做:

public int FirstHeight
{
    get
    {
        int returnValue; // Or some other default value you can check against.

        if (!int.TryParse(textBox2.Text, out returnValue))
        {
            // If the call goes in here, the text from the input is not convertable to an int.
            // returnValue should be set to 0 when int.TryParse fails.
        }

        return returnValue;
    }
}
于 2012-10-02T18:46:40.973 回答
0

抛出异常时 firstHeight1 的值是多少?

您可能想查看 int.TryParse() 代替:

int output = 0;
int.TryParse(firstHeight1, out output);
return output;

如果它无法解析该值,则不会设置output,而不是引发异常。

有关 int.TryParse 的更多信息:http: //msdn.microsoft.com/en-us/library/f02979c7.aspx

编辑:问题是您正在重新实例化 Form1,并且该值从未在 Form2 的 Form1 的新实例中设置。您应该将 Form2 中的属性设置为该值。

class Form2
{
    public int FirstHeight { get; set; }
}

...

Form2 form2 = new Form2();
form2.FirstHeight = this.FirstHeight;
form2.Show();
于 2012-10-02T18:43:37.020 回答
0

由于您的firstHeight1is并且在类型String.Empty中找不到空字符串的等效项 。Int因此错误..

在您的 Form2 实例中,该值仍然是String.Empty. 首先将其设置为某个值。

于 2012-10-02T18:45:06.917 回答
0

你的代码看起来像

public int FirstHeight
 {
   get
     {
      double Num;
      bool isNum = double.TryParse(firstheight1, out Num);
      if (isNum)
     {
       return firstheight1;
      }
    else
    {
     return 0; or 
     your message goes here 
    }

} }

于 2012-10-02T18:50:00.847 回答