|
Because you only have one instance of the c lass and you insert it multiple times into the list. And each time round the loop you overwrite the values you set in the previous instance.
Think of it like cars: You put your mobile phone in the glove box of my car. Then you open the glove box of your car - is your mobile in there? Of course not - they are different cars.
What your loop is doing is parking my car in different spaces in the car park: and expecting each spot to be filled with a car at the end!
Create a new instance each time round the loop.
"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!
|
|
|
|
|
Thank you for the quick response.
Can you explain with code
|
|
|
|
|
He did explain it.
It's up to you to write the code. Griff is not going to write the code for you.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
No need to - you already know how to create instances you even do it in that code fragment you originally showed us!
"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!
|
|
|
|
|
Actually, his phone is also in his car ... he's creating multiple references to the same object ... which really means it's in neither car.
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
|
|
|
|
|
public class InvoiceLine
{
public string description { get; set; }
public string itemType { get; set; }
public string itemCode { get; set; }
public string internalCode { get; set; }
public string unitType { get; set; }
public int quantity { get; set; }
public UnitValue unitValue { get; set; }
public int salesTotal { get; set; }
public double valueDifference { get; set; }
public double totalTaxableFees { get; set; }
public Discount discount { get; set; }
public int netTotal { get; set; }
public double itemsDiscount { get; set; }
public IList<TaxableItem> taxableItems { get; set; }
public int total { get; set; }
}
I'm sorry i forget to attach the class
i didn't understand your answer "Because you only have one instance of the class and you insert it multiple times into the list. And each time round the loop you overwrite the values you set in the previous instance."
if i have 10 records in grid it means 10 instance to insert one invoice sorry i can't under stand your example about phone and car
|
|
|
|
|
OK.
You have a car. It's a red Ford.
I have a car. It's a black Mercedes.
We go for a drive in my car.
What colour is it?
"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!
|
|
|
|
|
|
Right. Obviously!
So you understand that "car" is a generic word, but that each vehicle that is a "car" is separate and distinct. "My car" is not the same as "your car" - it shares some generic characteristics such as the number of wheels, and that it has an engine (or engines) but most of it's attributes are specific to a particular vehicle.
In computing, we call "car" a class and a specific vehicle an instance of that class, with the properties of an instance being defined by the class but "filled in" by the instance:
class Car
{
Color Color {get; set;}
Manufacturer Manunfacturer {get; set;}
}
...
Car myCar = new Car() { Color = Colors.Black, Manufacturer = Manufacturers.Mercedes};
Car yourCar = new Car() { Color = Colors.Red, Manufacturer = Manufacturers.Ford};
If you respray yourCar blue, it doesn't affect the colour of myCar - you know that!
So if your code creates just one instance of an InvoiceLine, what happens if you set the properties over and over again?
"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!
|
|
|
|
|
thank for you help
but i think it's hard create instance to each new line in invoice lines
first i used this code to see result
string[,] datavalu = new string[dataGridView1.Rows.Count, dataGridView1.Columns.Count];
foreach(DataGridViewRow row in dataGridView1.Rows)
{
foreach (DataGridViewColumn col in dataGridView1.Columns)
{
datavalu[row.Index, col.Index] = dataGridView1.Rows[row.Index].Cells[col.Index].Value.ToString();
}
}
int i = 0;
foreach(string ss in datavalu)
{
listBox1.Items.Add(ss);
i++;
}
I think I thought wrong from the start. Often there are simpler ways Do you know a better way
|
|
|
|
|
Quote: i think it's hard create instance to each new line in invoice lines
Why?
You do it pretty easily when you create the one you do use!
So why do you think it is going to be harder to create them when you actually need them?
"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!
|
|
|
|
|
thanks a lot
for ( i = 0; i < datavalu.GetLength(0); i++)
{
InvoiceLine invoiceline2 = new InvoiceLine();
invoiceline2.description = datavalu[i, 0].ToString();
invoiceline2.itemType = datavalu[i, 1].ToString();
invoiceline2.itemCode = datavalu[i, 2].ToString();
invoiceline2.internalCode = datavalu[i, 3].ToString();
invoiceline2.unitType = datavalu[i, 4].ToString();
invoiceline2.quantity = int.Parse(datavalu[i, 5].ToString());
invoicelines.Add(invoiceline2);
}
my mistake was
InvoiceLine invoiceline = new InvoiceLine();
create instants before loop
|
|
|
|
|
That's the one.
Though I'd have just moved the original line into the loop!
"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!
|
|
|
|
|
Find whoever put "Food2" in there and stone them.
Bastard Programmer from Hell
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Hi
{
if (DataGridView2.Rows.Count != 0 && !string.IsNullOrEmpty(column_num.Text) && !string.IsNullOrEmpty(row_num.Text) && !string.IsNullOrEmpty(Equip_column.Text) && !string.IsNullOrEmpty(prog_num.Text))
{
for (int i = Convert.ToInt32(row_num.Text); i < DataGridView2.Rows.Count; i++)
{
if (!code_dic.ContainsKey(DataGridView2.Rows[i].Cells[Convert.ToInt32(column_num.Text)].Value.ToString()))
{
code_dic.Add(DataGridView2.Rows[i].Cells[Convert.ToInt32(column_num.Text)].Value.ToString(), string.Join(",", DataGridView2.Rows[i].Cells[Convert.ToInt32(Equip_column.Text)].Value.ToString(), prog_num.Text.ToString()));
}
}
}
foreach (KeyValuePair<string, string> pair in code_dic)
{
string[] my_arr = pair.ToString().Split(',');
my_table_code.Rows.Add(my_arr[0], my_arr[1], my_arr[2]);
DataGridView3.DataSource = my_table_code;
}
}
In the code above, dictionary puts information inside [ ] mark.
The output shows information like this:
[abc,def,ghi]
I want to omit [ ] marks. What to do?
|
|
|
|
|
Alex Dunlop wrote: In the code above, dictionary puts information inside [ ] mark. Where does this happen, and how are you checking it?
|
|
|
|
|
The code puts Dictionary into a data table and then, datatable in brought into DataGridView.
The result is reflected in DataGridView. It has 3 cloumns. Column 1 and 3 has "[" and "]" marks.
Something like this:
column 1....columns 2....column 3
[abcd........efgj..........ijkl]
|
|
|
|
|
That does not make it much clearer and your code is almost impossible to understand. You are using strings as column numbers, which means you have to convert them back to integers. You call ToString on a KeyValuePair<string, string> and then Split on the result, instead of taking the returned items as is. Chances are that whatever you are doing is affecting the text values you are storing. A few minutes with the debugger will show you where.
|
|
|
|
|
Took me less than a minute to see that:
pair.ToString()
returns the key and value surrounded by square brackets:
KeyValuePair<string, string> foo = new KeyValuePair<string, string>("foo", "bar");
Console.WriteLine(foo.ToString());
Output:
[foo, bar]
|
|
|
|
|
Yeah, you're right.
Is there any way to avoid that or remove it?
|
|
|
|
|
Good spot, @Richard_MacCutchan!
How about changing
string[] my_arr = pair.ToString().Split(',');
my_table_code.Rows.Add(my_arr[0], my_arr[1], my_arr[2]); to
string[] my_arr = pair.Value.Split(',');
my_table_code.Rows.Add(pair.Key, my_arr[0], my_arr[1]); ?
Note: This is off the top of my head, not tested. Caveat Emptor.
modified 20-May-21 6:05am.
|
|
|
|
|
|
[] is the C# syntax for indexing: it's used with a numeric value for ordered Collections, and other types of values with Collections like Dictionary<TKey, TValue> that have no inherent ordinality.
That's just the way the language is.
«One day it will have to be officially admitted that what we have christened reality is an even greater illusion than the world of dreams.» Salvador Dali
|
|
|
|
|
Hi,
i would to make an explorer to add some methods i need behind. I tried a lot of things but many are deprecated. I'm under windows 10 x64. I want to make my app under .net core.
I tried SHGetSpecialFolderLocation but the name i retrieve is in chinese... i don't understand why. I saw with windows 10 it's better to use knownfolderid but i search in my registrykeys and i didn't find mega key, but it uses a clsid. Should it a good idea to ask to the registry or is there another method ?
i want to make something classic, with "mycomputer" root, make drives under it (it's ok for this part), have clouds folder also... And i will try to get default icons, i have some methods using win32.dll (if you have better i will happy to have more informations).
|
|
|
|
|
You haven't explained any kind of problem you're having.
I'm going to guess that you're trying to use SHGetSpecialFolder location to get the paths to cloud folder. That will not work as they are not part of the Windows file system.
AFAIK, there is no standard method to get cloud folder paths. You'd have to write support modules for each cloud provider you want to support and ask the user for their username and password to get into those folders.
|
|
|
|