ListView как master/detail
От: explorer009 Россия  
Дата: 04.06.09 09:20
Оценка:
Требуется получить некое мастер-делаль представление данных (телефонный справочник), примерно такое:



Делаю это 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 текущей строки мастре-таблицы. Или как это вообще правильно делается?
listview master/detail
Re: ListView как master/detail
От: explorer009 Россия  
Дата: 04.06.09 11:51
Оценка:
Вот что самое обидное — просидишь много времени над проблемой, отчаишься, спросишь на форуме. А через полчаса, наконец, до самого дойдет как сделать.
Надо было просто биндить детальные данные по ходу заполнения мастер-таблицы. Примерно так:


     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 для надежности, но смысл понятен, я думаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.