2009-03-26 7 views
1

Ich bin gerade basing datengesteuert ASP.NET webforms design. Ich habe den ersten Teil eines Formulars, aber ich weiß nicht, was ich als nächstes tun soll.Master/Detail-Hilfe für ASP.NET-Neulinge benötigt. (screenshot auch)

Bitte beachten Sie diesen Screenshot von dem, was ich bisher geschaffen habe: zu wissen, welche Art von HTML-Elemente http://www.twitpic.com/2gnmr

Ich brauche Hilfe in der Master-Liste zu verwenden, und welches Ereignis/Trigger auf dem Elemente Feuer zu verwenden off die Sequenz "get child records for this selected item"?

Auch ist ein ListView sogar die richtige Art und Weise, um die Master-Liste zu präsentieren? Zu diesem Zeitpunkt versuche ich keine Bearbeitungsfunktionen bereitzustellen. Ich werde später darauf kommen, schätze ich.

Sollte ich ein anderes ASP.NET-Datensteuerelement verwenden, anstatt eine Listenansicht wie von Hand zu codieren?

Ich möchte nicht eine tatsächliche "Select" Link-Element neben jedem Kundennamen (das sieht doof). Ich möchte, dass der Kundenname der Link ist, auf den geklickt werden kann.

So können Sie in meinem Code unten sehen, dass ich eine ListView habe, um eine Liste von CustomersWithOpenOrders zu präsentieren. Aber es ist nur eine statische Liste. Wie kann ich das Firmennamen-Label anklickbar machen, und was brauche ich sonst noch, damit es Code-Behind zurückfeuert, um die untergeordneten Datensätze abzurufen? Ich habe bereits eine Code-Behind-Methode, um untergeordnete Datensätze für eine übergebene CustomerNumber in eine DataTable zu bekommen, und ich denke, ich würde wissen, wie man das an ein Grid oder eine Listview für Child-Datensätze bindet, aber ich weiß nicht, wie ich die übergeben soll CustomerNumber von der Master-ListView zur Methode aus dem UI-Formular.

<asp:ListView ID="ListView1" runat="server"> 
    <LayoutTemplate> 
     <table cellpadding="2" border="0" ID="tbl1" runat="server"> 
     <tr id="Tr1" runat="server" class="lvHeader"> 
      <th id="Th1" runat="server">Customer</th> 
     </tr> 
     <tr runat="server" id="itemPlaceholder" /> 
     </table> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <tr id="Tr2" runat="server"> 
     <td> 
      <asp:Label ID="label2" class="FirstLine" runat="server" Text='<%# Eval("company") %>' /> 
      <br /> 
      <div class="SecondLine"> 
      <asp:Label ID="labelCustNo" runat="server" Text='<%# Eval("custno") %>'/> 
      <asp:Label runat="server" Text='Ph: '></asp:Label> 
      <asp:Label ID="label3" runat="server" Text='<% # Eval("phone") %>' /> 
      </div> 
     </td> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

Antwort

2

Ich persönlich habe keinen Fall gefunden, in dem der ListView meine Bedürfnisse nicht lösen kann. Wenn Sie eine Kundenauswahlstilliste erstellen möchten, können Sie eine Verknüpfungsschaltfläche zum Binden verwenden.

<asp:ListView runat="server" id="CustomersList" ItemCommand="CustomersList_ItemCommand"> 
    <LayoutTemplate> 
    <table cellpadding="2" border="0" ID="tbl1" runat="server"> 
     <tr id="Tr1" runat="server" class="lvHeader"> 
     <th id="Th1" runat="server">Customer</th> 
     </tr> 
     <tr runat="server" id="itemPlaceholder" /> 
    </table> 
    </LayoutTemplate> 
    <ItemTemplate> 
    <tr id="Tr2" runat="server"> 
     <td> 
     <asp:LinkButton ID="link1" class="FirstLine" runat="server" Text='<%# Eval("company") %>' CommandName="Select" /> 
     <br /> 
     <div class="SecondLine"> 
      <asp:Label ID="labelCustNo" runat="server" Text='<%# Eval("custno") %>'/> 
      <asp:Label runat="server" Text='Ph: '></asp:Label> 
      <asp:Label ID="label3" runat="server" Text='<% # Eval("phone") %>' /> 
     </div> 
     </td> 
    </tr> 
    </ItemTemplate> 
</asp:ListView> 

<asp:ListView runat="server" ID="OrderList"> 
    <!-- Child Rows implementation --> 
</asp:ListView> 

Dann müssten Sie das Ereignis an den ListView.ItemCommand binden.

protected void CustomersList_ItemCommand(object sender, ListViewCommandEventArgs e) 
{ 
    if (e.CommandName = "Select") 
    { 
    if (e.Item.ItemType != ListViewItemType.DataItem) return; 

    var dataItem = e.Item as ListViewDataItem; 
    if (dataItem == null) return; 

    var customer = dataItem.DataItem as Customer; 
    if (customer == null) return; 

    this.OrdersList.DataSource = GetChildRecords(customer.ID); 
    this.OrdersList.DataBind(); 
    } 
} 
+0

Nun, ich habe es funktioniert bis zu dem Punkt, wo Sie das DataItem.DataItem auf einen Kundentyp zu werfen. Ich verwende keine typisierten DataSets oder Objekte, sondern ein einfaches DataSet aus einem SQL-Befehlsaufruf. Also, wie kann ich die CustNo out, wenn ich es mit einem CommandArgument auf dem LinkButton setzen? – MattSlay

+0

Zeigen Sie es im Debugger an. Sie müssen es möglicherweise als DataRow oder DataViewRow – bendewey

+0

es im Debugger null ist. Ich habe schließlich CommandArgument gleich CustId auf jedem LinkButton verwendet, dann: string SelectedCustomerId = e.CommandArgument.ToString(); this.lvOpenOrders.DataSource = GetOpenOrdersByCustomer (SelectedCustomerId); this.lvOpenOrders.DataBind(); Betrug? – MattSlay