Coleen
Now when you get the grid to render rows are you using Data Source control or you doing this using the Datasource property of the Gridview?
Something like
Gridview1.DataSource = YourProcedure() ' This may return a datatable of dataset
Gridview1.Databind()
In a situation such as this we can use the datasource to create a table that we can insert or add blanks rows in fact in your case both then we would have to persist them using session, cache or viewstate in case of a postback or two
I have answered this kind of question before on this forum so it would be entirely posible to insert as many blank row around the data that came back from the database then have a button to commit to the database at which point you would destroy the cached items.
typically you can create a datatable
dim dt as datatable = ctype(gridview1.datasource, datatable)
C#
datatable dt = (datatable)gridview1.datasource;
To insert it would simply be a matter of
dim rw as datatrow = dt.newrow
do sothing with the columns with are index rw(0), rw(1) etc
then
dt.add(rw) or dt.insert(rw, indx) where indx =insert at
Do you get the picture?
You would then have to save it to a persistent source
Session("myDataTabl") = dt
to read it out you would do
dim dt as datatable = ctype(Session("myDataTabl"), datatable)
and you would have to create a bindgrid routing that would handle this on postback.
If you like I can send you a complete piece of code that does this. But if you post your page I can taylor it as close as possible to what you have.
Your choice 
Let us know