-1

在上一个问题中,我询问了主题标题错误消息,答案几乎是显而易见的。

然而,那个“归结”的例子来自一些没有被稀释的代码,现在我的新肉汤中再次出现了原来的问题。

我怀疑我可能会对很多‘有趣’的评论敞开心扉,但是嘿……没有愚蠢的问题,只有愚蠢的程序员!”

无论如何,这里是原始代码的一个稍微简化的版本:

public partial class Form1 : Form
{
    public static Form1 mForm = new Form1();


    // define textbox parameter structure
    struct ParmStruct
    {
        public TextBox sTextBoxName;
        public double dMinValue;
        public double dMaxValue;

        public ParmStruct(TextBox sTextBoxName, double dMinValue, double dMaxValue)
        {
            this.sTextBoxName = sTextBoxName;
            this.dMinValue = dMinValue;
            this.dMaxValue = dMaxValue;
        }
    }

    // Create list of Parameters (name, min, max)
    static ParmStruct[] ParmList = new ParmStruct[]
    {
        new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
        new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
    };

    public Form1()
    {
        InitializeComponent();

        this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        TextBox tb1;

        tb1 = mForm.textBox1;
        tb1 = textBox2;

        double x = ParmList[0].dMaxValue;
    }
}

ParmList 初始化的第二行(sTextBoxName = textBox2)不会编译,除非我做sTextBoxName = mForm.textBox2.

但是,该行将tb1 = textBox2编译,并且不需要 mForm。字首。

这是最初引起混乱的实际情况(就我而言,仍然如此)。

不太确定为什么编译器(VS 2010)可以在一种情况下解决它,而在另一种情况下却不能。

哦......并且代码在编译时确实有效。:)

4

2 回答 2

2

这是个问题。

// Create list of Parameters (name, min, max)
static ParmStruct[] ParmList = new ParmStruct[]
{
    new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
    new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
};

在 的所有实例之间共享此变量没有任何意义Form1(这是static关键字所做的),因为表单的每个实例都有自己唯一的textBox2. 此外,正如 Chris 建议的那样,简单地删除static关键字也不是解决办法。textBox2在它被创建之前你不能引用它,这发生在内部InitializeComponent(由Form1构造函数调用)。这会更好:

// list of Parameters (name, min, max)
ParmStruct[] ParmList;

public Form1()
{
    InitializeComponent();

    // now the textboxes exist and can be associated with the structure
    ParmList = new ParmStruct[] {
        new ParmStruct { sTextBoxName = textBox1, dMinValue = -99, dMaxValue = 99 },
        new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
    };

    this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 
}

在构造函数和textBox1_TextChanged方法中,您可以引用textBox1并且textBox2无需任何进一步的限定,编译器将找到属于该this对象的那些,就像您键入this.textBox1一样(例如,参见构造函数的最后一个类似)。编译器不会使用来自mForm. 事实上,静态mForm字段没有理由,因为没有代码可以显示它。

于 2012-05-22T23:37:57.017 回答
0

textBox2 是一个仅存在于 mForm 上下文中的对象,因此您必须将其限定为 mForm 的字段,因为它尚未在您的方法中声明或作为您的类中的 [静态] 对象。

于 2012-05-22T23:30:22.213 回答