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

问题描述:

好的。我有一个问题与下面的代码位:非静态字段,方法或属性需要对象引用

StreamReader arrComputer = new StreamReader(FileDialog.FileName); 

我的第一个问题已经回答已经现在我的第二个问题,重点介绍这些代码的尾部。

我读了用户使用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在列表中。

我使用的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' " 

我想我明白这个问题但我很难解决这个问题。

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

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

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

+0

优秀的解释。谢谢。我将其更改为StreamReader arrComputer = new StreamReader(textBox1.Text)并且工作正常。新手错误。 – Jim 2008-11-10 22:08:41

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

你不觉得你需要使用textBox1.Text吗?

StreamReader arrComputer = new StreamReader(textBox1.Text); 

尽量不要做这样的:

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

当你确定你的FileOpen对话框,你存储你的表格上所选择的文件名(通过设置textBox1.Text),所以你最好使用此存储的值而不是返回原来的FileOpen对话框。

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

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

StreamReader arrComputer = new StreamReader(textBox1.Text); 

button1_Click您定义的本地fileDialog变量,它消失在事件处理程序的结束。

buttonRun_Click中,您正在对类FileDialog使用类方法。

看来您需要在窗体级别(button1_Click外部)声明一个fileDialog变量并在两个事件处理程序中使用相同的变量。

做这个手表时为fileDialogFileDialog拼写。