Требуется получить некое мастер-делаль представление данных (телефонный справочник), примерно такое:
Делаю это WebUserControl-ом. Подготовил типизированный датасет, в котором 2 таблицы на основе процедур. Первая
(мастер) выдает всех человеков из БД, вторая (деталь) выдает набор данных (по переданному параметру id человека) с одной или
несколькими строками детальной инфы по нему, в зависимости от того, занимает он одну или несколько должностей
одновременно.
Создал юзер-контрол, в нем код:
<asp:ListView ID="lvMaster" runat="server">
<LayoutTemplate>
<table cellpadding="2" width="1024px" border="1" runat="server" id="tblMaster">
<tr runat="server">
<th runat="server">
FIO
</th>
</tr>
<tr runat="server" id="itemPlaceholder" />
</table>
</LayoutTemplate>
<ItemTemplate>
<tr runat="server">
<td>
<asp:Label ID="LabelID" runat="Server" Text='<%#Eval("ID")%> ' Visible="false" />
<asp:Label ID="LabelF" runat="Server" Text='<%#Eval("F")%> ' />
<asp:Label ID="LabelI" runat="Server" Text='<%#Eval("I")%> ' />
<asp:Label ID="LabelO" runat="Server" Text='<%#Eval("O")%> ' />
<asp:ListView ID="lvDetail" runat="server">
<LayoutTemplate>
<table width="640px" runat="server" id="tblDetail">
<tr runat="server" id="Tr2">
<th runat="server">
PhoneNum
</th>
<th runat="server">
Post
</th>
</tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr runat="server">
<td>
<asp:Label runat="server" ID="LabelPhone" Text='Test1' />
</td>
<td>
<asp:Label runat="server" ID="LabelPost" Text="Test1" />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
</td>
</tr>
</ItemTemplate>
</asp:ListView>
В код-бехаинде к этому контролу вынес наружу свойство для заполнения мастер-таблицы.
public DataTable MasterDataSource
{
set
{
lvMaster.DataSource = value;
lvMaster.DataBind();
}
}
Внешняя мастер-таблица теперь, конечно же, заполняется как надо. Но никак не могу понять как заполнять деталь-таблицу — как прицепить к ней DataSource и вытаскивать из него данные по id текущей строки мастре-таблицы. Или как это вообще правильно делается?
Вот что самое обидное — просидишь много времени над проблемой, отчаишься, спросишь на форуме. А через полчаса, наконец, до самого дойдет как сделать.
Надо было просто биндить детальные данные по ходу заполнения мастер-таблицы. Примерно так:
protected void lvMaster_ItemDataBound(object sender, ListViewItemEventArgs e)
{
ListView lvDetail = (ListView) e.Item.FindControl("lvDetail");
GetDetailTableAdapter taDetail = new GetDetailTableAdapter();
string currID = ((Label) e.Item.FindControl("LabelID")).Text;
lvDetail.DataSource = taDetail.GetData(Convert.ToInt32(currID));
lvDetail.DataBind();
}
Конечно же, надо приведение типов делать через as и добавить сюда дополнительные проверки на null для надежности, но смысл понятен, я думаю