访问由兄弟控件实例化的对象

时间:2015-01-20 19:17:36

标签: c# winforms class

对于C#和OOP来说还是新手我有一些范围和访问的新手问题,其中一个是这样的:当主表单加载类的实例时,Doc创建并且构造函数打开Word文档并创建文档中所有图像的列表。列表中的第一个图像显示在图片框中,如下所示:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    public class Doc {
        public List<Image> images = new List<Image>();
        public Doc(string path) {
            // Open Word document, create list of images
        }
    }

    private void Form1_Load(object sender, EventArgs e) {
        Doc doc = new Doc("C:\\lorem_ipsum.doc");
        pictureBox1.Image = doc.images[0];
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e) {
        pictureBox1.Image =  doc.images[numericUpDown1.Value];
    }
}

还有一个numericUpDown控件,用于显示不同的图像,以及问题出在哪里。上例中的最后一段代码不起作用,但我希望它能说明我想要做的事情。

这个问题的最佳实践解决方案是什么(以及一个控件应该能够访问其他控件创建的对象的类似问题)?我也尝试通过为Doc类创建一个方法来解决它,但是从那里访​​问图片框时遇到了问题。

3 个答案:

答案 0 :(得分:2)

您的问题是您创建了doc作为局部变量。您需要在类的范围内使用成员变量:

public partial class Form1 : Form {
    private Doc _doc; // Add this line

    public Form1() {
        InitializeComponent();
    }

    public class Doc {
        public List<Image> images = new List<Image>();
        public Doc(string path) {
            // Open Word document, create list of images
        }
    }

    private void Form1_Load(object sender, EventArgs e) {
        _doc = new Doc("C:\\lorem_ipsum.doc");
        pictureBox1.Image = _doc.images[0];
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e) {
        pictureBox1.Image =  _doc.images[numericUpDown1.Value];
    }
}

关于范围的一点

public class MyClass
{
    // myMemberVariable is declared inside class, but outside
    // a function. Therefore, it can be accessed from anywhere
    // inside the class.
    int myMemberVariable;

    public void MyFunction()
    {
        // myLocalVariable is declared inside a function. Therefore,
        // it can be accessed only inside this function and nowhere
        // else.
        int myLocalVariable;

        for (int x=0;x<10;x++)
        {
            // anotherLocalVariable is declared inside a for loop. Therefore,
            // this variable can only be used inside this for loop and
            // no where else.
            int anotherLocalVariable;
        }
    }
}

将大括号视为范围分隔符。您创建的变量只能在开始和结束括号内使用,而不能在外部使用。唯一的&#34;部分&#34;例外情况是static变量。

答案 1 :(得分:1)

只需将doc设为Form1的私有字段。

public partial class Form1 : Form {
    private Doc doc;

    public Form1() {
        InitializeComponent();
    }

    public class Doc {
        public List<Image> images = new List<Image>();
        public Doc(string path) {
            // Open Word document, create list of images
        }
    }

    private void Form1_Load(object sender, EventArgs e) {
        doc = new Doc("C:\\lorem_ipsum.doc");
        pictureBox1.Image = dok.images[0];
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e) {
        pictureBox1.Image =  doc.images[numericUpDown1.Value];
    }
}

答案 2 :(得分:1)

你所拥有的doc有一个局部变量,即它是Form1_Load的本地变量。这意味着它只存在于该方法中。你想要的是一个成员字段,在Form1类本身上定义。只要表格存在,这将坚持下去:

public partial class Form1 : Form
{
    private Doc m_Doc;

    ....

    private void Form1_Load(object sender, EventArgs e)
    {
        m_Doc = new Doc("C:\\lorem_ipsum.doc");
        pictureBox1.Image = m_Doc.images[0];
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        pictureBox1.Image = m_Doc.images[numericUpDown1.Value];
    }
}

现在m_Doc可以被类中的任何东西访问(也可以访问嵌套类),但是没有别的,因为它是private

我还选择添加m_后缀。没有必要,人们会争论整个晚会最好,但这就是我的喜好!