Спасибо за ответы, ребята. Похоже, что настройка DataGrid - это путь. Вот что я делаю для новичков в ASP.NET
<asp:DataGrid ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundColumn DataField="RuleID" Visible="False" HeaderText="RuleID"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="Category">
<ItemTemplate>
<!-- in case we want to display an image -->
<asp:Literal ID="litImage" runat="server">
</asp:Literal>
<asp:DropDownList ID="categoryListDropdown" runat="server"></asp:DropDownList>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
Это создает сетку данных. Затем мы можем связать его с источником данных (в моем случае DataTable) и использовать такие вещи, как
foreach (DataGridItem item in this.GridView1.Items)
{
DropDownList categoryListDropdown = ((DropDownList)item.FindControl("categoryListDropdown"));
categoryListDropdown.Items.AddRange(listItems.ToArray());
}
для заполнения начального раскрывающегося списка в сетке данных. Вы также можете получить доступ к item.Cells [0] .text, чтобы получить RuleID в этом случае.
Примечания для себя: модель ASP.NET все делает в файле codebehind. На высоком уровне вы всегда можете перебрать GridView1.Items для получения каждой строки и item.findControl («ControlID») для запроса значения, хранящегося в каждом элементе, например, после нажатия кнопки «Обновить».