私が過去に行ったことは、データ バインドされた GridView TemplateColumns を使用することです。
<asp:GridView runat="server" ID="grdRoster" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="First Name">
<ItemTemplate>
<asp:TextBox runat="server" ID="txtFirstName" Columns="10" Text='<%# Eval("RosterFirstName") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Middle Name">
<ItemTemplate>
<asp:TextBox runat="server" ID="txtMiddleName" Columns="10" Text='<%# Eval("RosterMiddleName") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last Name">
<ItemTemplate>
<asp:TextBox runat="server" ID="txtLastName" Columns="10" Text='<%# Eval("RosterLastName") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
次に、ポストバック (たとえば、[保存] ボタンのクリック) で、GridView 内の行をループして、テキスト ボックスから値を取り出すことができます。
foreach ( GridViewRow row in grdRoster.Rows )
{
if ( row.RowType == DataControlRowType.DataRow )
{
string firstName = ( ( TextBox ) row.FindControl( "txtRosterFirstName" ) ).Text;
string middleName = ( ( TextBox ) row.FindControl( "txtRosterMiddleName" ) ).Text;
string lastName = ( ( TextBox ) row.FindControl( "txtRosterLastName" ) ).Text;
}
}