Hi, Scheinin :
Based on my knowledgement, BoundField only can be accessed by the cell's index. But you do not want to access a column by the hard-coded number, you are suggested to use Label to display the data, instead of BoundField. You can get the content by the Label's ID, using the method FindControl().
To the second question, oldvalues can be retrieved by the field keys. Your statement is correct, but please note that the field key is not the HeaderText of the column, but the field in DataBase. For example, if your SQL is "SELECT name from Table1", you can use e.OldValues("name").ToString() to get the value.
Please have a try.
If you have any doubts about it, please feel free to let me know.