Pit76
asked on
Add datagridviewRows to List<> c#
Hi all,
On my form I have a DataGridView wich the user can fill manuel with document lines (invoice).
When the user clicks the save doc button the document gets saved to the db and with that new record ID I then Save the documentlines into the db.
Only problem I have is that when there are say 3 rows in the DataGridView it save 3 times the last added row and not row 1,2 and 3.
Below is my code.
So I have a problem somewhere with iterating through the DataGridView but can't find what is wrong..
Thx for any help.
Grts.
On my form I have a DataGridView wich the user can fill manuel with document lines (invoice).
When the user clicks the save doc button the document gets saved to the db and with that new record ID I then Save the documentlines into the db.
Only problem I have is that when there are say 3 rows in the DataGridView it save 3 times the last added row and not row 1,2 and 3.
Below is my code.
So I have a problem somewhere with iterating through the DataGridView but can't find what is wrong..
Thx for any help.
Grts.
#region AddLinesToList
// Add lines to List and fill DocumentBLL.DocRegel
// _localDocBLL is a class wich contains a List with _localRegelBLL items
for (int i = 0; i < dataGridViewDocLijnen.Rows.Count; i++)
{
// Here i Fill the _localRegelBLL properties with the values of the datagridview
// but something goes wrong here. It adds the last line as many times a there are rows...
_localRegelBLL.Id = Convert.ToInt32(dataGridViewDocLijnen.Rows[i].Cells[0].Value);
_localRegelBLL.Aantal = Convert.ToDouble(dataGridViewDocLijnen.Rows[i].Cells[1].Value);
_localRegelBLL.Rgl_oms_id = Convert.ToInt32(dataGridViewDocLijnen.Rows[i].Cells[2].Value);
_localRegelBLL.Eenheid = dataGridViewDocLijnen.Rows[i].Cells[4].Value.ToString();
_localRegelBLL.EenheidsPrijs = Convert.ToDouble(dataGridViewDocLijnen.Rows[i].Cells[5].Value);
_localRegelBLL.TotaalPrijs = Convert.ToDouble(dataGridViewDocLijnen.Rows[i].Cells[6].Value);
_localRegelBLL.Rgl_doc_id = docId;
_localDocBLL.DocRegel.Add(_localRegelBLL);
}
#endregion
// Save document lines
bool saveDocLines = _localDocBLL.SaveDocLines(_localDocBLL.DocRegel);
Where in your code is this code snippet? If it's in like a Confirm event (ie a button click or something), then it'll just append the same data 3 times (which is what's going wrong, correct?)
ASKER
Yes indeed. this is a part of the SaveButton_Click Event.
I first save the general info of the document (like customer, address etc) Then I get the new ID and then I want to save the doclines from the DataGridView. But indeed it saves the same line (lastline in DGV) 3 times or as much as there are lines in the DGV.
What a'm I doing wrong here?
Grts.
I first save the general info of the document (like customer, address etc) Then I get the new ID and then I want to save the doclines from the DataGridView. But indeed it saves the same line (lastline in DGV) 3 times or as much as there are lines in the DGV.
What a'm I doing wrong here?
Grts.
_localRegelBLL is reference to the the object , Evenytime you assign the values to it updates the reference and hence last object is reflected three time. What you need to do is Create a new object for _localRegelBLL in the for loop and then add it to the list. Hope this helps.
This has to do with the nature of reference types vs. value types. The invocation of the "Add" method on line 15 adds the reference of the same object for as many times as there are rows, which is not quite what you want. May I also suggest using a foreach loop? Your code will look something like this:
void AddLinesToList(DataGridView myDataGridView)
{
foreach(DataRow row in myDataGridView.Rows)
{
// Create a NEW object that contains the fields you
// need (the type of this object is whatever you declared
// "_localRegelBLL" as. Make sure it is declared
// inside the loop.
_localDocBLL.DocRegel.Add(_localRegelBLL);
}
// Save lines, etc.
}
ASKER
So something more like this?
Every time it passes the loop create a NEW RegelBLL instance, fill it's prperties, add it to the _localDocBLL.DocRegel List and then dispose the_localRegelBLL?
Grts and thx for your help!
Every time it passes the loop create a NEW RegelBLL instance, fill it's prperties, add it to the _localDocBLL.DocRegel List and then dispose the_localRegelBLL?
Grts and thx for your help!
void AddLinesToList(DataGridView myDataGridView)
{
foreach(DataRow row in myDataGridView.Rows)
{
// Create a NEW object that contains the fields you
// need (the type of this object is whatever you declared
// "_localRegelBLL" as. Make sure it is declared
// inside the loop.
RegelBLL _localRegelBLL = new RegelBLL();
_localRegelBLL.Id = Convert.ToInt32(dataGridViewDocLijnen.Rows[i].Cells[0].Value);
_localRegelBLL.Aantal = Convert.ToDouble(dataGridViewDocLijnen.Rows[i].Cells[1].Value);
_localRegelBLL.Rgl_oms_id = Convert.ToInt32(dataGridViewDocLijnen.Rows[i].Cells[2].Value);
_localRegelBLL.Eenheid = dataGridViewDocLijnen.Rows[i].Cells[4].Value.ToString();
_localRegelBLL.EenheidsPrijs = Convert.ToDouble(dataGridViewDocLijnen.Rows[i].Cells[5].Value);
_localRegelBLL.TotaalPrijs = Convert.ToDouble(dataGridViewDocLijnen.Rows[i].Cells[6].Value);
_localRegelBLL.Rgl_doc_id = docId;
_localDocBLL.DocRegel.Add(_localRegelBLL);
_localRegelBLL = null;
}
// Save lines, etc.
}
Sorry, didn't check as well as I should have. In my post, DataRow should be DataGridViewRow. In the foreach loop, just mimic your code, except replace every instance of "dataGridViewDocLijnen.Row s[i]" with "row" (shortens the code quite a bit, eh? :)).
Let me know of further troubles, if any,
Nate
Let me know of further troubles, if any,
Nate
ASKER
K, thx for the help. Will test it tomorrow but it makes sence what you say so I think it'll work..
I'll let you know tomorrow.
Grts
I'll let you know tomorrow.
Grts
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thx! It works perfect. Thx for your help!
Grts.
Grts.