非静态字段,方法或属性需要对象引用

时间:2008-11-10 21:51:12

标签: c# .net visual-studio-2008

确定。我遇到了以下代码问题:

StreamReader arrComputer = new StreamReader(FileDialog.FileName);

我的第一个问题已经回答了,现在我的第二个问题集中在这段代码的尾端。

我正在阅读用户使用StreamReader

按钮事件选择的文本文件OpenFileDialog
private void button1_Click(object sender, EventArgs e)


        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.InitialDirectory = @"C:\";
            fileDialog.Filter = "Text|*.txt|All|*.*";
            if (fileDialog.ShowDialog() == DialogResult.OK) ;
            textBox1.Text = fileDialog.FileName;
            buttonRun.Enabled = true;
        }

在代码后面,用户将单击“运行”按钮,对列表中的每个项目执行一些代码。

我在使用StreamReader使用以下代码解析列表时遇到问题:

private void buttonRun_Click(object sender, EventArgs e)
        {
            StreamReader arrComputer = new StreamReader(FileDialog.FileName);

        }

这是我从编码中收到的错误:

"An object reference is required for the non-static field, method, or property 'System.Windows.Forms.FileDialog.FileName.get' "

我想我理解这个问题,但我很难解决它。

6 个答案:

答案 0 :(得分:4)

在我看来,就像你在button1_Click方法中创建一个新的OpenFileDialog对象,并在该局部变量fi​​leDialog中存储对该对象的唯一引用。

然后,在你的buttonRun_Click方法中,看起来你想从你在前一个方法中创建的对话框中获取文件名。但这不是你正在做的事情。编译器将您的代码解释为尝试读取FileDialog类的FileName属性,就像它是静态成员一样。您的代码中还有其他问题,但导致您引用的编译器错误的问题可能是FileDialog.FileName问题。

您的意思是从您在第一个方法中创建的OpenFileDialog实例中读取FileName属性,但该对象仅存储在本地变量中。在第一种方法之外,您无权访问它。但是,由于您还在文本框中存储了文件名,因此您可以从该文本框中读取文件名,因此您无需访问OpenFileDialog对象。

答案 1 :(得分:2)

你认为你不需要使用textBox1.Text吗?

 StreamReader arrComputer = new StreamReader(textBox1.Text);

答案 2 :(得分:2)

FileDialog是一个类名,您需要使用一个对象来访问FileName属性,因此会出错。我建议您使用fileDialog.FileName,但是当fileDialog方法退出时,您已经抛弃了button1_Click(注意小写的“f”)。

但是,在退出该方法之前,您已将文件名保存在textBox1.Text中,并且它仍然可用。尝试使用:

StreamReader arrComputer = new StreamReader(textBox1.Text); 

答案 3 :(得分:1)

尝试这样做:

private void buttonRun_Click(object sender, EventArgs e) {
    StreamReader arrComputer = new StreamReader(textBox1.Text);
}

当您确定FileOpen对话框时,您将在窗体上存储所选的文件名(通过设置textBox1.Text),因此最好使用此存储的值而不是返回原始的FileOpen对话框。

答案 4 :(得分:0)

FileDialog是您的控件的名称,还是控件的类型?我猜这是类型。将文件对话框拖到窗口中时,会得到一个名为FileDialog1的FileDialog。试试看,让我知道。

答案 5 :(得分:0)

button1_Click中,您定义了一个本地fileDialog变量,该变量在事件处理程序的末尾消失。

buttonRun_Click中,您在班级FileDialog上使用了一种类方法。

似乎你需要在表单级别(在button1_Click之外)声明一个fileDialog变量,并在两个事件处理程序中使用相同的变量。

执行此观察时,fileDialogFileDialog拼写。