My goal with my small Console Application is to read from a CSV file and save it's contents inside a List (which works). I have a separate class with this method. See the uncommented section in UserList.cs:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Globalization;
using System.Linq;
using CsvHelper;
namespace GimpiesConsoleOOcsvListUI
{
public class UserList
{
// public static List<User> DefaultUsers()
// {
// // First line to skip a row and position all users correctly under the right headers
// User user0 = new User("", "", "", "");
// // Create user default instances
// User user1 = new User("Beheer", "beheer@gimpies.nl", "123", "admin");
// User user2 = new User("Inkoop", "inkoop@gimpies.nl", "123", "purchase");
// User user3 = new User("Verkoop", "verkoop@gimpies.nl", "123", "sales");
// // List of users (with a list you can add, get and remove items in the list)
// List<User> users = new List<User>();
// users.Add(user0);
// users.Add(user1);
// users.Add(user2);
// users.Add(user3);
// // Return all the users in the List to other classes
// return users;
// }
public void LoadUsersFromCSV(List<User> users)
{
// using (var mem = new MemoryStream())
// using (var writer = new StreamWriter(mem))
using (var reader = new StreamReader("users.csv"))
using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture))
{
try
{
csvReader.Configuration.Delimiter = ";";
csvReader.Configuration.IgnoreBlankLines = true;
csvReader.Configuration.HasHeaderRecord = true;
csvReader.Configuration.PrepareHeaderForMatch = (string header, int index) => header.ToLower();
csvReader.Configuration.MissingFieldFound = null;
csvReader.Read();
csvReader.ReadHeader();
// Store all content inside a new List as objetcs
var usersfromcsv = csvReader.GetRecords<User>().ToList();
// return users;
}
catch (CsvHelper.HeaderValidationException exception)
{
Console.WriteLine(exception);
}
}
}
}
}
In my Program.cs I want to call this method and use the contents of that created List to use the login code. So to check if the username and password are typed correctly and users can log in.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Globalization;
using System.Linq;
using CsvHelper;
namespace GimpiesConsoleOOcsvListUI
{
class Program
{
static void Main(string[] args)
{
// List of default users
// List<User> users = UserList.DefaultUsers();
// Working on it... Try to read csv file first and try to read list from method in UserList.cs
// UserList ul = new UserList();
List<User> users = UserList.LoadUsersFromCSV();
// List<User> users =
// ul.LoadUsersFromCSV(users);
// Create login instance
LoginManager loginMgr = new LoginManager();
// Create stock instance
Stock stock = new Stock();
Start:
// Welcome message
Console.WriteLine("Welcome to the Gimpies Console Application! Choose 1 to login or 2 to exit this application:");
// Get input from user
string input = Console.ReadLine();
// Set to false to check if login fails or not
bool successfull = false;
while (!successfull)
{
if(input == "1")
{
Console.WriteLine("Enter your username:");
string username = Console.ReadLine();
Console.WriteLine("Enter your password:");
string password = Console.ReadLine();
foreach (User user in users)
{
if (username == user.username && password == user.password && user.userrole == "admin")
{
// Create Admin instance to be able to call methods in that class
Admin am = new Admin();
// Calling the method in Admin.cs to start Menu logic
am.AdminLoggedIn(users);
successfull = true;
break;
}
if (username == user.username && password == user.password && user.userrole == "purchase")
{
// Create Purchase instance to be able to call methods in that class
Purchase pc = new Purchase();
// Calling the method in Purchase.cs to start Menu logic
pc.PurchaseLoggedIn(users);
successfull = true;
break;
}
if (username == user.username && password == user.password && user.userrole == "sales")
{
// Create Sales instance to be able to call methods in that class
Sales sl = new Sales();
// Calling the method in Sales.cs to start Menu logic
sl.SalesLoggedIn(users);
successfull = true;
break;
}
}
if (!successfull)
{
Console.WriteLine("Your username or password is incorrect, try again !!!");
}
}
else if (input == "2")
{
Environment.Exit(-1);
}
else if (input == "3")
{
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.WriteUsersToCSV(users);
goto Start;
}
else if (input == "4")
{
FileOperations fo = new FileOperations();
// Calling the method from FileOperations.cs to write the List here to a CSV file
fo.ReadUsersFromCSV(users);
goto Start;
}
else
{
Console.WriteLine("Try again !!!");
break;
}
}
// // Loop over stored users within instances inside the list where users are added
// foreach (User user in users)
// {
// if(loginMgr.Login(user))
// {
// // Login successfull
// Console.WriteLine("Login user " + user.UserName);
// }
// else
// {
// // Not successfull
// }
// }
}
}
}
I'm getting this error:
Program.cs(20,41): error CS7036: There is no argument given that corresponds to the required formal parameter 'users' of 'UserList.LoadUsersFromCSV(List<User>)' [/home/pascalmariany/Projects/Csharp/GimpiesConsoleOOcsvList/GimpiesConsoleOOcsvListUI/GimpiesConsoleOOcsvListUI.csproj]
This is my User.cs with it's constructor:
namespace GimpiesConsoleOOcsvListUI
{
public class User
{
// Constructor
public User(string username, string email, string password, string userrole)
{
_UserName = username;
_Email = email;
_Password = password;
_UserRole = userrole;
}
private string _UserName;
private string _Email;
private string _Password;
private string _UserRole;
public string username
{
get { return _UserName; }
set { _UserName = value; }
}
public string email
{
get { return _Email; }
set { _Email = value; }
}
public string password
{
get { return _Password; }
set { _Password = value; }
}
public string userrole
{
get { return _UserRole; }
set { _UserRole = value; }
}
}
}
What do I need to change to reach my goal?
Youve declared your LoadUsersFromCsv method as "takes a list":
public void LoadUsersFromCSV(List<User> users)
but you're trying to use it like "takes nothing and returns a list"
List<User> users = UserList.LoadUsersFromCSV();
The compiler is complaining because you didn't supply a List in the "users" parameter
Looking at the code, it reads the file in and turns it into a list but doesn't return it and it doesn't fill the list it was given either..
I'd suggest you change the LoadUsers method so it returns the list it reads, change it from void to List<User>
and remove the users parameter