|
The AppSettings indexer returns a string . The code will compile, but will throw an InvalidCastException at runtime.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
50-50 chance. There are some value-object pair settings out there (UWP: ApplicationDataContainer)
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
|
If you want to get picky, AppSettings is based on a NameObjectCollectionBase.
Not my fault it's protected. But I won't whine about it.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
int completedDays;
int.TryParse(ConfigurationManager.AppSettings["CompletedDays"], out completedDays);
return DateTime.Today.AddDays(completedDays).ToString("yyyy-MM-dd"); Int32.TryParse Method (System) | Microsoft Docs[^]
If the setting isn't a valid integer, completedDays will be set to 0 . If you want to validate that the setting is valid, check the return value of TryParse .
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
A much better way of doing things Richard - I often overlook TryParse and default to using one of the ConvertToxxx static methods
"I didn't mention the bats - he'd see them soon enough" - Hunter S Thompson - RIP
|
|
|
|
|
Hello
My first post on here, would really appreciate some help.
I'm programming in C# (Visual Studio .NET Forms).
My form has 9 labels and i'm trying to change the visibility properties of all the labels in a loop instead of changing them individually.
For example :
label1.Visibility = true;
label2.Visibility = true;
label3.Visibility = true;
label4.Visibility = true;
label5.Visibility = true;
label6.Visibility = true;
label7.Visibility = true;
label8.Visibility = true;
label9.Visibility = true;
Instead of using the above laborious method, use some kind of for loop instead to select the labels number to make the changes, is this possible?
Many thanks
Ron
|
|
|
|
|
A common trick to solve this type of problem is to loop over all of the controls in your form. If you are able to cast the control to a Label, set the visibility then. Don't forget to take into account that the code you write to loop over the controls has to take into account that some of the controls on your form might have children and there may be labels in those children.
|
|
|
|
|
Hi Pete
Thanks for your input.
That's what i'm trying to do, loop over all the controls but it's making the loop that i'm having difficulty with.
I see someone has just left me some example code so will check that out now, perhaps it's what i need.
Cheers
Ron
|
|
|
|
|
There are several ways: the messiest is to scan the Forms Controls collection:
foreach (Control c in Controls)
{
if (c is Label lab)
{
lab.Visible = true;
}
}
It's messy for two reasons:
1) If any of the labels are within a container (e.g. a Panel) then you need to recurse through all container Controls collection as well.
2) If there are any labels you didn't want to hide, you have to "tag" them somehow to prevent you affecting them.
A neater solution is to construct an array or List of the labels you want to work with, and use that instead of the Form Controls collection. It's a little work to set up, but it's more specific and easier to code.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
but to de-messy it :
he could check the Label-Name if it corresponds to those Labels he wants to work with.
|
|
|
|
|
That's nasty as well, particularly once he realizes that sticking to VS default names for everything is a really bad idea ...
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
LOL! the default names seem fine to me, no problems yet and been using it for years.
Every so often you need to do something unusual and this is one of those cases.
I'm soon to work on a program with 256 labels to display register values from a chip so need to create another loop program to run through and update all the values in both hex & binary.
If i change the label names to say result1, result2, result3.
Could i use an alternative loop method to select the label name seeing they have digits at the end?
|
|
|
|
|
Do yourself a favour, and stop using Visual Studio default names for everything - you may remember that "TextBox8" is the mobile number today, but when you have to modify it in three weeks time, will you then? Use descriptive names - "tbMobileNo" for example - and your code becomes easier to read, more self documenting, easier to maintain - and surprisingly quicker to code because Intellisense can get to to "tbMobile" in three keystrokes, where "TextBox8" takes thinking about and 8 keystrokes...
plan for maintenance: it will happen, and your memory of what is what will fade. Using descriptive names means that you can pick it back up faster in a few months time!
And 256 labels? Oh dear.
Use a DataTable instead, and set that as the DataSource for a table-based control (DataGridView) instead. It's a lot tidier, and much, much easier to work with (and layout neatly with scroll bars as required, and so forth)
It's also a lot easier on the user as well - you can provide search facilities very easily so they can find which register they are interested in much more quickly!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi Griff
Sound advice, thank you.
I'm being lazy Griff, I normally program Microcontrolles and always choose descriptive names for registers so i should really be more descriptive with Visual Studio names.
Yer i know, 256 labels, lol, i'm a glutton for punishment that's for sure.
I've only just changed them to text boxes as they look pretty smart all laid out.
I'll check the Data Table you mentioned, never had to use one before so will take a look in a moment.
VS has so many smart tools, i've only every used 25% of them over the years.
Thanks again for your help.
Ron
|
|
|
|
|
Hi Griff
Ahhhhhh, that rings a bell now, thanks for the example.
Brain needed a gentle nudge, been a while since i did it.
Thanks for replying so quickly and for the advice.
Cheers
Ron
|
|
|
|
|
You're welcome!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi Griff
The code worked a treat, thank you.
I just adjusted it to work with my text boxes instead of labels and hey presto.
Hopefully this info will help another poor soul in the future.
Many thanks
Ron
|
|
|
|
|
You're welcome!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
And if you're really lucky there is an extremely simple approach that takes only a single line of code:
let's assume you have say 9 textboxes and 9 labels telling what the textboxes are for; let's hope they are all organized in two columns, so all neatly atop each other.
Now add a Panel to your Form, covering all the space where you want the labels to go, but not covering anything else (that is where you need to be lucky). Now put the labels on the Panel, not on the Form itself. You can now make all labels (in)visible by changing the visibility of the Panel! And that takes a single line of code...
Luc Pattyn [My Articles]
If you can't find it on YouTube try TikTok...
|
|
|
|
|
Hi Luc
Thanks for the tip, amazing how the simplest of idea's are staring you in the face, lol!
To be honest i need to make other changes too, like updating the text on each with a different value.
I'm working on a big project to display register values of a chip.
What i was hoping to do was use some kind of simple for loop to access the label name seeing that the names have a digit at the end, then update the properties when needed.
Cheers
Ron
|
|
|
|
|
If you subclass the label, or make the equivalent user control, you can add code to the constructor and / or loaded / initialized events to automatically "register" the label in a (static) collection that you can iterate at will at run time.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
I have wrote some lines of code for exporting DataGridView contents to Excel file. The code works fine in the main Form. I want to make a class (.dll file) from my code so I could use it as reference in many projects. How is it possible?
My code is:
private void btnExport_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
worksheet = workbook.Sheets["Sheet1"];
worksheet = workbook.ActiveSheet;
worksheet.Name = "pmInfo";
for (int i = 1; i < dataGridView1.Columns.Count+1; i++)
{
worksheet.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText;
}
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
worksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
}
}
var saveFileDialoge = new SaveFileDialog();
saveFileDialoge.FileName = "Output";
saveFileDialoge.DefaultExt = ".xlsx";
if (saveFileDialoge.ShowDialog()==DialogResult.OK)
{
workbook.SaveAs(saveFileDialoge.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
}
}
|
|
|
|
|
|
I pasted this code in the Class, but "Columns" and "Rows" have red underline. I cannot compile the class.
|
|
|
|