I had a Winforms App with a propertyGrid to let the user edit his settings.
How to achieve the same goal whithin a Console Application?
ANSWER
Thanks to those who answered.
Here is a synthetic code based on a few answers :
Console.WriteLine("Choose user settings to setup");
Console.WriteLine("User setting1: press 1");
Console.WriteLine("User setting2: press 2");
string line = Console.ReadLine();
int code = int.Parse(line);
swicth(code)
{
case 1:
Settings.Default.MyProperty = line ;
Settings.Default.Save();
break;
case 2:
...
}
Settings.Default.MyProperty1 = "some value";
Settings.Default.MyProperty2 = 2;
Settings.Default.Save();
You should prompt the user about user settings. Something like this:
Console.WriteLine("Choose user settings to setup");
Console.WriteLine("User setting1: press 1");
Console.WriteLine("User setting2: press 2");
....
...
string line = Console.ReadLine();
int code = int.Parse(line);
swicth(code)
{
case 1:
....
.....
case 2:
}
After save changes in XML file.
If it's not you're asking for, please clarify.
Console applications does not have an User Interface, by definition (though you can force display of Windows Forms). You need to rethink your solution. Maybe you want to use app.config (XYZ.exe.config) or a separate configuration file. BTW, you can edit application settings file from code.
Related
Is there any way to detect when a file is opened with a c# application
Example
When I right-click on a file then select to open it with My Application I want this code to run
File.WriteLines(OpenWithFile)
Is this achievable
Yes, it's achievable. When a user clicks Open With in Windows Explorer, the operating system includes the filename as the first argument. Below is a demo how you'd get the file name that the user clicked to open with your application. You can than implement whatever processing you wish.
class Program
{
static void Main(string[] args)
{
if (args.Length > 0)
{
var OpenWithFile = args[0];
Console.WriteLine($"The OpenWithFile is: {OpenWithFile}");
}
else
{
Console.WriteLine("No command-line arguments were passed.");
}
Console.WriteLine("Press any key to continue.");
Console.ReadLine();
}
}
We have an application (C#) that up till today has worked fine.
It communicates with a laravel website to manage the sites data.
So there are some validation points that occur, the application does checks with out SSO provider for authentication. Then it passes some of the user's information over to the site so the site can create a user / send back user id for further entry points.
I have literally not touched this in months - and its been working without a problem.
Today I get a message its not working and so I start digging.
Can somebody explain THIS one?
C# Code For Validating User - Notice the response from the site.
The Laravel API Routes File on the route in question.
public function validation(Request $request) {
//Check if user exists if they do then just return. If they dont we need to create them in the system.
$user = User::where('email', $request['Email'])->first();
if($user == null) {
$nuser = new User();
$nuser->first_name = $request['FName'];
$nuser->last_name = $request['LName'];
$nuser->email = $request['Email'];
$nuser->token = $request['Token'];
switch($request['Role']) {
case 1:
$nuser->user_level = 1;
break;
case 2:
$nuser->user_level = 2;
break;
case 3:
$nuser->user_level = 3;
break;
case 4:
$nuser->user_level = 4;
break;
default:
$nuser->user_level = 4;
break;
}
try {
$nuser->save();
return json_encode($nuser);
}catch(\Exception $e) {
Log::error($e->getMessage());
}
}else{
switch($request['Role']) {
case 1:
$user->user_level = 1;
break;
case 2:
$user->user_level = 2;
break;
case 3:
$user->user_level = 3;
break;
case 4:
$user->user_level = 4;
break;
default:
$user->user_level = 4;
break;
}
try {
$user->save();
return json_encode($user);
}catch(\Exception $e) {
Log::error($e->getMessage());
}
}
}
So the end user of the C# application decided to overwrite the ini file with the website in it (for quick swaps between dev and production for the development team)....I noticed new entries in the development server's database from yesterday....end user then tries to put it back to the production server. But left off the s in https - and like any good website - it auto redirects to its https counterpart.
Cue RestClient trying to follow the redirect with a GET.
Updated the INI fixing the typo, tell user to close the application and reopen it to reload the INI data. Have our network team lock down the network folder containing the INI to read only unless its a member of the development team. And we're back rolling.
The below is what I am wrestling with today using Visual Studios Console App.
What I want to happen, which currently isn't, is when the Console App opens, and I type the first "checksPath" in, if this turns out to not exist, I want it to say that the path is wrong, and either, let the user try again, or close the app. If the path is valid, then it moves onto the next "reportDest", and the same applies. If it's an invalid path, I want a message saying so, with the option of trying again, or closing the app. If both paths entered (eventually) are valid, I want a message to say that the report will now produce. The rest of the script that produces the report is perfectly fine, it's just the bit i've put below that's troublesome.
string checksPath;
Console.Write("Please enter the source path for the Checks Workbook, including the name of the file (Not including the file extension): ");
checksPath = Console.ReadLine() + ".xlsx";
try
{
if (File.Exists("checksPath"))
throw new FileNotFoundException();
}
catch (FileNotFoundException e)
{
Console.WriteLine("Invalid path - Please close the app and try again!");
Console.ReadLine();
}
string reportDest;
Console.Write("Please enter the folder location and file you wish your report to go to (Not including the file extension): ");
reportDest = Console.ReadLine() + ".xlsx";
try
{
if (File.Exists("reportDest"))
throw new FileNotFoundException();
}
catch (FileNotFoundException e)
{
Console.WriteLine("Invalid path - Please close the app and try again!");
Console.ReadLine();
}
Console.WriteLine("Your report will now produce");
Since you need to continually ask a question until the user gets it right, you will need a loop. Next in that loop you need to check if the path exists.
bool run = true;
while (run)
{
Console.Clear();
Console.WriteLine("Enter Path:");
string answer = Console.ReadLine();
if (Directory.Exists(answer)) run = false;
else
{
Console.WriteLine("Path Does not exists. Try again. Press enter to continue...");
Console.ReadLine();
}
}
I have a little utility I'm writing that will let the user replace 1 character for another in a filename from a specific directory the user chooses.
The idea is to let the user replace an "_" or any other character they want with any other character they want or just remove it altogether.
EDIT: After taking the information I learned from your responses and a little Google searching to understand how those commands worked, I came up with this code. Any feedback would be nice.
private static void myremovechar()
{
//subprocedure to modify file names by removing or replacing characters NO SUB DIRECTORIES
//Ask user where the files are located and store value in string mybadfilesource
Console.Clear();
Console.WriteLine("Where are your files located");
Console.WriteLine(#"Example: D:\folder\subfolder\");
string mybadfilesource = Console.ReadLine();
//Ask user what character to remove and store value in string mychartodelete
Console.WriteLine("What character do you want to remove");
Console.WriteLine("Only 1 Character allowed");
string mychartodelete = Console.ReadLine();
//Ask user what character to replace mychartodelete with and store value in string mychartoreplace
//if user just hits enter, mychartodelete will just be deleted
Console.WriteLine("What character do you want to replace it with");
Console.WriteLine("Press enter to just delete previously selected Character");
Console.WriteLine("Only 1 Character allowed");
string mychartoreplace = Console.ReadLine();
try
{
//store list of files from mybadfilesource in var filelist
var filelist = Directory.EnumerateFiles(mybadfilesource);
foreach (string file in filelist)
{
//renames the files by Replacing mychartodelete with mychartoreplace
var newfile = string.Format("{0}{1}",Path.GetFileNameWithoutExtension(file).Replace(mychartodelete, mychartoreplace),Path.GetExtension(file));
File.Move(file, Path.Combine(mybadfilesource, newfile));
}
}
//Error Checking Process - Prints error message
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//tell user the process is done and return to Main Menu
Console.WriteLine("Finished - Press Enter to Return to Main Menu");
Console.ReadLine();
Console.Clear();
Main();
}
Thank you all for your help
There's a lot of wrong here:
You're calling Replace on the wrong variable
If you use the right variable, you'll still get an error for modifying a variable in a foreach loop
You're not really renaming anything, you're not applying anything back to the actual file.
try this:
foreach (var file in Directory.EnumerateFiles(mybadfilesource))
{
var newfile = string.Format("{0}{1}",
Path.GetFileNameWithoutExtension(file).Replace(mychartodelete, mychartoreplace),
Path.GetExtension(file));
File.Move(file, Path.Combine(mybadfilesource, newfile));
}
Be sure to just get the filename without the path or extension, or else you'd be changing those too
I am writing a console application and I need to know, how to write in current line with shift of lines. I try to explain this on the next example:
Let It console lines with their numbers and contents along with cursor position.
Hello!
This is my command shell.
Please write something: _
When I call my method for writing in console text "lalala", i want to see that:
Hello!
This is my command shell.
lalala
Please write something: _
If I use Console.WriteLine method I see the next:
Hello!
This is my command shell.
Please write something: lalala
_
Please, help me to realise this feature.
Console.SetCursorPosition is the poison you are look for.
More details on http://msdn.microsoft.com/en-us/library/system.console.setcursorposition.aspx
As you didn't provide any code i assume you're using Console.WriteLine("Please write something"); to print out text. Since this will add an \n to the text you want to print you should rather use Console.Write("Please write something") then do an Console.ReadLine(); to get the input and handle the \n by yourself.
Console.WriteLine("1.Hello!");
Console.WriteLine("2.This is my command shell.");
Console.WriteLine("3.lalala");
Console.Write("4.Please write something:");
Console.Read();
If I understand your question right I think you need to use
Console.Write("text");
This will write on the same line as the cursor is currently on.
Rather than:
Console.WriteLine("text");
This will create a new line in the console each time it is called.
Please find the code for the above scenario:
private static void ReadAndWriteToConsole()
{
var mystrings = new List<string>();
mystrings.Add("Hello!");
mystrings.Add("This is my command shell.");
var input = WriteToConsole(mystrings);
while (input.ToLower() != "exit")
{
mystrings.Add(input);
Console.Clear();
input = WriteToConsole(mystrings);
}
}
private static string WriteToConsole(IEnumerable<string> variables )
{
foreach (var str in variables)
{
Console.WriteLine(str);
}
Console.Write("Please write something:");
return Console.ReadLine();
}
Hope that helps.
NOTE: If you want the number of each string then use a for loop instead of foreach and just print the variable used in the console.writeline.
try something like this
Console.Write("Hello\nThis is My Command Shell\nlalala\nPlease Enter Something:___");
if course that would end up having them all appear at the same time, but if your good with that this will work
Will look like this
I realize that this is an old question, however I have been searching this stuff and here is how it can be coded:
Console.WriteLine("Hello!");
Console.WriteLine("This is my command shell.");
string text = "";
string toWrite = "Please write something: ";
while (text != "quit")
{
Console.Write(toWrite);
text = Console.ReadLine();
Console.SetCursorPosition(0, Console.CursorTop - 1);
Console.WriteLine(text.PadRight(text.Length + toWrite.Length));
}
The Console.SetCursorPosition puts the cursor back to the line that was written into, then overwrite what is written with the text and a padding equivalent to how many chars the text had.