2008-11-10 7 views
0

Ok. Je vais avoir un problème avec le bit de code suivant:Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique

StreamReader arrComputer = new StreamReader(FileDialog.FileName); 

Ma première question avait déjà répondu maintenant ma deuxième question porte sur la fin de la queue de ce code.

Je lis un fichier texte StreamReader que l'utilisateur sélectionne un événement en utilisant le bouton 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; 
     } 

Le plus tard dans le code l'utilisateur cliquer sur un bouton « Exécuter » pour exécuter du code sur chaque élément dans la liste.

Je vais avoir des problèmes en utilisant StreamReader pour analyser la liste en utilisant le code suivant:

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

     } 

Ceci est l'erreur que je reçois de mon codage:

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

Je pense que je comprends le problème mais j'ai du mal à le faire.

Répondre

4

On dirait que vous créez un nouvel objet OpenFileDialog dans votre méthode button1_Click et que vous stockez la seule référence à cet objet dans une variable locale, fileDialog. Ensuite, dans votre méthode buttonRun_Click, il semble que vous vouliez obtenir le nom du fichier à partir de la boîte de dialogue que vous avez créée dans la méthode précédente. Ce n'est pas ce que vous faites, cependant. Le compilateur interprète votre code comme une tentative de lecture de la propriété FileName de la classe FileDialog comme s'il s'agissait d'un membre statique. Il existe d'autres problèmes dans votre code, mais le problème à l'origine de l'erreur du compilateur que vous avez cité est probablement le problème FileDialog.FileName.

Vous voulez lire la propriété FileName de l'instance OpenFileDialog que vous avez créée dans la première méthode, mais cet objet est uniquement stocké dans une variable locale. Vous n'y avez pas accès en dehors de cette première méthode. Mais puisque vous avez également stocké le nom de fichier dans la zone de texte, vous pouvez lire le nom de fichier hors de cette zone de texte, vous n'avez donc pas besoin d'accéder à l'objet OpenFileDialog.

+0

Excellente explication. Je vous remercie. Je l'ai changé en StreamReader arrComputer = new StreamReader (textBox1.Text) et cela a fonctionné. Erreur de débutant. – Jim

+0

Pas exactement une erreur de débutant, juste une fois que vous l'avez fait avant, vous le réparer avant que tout le monde remarque :) – Nat

0

Est-ce que FileDialog est le nom de votre contrôle ou le type de contrôle? Je suppose que c'est le type. Lorsque vous faites glisser une boîte de dialogue de fichier dans votre fenêtre, vous obtenez un FileDialog nommé FileDialog1. Essayez cela et faites le moi savoir.

2

Vous ne pensez pas que vous devez utiliser textBox1.Text?

StreamReader arrComputer = new StreamReader(textBox1.Text); 
1

Essayez de faire ceci:

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

Lorsque vous OK votre boîte de dialogue FileOpen, vous stockez le nom du fichier choisi sur votre formulaire (en définissant textBox1.Text), de sorte que vous êtes mieux utiliser cette valeur stockée au lieu de renvoyer à la boîte de dialogue FileOpen d'origine.

2

FileDialog est un nom de classe et vous devez utiliser un objet pour accéder à la propriété FileName, d'où l'erreur. Je recommande d'utiliser fileDialog.FileName, mais vous avez déjà jeté votre fileDialog (notez le «f» minuscule) lorsque la méthode button1_Click a quitté.

Toutefois, vous avez enregistré le nom de fichier dans textBox1.Text avant que cette méthode ne soit terminée et il doit toujours être disponible. Essayez d'utiliser que:

StreamReader arrComputer = new StreamReader(textBox1.Text); 
0

Dans button1_Click vous avez défini une variable locale fileDialog qui disparaît à la fin du gestionnaire d'événements.

En buttonRun_Click vous utilisez une méthode de classe sur la classe FileDialog.

Il semble que vous deviez déclarer une variable fileDialog au niveau du formulaire (en dehors de button1_Click) et utiliser la même variable dans les deux gestionnaires d'événements. Pour ce faire, veillez aux graphismes fileDialog et FileDialog.

Questions connexes