Je suis novice dans la fonction OpenFileDialog, mais je connais les bases. Ce que je dois faire, c'est ouvrir un fichier texte, lire les données à partir du fichier (texte uniquement) et les placer correctement dans des zones de texte distinctes dans mon application. Voici ce que j'ai dans mon gestionnaire d'événement "open file":
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(theDialog.FileName.ToString());
}
}
Le fichier texte que j'ai besoin de lire est le suivant (pour les devoirs, je dois lire ce fichier exact). Il comporte un numéro d'employé, son nom, son adresse, son salaire et les heures travaillées:
1
John Merryweather
123 West Main Street
5.00 30
Dans le fichier texte que j'ai reçu, il y a 4 autres employés avec des informations immédiatement après, dans le même format. Vous pouvez voir que le salaire et les heures des employés sont sur la même ligne, pas une faute de frappe.
J'ai une classe d'employés ici:
public class Employee
{
//get and set properties for each
public int EmployeeNum { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public double Wage { get; set; }
public double Hours { get; set; }
public void employeeConst() //constructor method
{
EmployeeNum = 0;
Name = "";
Address = "";
Wage = 0.0;
Hours = 0.0;
}
//Method prologue
//calculates employee earnings
//parameters: 2 doubles, hours and wages
//returns: a double, the calculated salary
public static double calcSalary(double h, double w)
{
int OT = 40;
double timeandahalf = 1.5;
double FED = .20;
double STATE = .075;
double OThours = 0;
double OTwage = 0;
double OTpay = 0;
double gross = 0; ;
double net = 0;
double net1 = 0;
double net2 = 0;
if (h > OT)
{
OThours = h - OT;
OTwage = w * timeandahalf;
OTpay = OThours * OTwage;
gross = w * h;
net = gross + OTpay;
}
else
{
net = w * h;
}
net1 = net * FED; //the net after federal taxes
net2 = net * STATE; // the net after state taxes
net = net - (net1 + net2);
return net; //total net
}
}
Je dois donc extraire le texte de ce fichier dans ma classe Employé, puis exporter les données dans la zone de texte appropriée dans l'application Windows Forms. J'ai du mal à comprendre comment bien faire les choses. Dois-je utiliser un lecteur de flux? Ou y a-t-il une autre meilleure façon dans ce cas? Merci.
Voici un moyen:
Stream myStream = null;
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
try
{
if ((myStream = theDialog.OpenFile()) != null)
{
using (myStream)
{
// Insert code to read the stream here.
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
Modifié à partir d'ici: MSDN OpenFileDialog.OpenFile
[~ # ~] edit [~ # ~] Voici une autre façon plus adaptée à vos besoins:
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
string filename = theDialog.FileName;
string[] filelines = File.ReadAllLines(filename);
List<Employee> employeeList = new List<Employee>();
int linesPerEmployee = 4;
int currEmployeeLine = 0;
//parse line by line into instance of employee class
Employee employee = new Employee();
for (int a = 0; a < filelines.Length; a++)
{
//check if to move to next employee
if (a != 0 && a % linesPerEmployee == 0)
{
employeeList.Add(employee);
employee = new Employee();
currEmployeeLine = 1;
}
else
{
currEmployeeLine++;
}
switch (currEmployeeLine)
{
case 1:
employee.EmployeeNum = Convert.ToInt32(filelines[a].Trim());
break;
case 2:
employee.Name = filelines[a].Trim();
break;
case 3:
employee.Address = filelines[a].Trim();
break;
case 4:
string[] splitLines = filelines[a].Split(' ');
employee.Wage = Convert.ToDouble(splitLines[0].Trim());
employee.Hours = Convert.ToDouble(splitLines[1].Trim());
break;
}
}
//Test to see if it works
foreach (Employee emp in employeeList)
{
MessageBox.Show(emp.EmployeeNum + Environment.NewLine +
emp.Name + Environment.NewLine +
emp.Address + Environment.NewLine +
emp.Wage + Environment.NewLine +
emp.Hours + Environment.NewLine);
}
}
}
using System.IO;
ce code suivant contient 2 méthodes de lecture du texte, la première lit les lignes simples et les stocke dans une variable chaîne, la seconde lit le texte en entier et l’enregistre dans une variable chaîne (y compris "\ n" (entre))
les deux devraient être assez faciles à comprendre et à utiliser.
string pathToFile = "";//to save the location of the selected object
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog theDialog = new OpenFileDialog();
theDialog.Title = "Open Text File";
theDialog.Filter = "TXT files|*.txt";
theDialog.InitialDirectory = @"C:\";
if (theDialog.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(theDialog.FileName.ToString());
pathToFile = theDialog.FileName;//doesn't need .tostring because .filename returns a string// saves the location of the selected object
}
if (File.Exists(pathToFile))// only executes if the file at pathtofile exists//you need to add the using System.IO reference at the top of te code to use this
{
//method1
string firstLine = File.ReadAllLines(pathToFile).Skip(0).Take(1).First();//selects first line of the file
string secondLine = File.ReadAllLines(pathToFile).Skip(1).Take(1).First();
//method2
string text = "";
using(StreamReader sr =new StreamReader(pathToFile))
{
text = sr.ReadToEnd();//all text wil be saved in text enters are also saved
}
}
}
Pour diviser le texte, vous pouvez utiliser .Split ("") et utiliser une boucle pour replacer le nom dans une chaîne. si vous ne voulez pas utiliser .Split (), vous pouvez également utiliser foreach et ad une instruction if pour le scinder si nécessaire.
pour ajouter les données à votre classe, vous pouvez utiliser le constructeur pour ajouter les données comme:
public Employee(int EMPLOYEENUM, string NAME, string ADRESS, double WAGE, double HOURS)
{
EmployeeNum = EMPLOYEENUM;
Name = NAME;
Address = ADRESS;
Wage = WAGE;
Hours = HOURS;
}
ou vous pouvez l'ajouter à l'aide de l'ensemble en tapant. nom_variable après le nom de l'instance (si elles sont publiques et si elles ont un ensemble, cela fonctionnera). pour lire les données, vous pouvez utiliser get en tapant .variablename après le nom de l’instance (s’ils sont publics et qu’ils obtiennent un get, cela fonctionnera).