2016-03-25 11 views
0

Ich habe einen Repeater, der Produkte anzeigt, und die Fußzeile ist Eingabefelder, wo Sie ein Produkt aus einer db auswählen und es dem Repeater hinzufügen können. Das erste Feld der Add-Zeile in der Fußzeile ist eine RadComboBox (mit Produktnamen) und ich möchte die anderen Eingabefelder mit Informationen aus der db aktualisieren, wenn SelectedIndexChanged für diese Combobox ist.UpdatePanel und Aktualisierung Repeater

Das Problem ist, diese anderen Steuerelemente in meiner Code-Behind-Funktion zu finden.

protected void ProductSelected(Object source, EventArgs e) 
    { 
     RadComboBox temp = (RadComboBox)source; 

     Product p = session.Query<Product>() 
      .Where(x => x.Name == temp.SelectedItem.Text) 
      .FirstOrDefault(); 


      var repParent = temp.Parent; 
      //var repParent = ((UpdatePanel)temp.NamingContainer.FindControl("UpdateHardwareLine")).ContentTemplateContainer; 

      ((TextBox)repParent.FindControl("AddPartNumber")).Text = p.PartNumber; 
      ((TextBox)repParent.FindControl("AddPartCost")).Text = p.Cost.ToString(); 
      ((TextBox)repParent.FindControl("AddUnitPrice")).Text = p.Price.ToString(); 
      ((TextBox)repParent.FindControl("AddQuantity")).Text = p.DefaultQuantity.ToString(); 

    } 

Ich habe diese 2 Möglichkeiten ausprobiert. Zuerst legte ich das UpdatePanel in die Fußzeile des Repeaters, und ich änderte repParent in die kommentierte Version. Dies führte zu einigen wirklich seltsamen Ergebnissen, wo die Eingabefelder aktualisiert wurden, aber jetzt sind sie über meinem gesamten Repeater o_0?

UpdatePanel 'working'

Dann zog ich den Update aus dem Repeater, und aktualisiert, aber es erfrischt die gesamte Seite. Ich würde mich damit begnügen, nur die Fußzeile zu aktualisieren, aber es wäre nett, diese Schaltflächen zum Hinzufügen/Löschen in derselben Update-Leiste zu verwenden. Wie sollte ich das einrichten, so dass es nur erfrischt, was in diesem Brunnen ist?

wie angefordert;

<asp:Repeater ID="repHW" runat="server" OnItemCommand="rep_ItemCommand"> 
     <HeaderTemplate> 
      <table style="width:100%; padding-bottom:10px" id="HWtable"> 
       <tr style="font-weight: bold"><td>Product</td><td>Part Number</td><td>Cost</td><td>Unit Price</td><td>Quantity</td><td>Price</td><td>Delete</td></tr> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <tr> 
       <asp:HiddenField ID="Category" Value="Hardware" runat="server"/> 
       <td><asp:Label ID="Product" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.Name") %>' /></td> <!--TODO: make this clickable to edit --> 
       <td><asp:Label ID="PartNumber" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.PartNumber") %>' /></td> 
       <td><asp:Label ID="PartCost" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.Cost") %>' /></td> 
       <td><asp:Label ID="UnitPrice" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.Price") %>' /></td> 
       <td><asp:Label ID="Quantity" runat="server" Text='<%# Eval("Quantity") %>' /></td> 
       <td><asp:Label ID="Price" runat="server" Text='<%# Eval("Total") %>' /></td> 
       <td><asp:Button class="btn btn-danger" ID="DeleteHardware" runat="server" Text="Delete" CommandName="Delete" CommandArgument='<%# Container.ItemIndex %>'/></td> 
      </tr> 
     </ItemTemplate> 
     <FooterTemplate> 
      <tr> 
       <asp:UpdatePanel ID="UpdateHardwareLine" updatemode="Conditional" runat="server" ChildrenAsTriggers="true"> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="AddProduct" EventName="SelectedIndexChanged" /> 
        </Triggers> 
        <ContentTemplate> 
         <asp:HiddenField ID="AddCategory" Value="Hardware" runat="server"/> 
         <td><telerik:RadComboBox runat="server" ID="AddProduct" ClientIDMode="static" Filter="Contains" EnableLoadOnDemand="true" AutoPostBack="true" OnSelectedIndexChanged="ProductSelected" OnDataBinding="LoadProductsByCategory"/></td> 
         <td><asp:TextBox runat="server" ID="AddPartNumber" ClientIDMode="static"/></td> 
         <td><asp:TextBox runat="server" ID="AddPartCost" ClientIDMode="static"/></td> 
         <td><asp:TextBox runat="server" ID="AddUnitPrice" ClientIDMode="static"/></td> 
         <td><asp:TextBox runat="server" ID="AddQuantity" ClientIDMode="static"/></td> 
         <td><asp:Button class="btn btn-success" ID="AddHardware" runat="server" Text="Add" CommandName="Add" CommandArgument='<%# DataBinder.Eval(Container, "ItemIndex") %>' onClientClick="return EmptyFieldCheck('Hardware');"/></td> 
        </ContentTemplate> 
       </asp:UpdatePanel> 
      </tr></table>  
     </FooterTemplate> 
    </asp:Repeater> 
+0

Können Sie uns den relevanten Markup des Repeaters, seiner Fußzeile und des UpdatePanels zeigen? – ConnorsFan

+0

@ConnorsFan aktualisiert das OP. Es hat sich ein paar Mal offensichtlich geändert, wie ich es gebastelt habe, aber so sitzt es jetzt –

+0

Das UpdatePanel wird als 'div' oder' span' implementiert, abhängig von der Eigenschaft 'RenderMode' (Standard ist' div'). Sie können diese Art von Element nicht zwischen eine "" und ihre "" Kinder einfügen. – ConnorsFan

Antwort

0

Sie können den Inhalt der Fußzeile in einer separaten Tabelle anzeigen. Etwas wie folgt aus:

<FooterTemplate> 
    <tr> 
     <td colspan="7"> 
      <asp:UpdatePanel ID="UpdateHardwareLine" updatemode="Conditional" runat="server" ChildrenAsTriggers="true"> 
       <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="AddProduct" EventName="SelectedIndexChanged" /> 
       </Triggers> 
       <ContentTemplate> 
        <table style="width:100%;"> 
         <tr> 
          <asp:HiddenField ID="AddCategory" Value="Hardware" runat="server"/> 
          <td><telerik:RadComboBox runat="server" ID="AddProduct" ClientIDMode="static" Filter="Contains" EnableLoadOnDemand="true" AutoPostBack="true" OnSelectedIndexChanged="ProductSelected" OnDataBinding="LoadProductsByCategory"/></td> 
          ... 
         </tr> 
        </table> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
     </td> 
    </tr> 
</FooterTemplate> 

Die Herausforderung wäre, dass innere Tisch richtig mit dem äußeren ausgerichtet zu bekommen. Wahrscheinlich müssen Sie als ersten Schritt CellPadding="0" und CellSpacing="0" für beide Tabellen festlegen.

+0

Okay, ich werde das durcheinander bringen. Wäre es ratsam, ein updatepanel für den Brunnen zu verwenden und es außerhalb des Repeaters zu setzen, wenn ich auch auf den add/delete Knöpfen aktualisieren wollte? (siehe Screenshot) –

+0

Sorry, ich verstehe nicht, was das "gut" ist (mein Englisch ist etwas begrenzt). Wenn Sie über Ihre aktuelle Fußzeile sprechen, könnte es sich sicherlich außerhalb des Repeaters befinden, da es keine Summen oder andere Informationen anzeigt, die normalerweise in einer Fußzeile gefunden werden. – ConnorsFan