对于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类创建一个方法来解决它,但是从那里访问图片框时遇到了问题。
答案 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_
后缀。没有必要,人们会争论整个晚会最好,但这就是我的喜好!