Exception thrown referencing EditItemTemplate control in GridView

I have a GridView defined like this:

<asp:GridView
    ID="gvDetailsData"
    DataSourceID="sdsDetailData"
    runat="server"
    AutoGenerateColumns="false" >
    <Columns>
        <asp:TemplateField SortExpression="data1" HeaderText="Data1">
            <ItemTemplate>
                <asp:Label runat="server" Text='<%# Eval("data1") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList
                    ID="ddlData1"
                    runat="server"
                    DataSourceID="sdsData1"
                    DataTextField="value"
                    DataValueField="value"
                    SelectedValue='<%# Eval("data1") %>' />
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField SortExpression="data2" HeaderText="Data2">
            <ItemTemplate>
                <asp:Label runat="server" Text='<%# Eval("data2","{0:C2}") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="txtData2" runat="server" Text='<%# Eval("data2") %>' />
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ItemStyle-HorizontalAlign="Right">
            <ItemTemplate>
                <asp:ImageButton ID="btnDelete" runat="server" ImageUrl="delete.gif" CommandName="Delete" CommandArgument='<%# Eval("id_detail") %>' OnCommand="btnDelete_Command" />
                <asp:ImageButton ID="btnEdit" runat="server" ImageUrl="edit.gif" CommandName="Edit" CommandArgument='<%# Eval("id_detail") %>' OnCommand="btnEdit_Command"  />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:ImageButton ID="btnCancel" runat="server" ImageUrl="cancel.gif" CommandName="Cancel" OnClick="btnCancel_Click" />
            </EditItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

gvDetailsData is placed inside the EditItemTemplate of a higher level FormView (master data container):

<asp:FormView
   ID="fvData"
   DataSourceID="sdsMasterData"
   runat="server"
   DefaultMode="Edit">
   <EditItemTemplate>

     // Definition of gvDetailsData

     // Definition of sdsDetailData

   </EditItemTemplate>
 </asp:FormView>

sdsDetailData is defined as an SQLDataSource like this:

 <asp:SqlDataSource
    ID="sdsDetailData"
    runat="server"
    ConnectionString="<%$ ConnectionStrings:db %>"
    ProviderName="<%$ ConnectionStrings:db.ProviderName %>"
    SelectCommand="
        SELECT 
            id AS id_detail,
            id_master,
            data1,
            data2
        FROM detail
        WHERE (id_master= @id_master) AND (erase_date IS NULL);"
    UpdateCommand="
        UPDATE detail
        SET
            data1= @data1,
            data2= @data2
        WHERE id = @id_detail;" >
    <SelectParameters>
        <asp:QueryStringParameter Name="id_master" QueryStringField="id" Direction="Input" DbType="Int32" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="id_detail" Direction="Input" DbType="Int32" />
        <asp:ControlParameter Name="data1" ControlID="gvDetailsData$ddlData1" PropertyName="SelectedValue" ConvertEmptyStringToNull="true" Direction="Input" DefaultValue="" DbType="String" />
        <asp:ControlParameter Name="data2" ControlID="gvDetailsData$txtData2" PropertyName="Text" ConvertEmptyStringToNull="true" Direction="Input" DefaultValue="" DbType="Double" />
    </UpdateParameters>
</asp:SqlDataSource>

The relevant code is this:

private SqlDataSource sdsDetailData = null;

protected void Page_Load(object sender, EventArgs e)
{
    sdsDetailData= (SqlDataSource)fvData.FindControl("sdsDetailData");
}

protected void btnEdit_Command(object sender, CommandEventArgs e)
{
    using var _binding = (ImageButton)sender;
    using var _row = (GridViewRow)_binding.NamingContainer;
    using var _gvDetailsData = (GridView)fvDati.FindControl("gvDetailsData");
    _gvDetailsData.SetEditRow(_row.RowIndex);
    _gvDetailsData.DataBind();
}

protected void btnUpdate_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
    sdsDetailData.Update();
}

protected void btnCancel_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
    using var _gvDetailsData = (GridView)fvDati.FindControl("gvDetailsData");
    _gvDetailsData.SetEditRow(-1);
    _gvDetailsData.DataBind();
}

When I try to update gvDetailsData row by pressing Update button I got this exception:

Unable to find control 'gvDetailsData$ddlData1' in ControlParameter 'data1'.

I tried moving sdsDetailData out fvData prepending also fvData$ in ControlID with the same result. I tried to use Bind() together with Parameters instead ControlParameters but params values where not feed.

What's the problem?

There's a way to use databound controls or ControlParameters in this kind of scenario ? How? I have to revert to Parameters and fill them manually in codebehind ?

Thnx