|
But is it in the room?
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi, I am beginner in C# and I didn't found solved my problem.
In app I add tabPage with new text box and some others parameters (labels, etc.) and I wanna save all items to C# config file. The tabs is adds if app is running. Is it possible to save all TabPages in TabControl to C# config file ?
Code:
void AddTab()
{
bool existTabPage = false;
UInt16 allChceked = 0;
foreach (TabPage t in tabControl1.TabPages)
{
TabPage tabPage1 = new TabPage(tb_PlcUrl.Text);
if (tabControl1.TabPages.ContainsKey(tb_PlcUrl.Text))
{
existTabPage = true;
}
allChceked++;
}
if (!existTabPage && allChceked == tabControl1.TabCount)
{
TabPage tabPage1 = new TabPage();
tabPage1.Name = tb_PlcUrl.Text;
tabPage1.Text = tb_PlcUrl.Text;
TextBox tb = new TextBox();
tb.Location = new System.Drawing.Point(65, 19);
tb.Size = new System.Drawing.Size(133, 20);
tb.Text = tb_PlcUrl.Text;
tb.BorderStyle = BorderStyle.None;
tb.ReadOnly = true;
tabPage1.Controls.Add(tb);
Label labIpPlc = new Label();
labIpPlc.Location = new System.Drawing.Point(18, 19);
labIpPlc.Size = new System.Drawing.Size(133, 20);
labIpPlc.Text = "PLC1";
tabPage1.Controls.Add(labIpPlc);
tabControl1.TabPages.Add(tabPage1);
}
else MessageBox.Show("Already exist : *" + tb_PlcUrl.Text);
}
And if I close, the app make something like that:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
foreach (TabPage item in tabControl1.TabPages)
{
Properties.Settings.Default.TabPages[i] = tabControl1.TabPages[i];
i++;
}
Properties.Settings.Default.Save();
Application.Exit();
}
Thank you for help !
|
|
|
|
|
That isn't going to work, at least partly because you don;t know how many tabpages you have to start with.
If you weren't a beginner, I'd suggest a user control derived from TabPage which "knows" how to serialise and deserialise itself, or using JSON - but for a beginner that is quite a bit to learn.
So instead, consider writing a method which returns the relevant details from a tabpage as a string, with each element as key =value pairs, separated by semicolons:
Text="the text on the tab";Name="The Name";LabelText="The label text";... And then collecting those together as a bigger string, separated by newlines. Save that string, and when you restore it, use string.Split to separate the lines, then create a method that takes each line as a string and returns a new TabPage with the information filled in. Again, string.Split separates each key/value pair, and another split gives you the key and value. A simple switch lets you put each key value in the right place.
Make sense?
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Create a model that holds the data, instantiate that model in the tab page parent (as a public property), and let each tab page get/set the properties that it cares about in the parent's model. When the form closes, have it save the model.
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
For a better understanding, would you create a simple program? I assume that changing the TabControl from private to public in form.Designer.cs doesn't help?
Thank you
|
|
|
|
|
|
Remember that all of us were beginners once, and I'd guess many of us have, in the initial stages of learning UI development, and such advanced techniques as run-time Control generation, gotten ... confused
And, I think you are quite confused, here. In this loop:
foreach (TabPage t in tabControl1.TabPages)
{
TabPage tabPage1 = new TabPage(tb_PlcUrl.Text);
if (tabControl1.TabPages.ContainsKey(tb_PlcUrl.Text))
{
existTabPage = true;
}
allChceked++;
} You created a new TabPage, but you never used it: outside of the loop it is reclaimed by memory management ... effectively, it doesn't exist.
Serialization of WinForm Controls is problematic in terms of basic Types, like Fonts and Colors, and, for some Controls that contain other Controls (ex. DateTimePicker) or elements that are non serializable (ex. TreeView's NodeCollection). It's a shame WinForms did not include a powerful save/restore feature for all built-in Controls from the start.
I think your first goal should be a better understanding of C# and object.Control creation; for that, I suggest getting a really good book and combining study with programming small examples ... in the past the books on WinForms by Jesse Liberty and Chris Sells were most useful to me.
As you approach the task of saving and restoring run-time created Controls, like TabPages, I suggest you carefully consider:
1. basic attributes: text, color, location
1.a. basic state: visible, enabled, focused, selected, etc.
2. the issue of restoring event handlers ... which cannot be saved ... you've attached at run-time.
3. the extent to which the run-time user is constrained in terms of what they can create, how many whatevers they can create, etc.
4. ... of course: the data ... the unique content of each Control in the TabPage
I suggest you edit your post here, and describe the contents of one of your run-time created TabPage: when you want to save the content: what must be saved ?
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
Thank you for understanding
I try to explain the problem clearly.
In application I have ListBox (only IP adress all PLC for communication).
You can add and remove PLC IP addresses to the ListBox.
-TabPages are created when Ip address is added to ListBox.
-the mentioned code treats duplicate ip addresses when creating a new Tabpages.
-After removing Ip from the listbox, the Tabpages with that ip address will be removed.
- Is there any other aleternate to treat the same Tabpages (because there cannot be 2 plc with the same Ip address)?
I want to store TabPage with Texbox values (location, color, visile etc. are not essential).
TabPages being created have a fixed structure like as:
this.tabPage1.BackColor = System.Drawing.SystemColors.Control;
this.tabPage1.Controls.Add(this.textBox5);
this.tabPage1.Controls.Add(this.textBox4);
this.tabPage1.Controls.Add(this.textBox3);
this.tabPage1.Controls.Add(this.textBox2);
this.tabPage1.Controls.Add(this.textBox1);
this.tabPage1.Controls.Add(this.labPlcIpAddress);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Size = new System.Drawing.Size(384, 292);
this.tabPage1.TabIndex = 3;
this.tabPage1.Text = "Plc1";
this.textBox5.Location = new System.Drawing.Point(111, 153);
this.textBox5.Name = "tb_SQLName";
this.textBox5.Size = new System.Drawing.Size(188, 20);
this.textBox5.TabIndex = 11;
this.textBox5.Text = "name edited SQL column";
this.textBox4.Location = new System.Drawing.Point(111, 116);
this.textBox4.Name = "tb_SqleditColumn";
this.textBox4.Size = new System.Drawing.Size(188, 20);
this.textBox4.TabIndex = 10;
this.textBox4.Text = "SQL column name for editing";
this.textBox3.Location = new System.Drawing.Point(111, 67);
this.textBox3.Name = "textBox3";
this.textBox3.Size = new System.Drawing.Size(188, 20);
this.textBox3.TabIndex = 9;
this.textBox3.Text = "Query for update SQL database";
this.textBox2.Location = new System.Drawing.Point(111, 40);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(188, 20);
this.textBox2.TabIndex = 8;
this.textBox2.Text = "Query for Select from SQL database";
this.textBox1.Location = new System.Drawing.Point(111, 13);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(188, 20);
this.textBox1.TabIndex = 7;
this.textBox1.Text = "Here is IP of plc";
Now it's obviously ?
|
|
|
|
|
Based on your response, I suggest:
1. Create a UserControl that contains the required TextBoxes : TabPageUC
1.a. expose the Text content of the TextBoxes in public Properties
1.b. create a serializer/deserializer for that UserControl
1.c. create a serializable static class that holds a List<TabPageUC>
In your main program:
2. maintain a data structure that maps TabPages to the contained TabPageUC control
2.a. write a method that adds a new TabPage, and then create an instance of TabPageUC to add to the Controls Collection of the new TabPage.
2.b. write a method to dispose of an existing TabPage, and its UserControl
In general:
3. familiarize yourself with the System.Runtime.Serialization namespace. and how DataContract and DataMember Annotations are used. And how a DataContractSerializer instance is used for both saving, and restoring content.
Take this on, and you will learn a lot.
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
modified 26-Apr-19 15:50pm.
|
|
|
|
|
How to handle PCB components layout in designing LED switching power supply?
|
|
|
|
|
Definitely the wrong forum - this is for the C# programming language - and probably the wrong site: this is for software development, it's not hardware oriented.
There is a hardware forum: Hardware & Devices Discussion Boards[^] bute even that is unlikely to be helpful to your exact question. I'd suggest going to the site for the pcb layout software you are using and looking for FAQs or a forum where other users can help you with component placing as it's likely to be somewhat dependent on the software you are using (and in the case of switch mode PSUs somewhat dependent on arcane and demonic factors, and the phase of the third moon of Saturn if the swearing of my hardware designer in days of yore were anything to go by...)
Good luck!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
If i have this number: 100000000000
my code will read it like this:
if (rol > 99999999999) label1.Text = get3digit(rol) + " miliarde";
...
int get3digit(Int64 myVal)
{
char mg1 = myVal.ToString()[0];
char mg2 = myVal.ToString()[1];
char mg3 = myVal.ToString()[2];
char[] chars = { mg1, mg2, mg3 };
string mg = new string(chars);
int i = int.Parse(mg);
return i;
}
999999999999 (it means 999 miliarde) and is the Maximum value i will make the code.
Now, I want to split this number by 3 LAST characters !!!
So it will look like this in the end: "100 000 000 000" (yes, with spaces)
Also for other LESS numbers than this one.
100 000 000 000
10 000 000 000
1 000 000 000
100 000 000
10 000 000
1 000 000
100 000
10 000
1 000
and this is the last value to insert the space. So 9 cases. I give multiple of 10 example here to be easy to understand, but it will be other numbers between 0 and 999 milliard.
My idea is to use -char- as i did already, to separate the last numbers.
But... maybe there is some funky way of doing it more easily?
Or AUTOMATIC/ Default way?
Thank you very much.
|
|
|
|
|
Int64 i = 100000000;
Console.WriteLine( i.ToString( "### ### ###" ).TrimStart() );
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
EXCELENT !!! Thank you very much.
|
|
|
|
|
Hi,
you can specify how a number gets formatted on output without performing any char or string manipulation yourself.
The basic mechanism consists of calling the ToString() method while providing a format pattern as well as an object of type NumberFormatInfo that holds your specific wishes. In this case it would be:
NumberFormatInfo nfi = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberGroupSeparator = " ";
int yourNumber=123456789;
string yourFormattedNumber = yourNumber.ToString("#,0", nfi);
Obviously you need to create nfi only once, you can reuse it as often as you want.
|
|
|
|
|
This will work regardless of the type of number, and regardless of its value.
long number = 100000000000;
string value = string.Format("{0:#,##0}", number).Replace(",", " ");
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
modified 18-Apr-19 8:26am.
|
|
|
|
|
public string HowManyMillion(int millions, string suffix) => $"{millions / 1000000} {suffix}";
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
I want to apply username n password when calling wcf from client. I don't know how to create certificate.when i run command in cmd it shows makecert is not registered. I am using wshttpbinding with security mode transport and presidential type basic.how can i solve my issue.pls help me
|
|
|
|
|
wcf passing credentials with https transport - Google Search[^]
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
I'm working on a small project and trying to familiarize myself with C# to boot (perhaps in a ham-fisted way).
The program dynamically creates an array of buttons and uses an imagelist to place an image on the button (not the button background). Clicking on the button increments which image is displayed on the buttons.
The issue I have is that I wish to save in a text file the current image index of the image - so it can be reloaded in future. Whilst I can reference and change certain things like text and background image - I cannot work out a way to access the index of the image currently in-use.
I appreciate I've provided only a little info, if more it required I will do my best to answer.
|
|
|
|
|
For anyone searching that may come across this it was a newbie not fully understanding casting.
I was hoping this was correct:
this.tabControl_Schedules.TabPages[tabpage_counter].Controls["button" + announcement_counter++].ImageIndex = 1;
Where instead I needed to do something like:
Button butt = new Button();
butt = (Button)this.tabControl_Schedules.TabPages[tabpage_counter].Controls["button" + announcement_counter++];
and..
butt.ImageIndex = 1;
|
|
|
|
|
Member 14271084 wrote:
Button butt = new Button();
butt = ...
You're creating a new instance of a class, only to throw it away on the following line. The only effect that will have is to increase the memory usage and "GC churn" for your application.
You should remove the new Button() allocation. You can either declare the variable without initializing it, or combine the declaration with the assignment from the following line.
Button butt;
butt = (Button)this.tabControl_Schedules.TabPages[tabpage_counter].Controls["button" + announcement_counter++];
Button butt = (Button)this.tabControl_Schedules.TabPages[tabpage_counter].Controls["button" + announcement_counter++];
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Since you create the Buttons at run-time, why not keep track of them and their current index as you create them ? You can then serialize them.
public Dictionary<string, Button> BtnDict = new Dictionary<string, Button>();
public void AddNewButton(ImageList btnimagelist, Control btnsite, string btntext, int btnimgindex, Point btnlocation)
{
Button btn = new Button
{
Text = btntext,
ImageList = btnimagelist,
ImageIndex = btnimgindex,
Location = btnlocation
};
btnsite.Controls.Add(btn);
}
public void IncBtnImage(string btntext)
{
Button btn = BtnDict[btntext];
int icnt = btn.ImageList.Images.Count;
int ndx = ++btn.ImageIndex;
if (ndx == icnt) ndx = 0;
btn.ImageIndex = ndx;
} Do all of these run-time created Buttons use the same ImageList, or does each one have its own ?
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
modified 17-Apr-19 3:00am.
|
|
|
|
|
I'm not at all sure that I understand why you are having problems accessing the image index - it's held in a property that you modify in order to change the image that is displayed from the ImageList.
And if you can access it to change it when the button is clicked, why can't you access the ImageIndex property of the button when you want to save it?
This is why "working on a small project and trying to familiarize myself with C# to boot" is a bad idea: you don't know what you are missing that could make your life a whole load easier! I'd strongly recommend that you go on a course, or get a book - trying to "pick it up as you go along" is not a viable strategy any more than trying to learn to drive by entering an F1 race ...
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I am trying to serialize json using an object and have it be in the format below. Please provide any info as my object will not parse like this. Thanks.
{"custom-fields": {"post-date":"2019-04-10" }}
My code using an object produces value pairs and has trouble with double quotes if I try to use a string variable to build out the json.
|
|
|
|
|