You are getting the "Object reference not set an instance" error (that you mentioned in the comments) because the DataList you're trying to grab only exists in your EditItemTemplate
:
<EditItemTemplate>
<asp:DataList ID="dlRMStepItem" OnItemDataBound="dlRMStepItem_ItemDataBound" runat="server">
</asp:DataList>
</EditItemTemplate>
You need to update your if condition to make sure the GridView is in edit mode before you try to access that control:
if (e.Row.RowType == DataControlRowType.DataRow && gvRoadMap.EditIndex >= 0)
{
dataList = (DataList)e.Row.FindControl("dlRMStepItem");
dataSource = ((DataSet)this.ViewState["RoadMapData"]).Tables[1];
dataList.DataSource = dataSource;
dataList.DataBind();
}
For your issue with the OnItemDataBound event not firing, try connecting the event handler in your if block (I know it's already in your markup, but just to be sure):
if (e.Row.RowType == DataControlRowType.DataRow && gvRoadMap.EditIndex >= 0)
{
// Bind the event
dataList.ItemDataBound += dlRMStepItem_ItemDataBound;
dataList = (DataList)e.Row.FindControl("dlRMStepItem");
dataSource = ((DataSet)this.ViewState["RoadMapData"]).Tables[1];
dataList.DataSource = dataSource;
dataList.DataBind();
}