2016-07-11 9 views
0

ich eine verschachtelte Gridview haben wie folgt:Nested Gridview sollte/Einsturz erweitern, wenn Zeile geklickt wird

<asp:GridView ID="gvParent" runat="server" DataKeyNames="id"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:GridView ID="gvChild" runat="server"> 
        <Columns> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:Label ID="lblChild1" runat="server"/> 
          </ItemTemplate> 
         </asp:TemplateField> 
         //... some more child columns 
        </Columns> 
       </asp:GridView> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Label ID="lblParent1" runat="server"/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     //... some more parent columns 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:HiddenField ID="IsExpanded" ClientIDMode="Static" runat="server" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Was ich tun möchte, ist, wenn der Benutzer eine beliebige Stelle auf der übergeordneten Zeile klickt, wird das Kind Reihe, zeigt Alle Zeilen in der untergeordneten GridView, die sich auf das übergeordnete Element beziehen. Wenn ich dann erneut klicke, sollte es zusammenklappen.

Ich kann die Daten in die GridViews fein bekommen und kann die Expand/Collapse Funktion wie in this tutorial bekommen, aber ich will nicht nur das Bild klickbar haben, ich möchte die ganze Zeile anklickbar.

zumindest versuchen und es ich die gleiche Logik aus dem Tutorial zu erweitern: auf der rechten Seite des angeklickten Spalte in dieser Zeile auf die

$(function() { 
    $("[id*=gvParent] td").click(function() { 
     $(this).closest("tr").after("<tr><td></td><td colspan = '999'>" + $(this).next().html() + "</td></tr>"); 
    }); 
}); 

Aber es um den Inhalt der Spalte nur Kopien nächste Reihe (siehe snip). Ich bin mir sicher, es ist wahrscheinlich einfach, aber ich kann nirgends die Antwort finden!

UPDATE:

Ich habe jetzt:

$("[id*=gvFileUploadAdmin] td").click(function() { 
    if ($("#IsExpanded").val() == "expanded") { 
     debugger; 
     collapseRow(this); 
    } 
    else if (typeof $("#IsExpanded").val() == 'undefined' 
      || $("#IsExpanded").val() == "collapsed") { 
     expandRow(this); 
    } 
}); 

function expandRow(row) { 
    $(row) 
     .closest("tr") 
     .after("<tr><td></td><td colspan = '999'>" + 
      $("[id*=pnlFiles]", $(row).closest("tr")).html() + 
      "</td></tr>");  
    $("#IsExpanded").val("expanded"); 
}; 

function collapseRow(row) { 
    $(row).closest("tr").next().remove(); 
    $("#IsExpanded").val("collapsed"); 
} 

Was mir Reihen zu öffnen und zu schließen einzelne erlaubt, aber wenn eine Zeile offen ist, und dann wird eine andere geöffnet, wird die Zeile neben dem gelöscht . Mit den eindeutigen IDs ist definitiv etwas los, aber ich bin mir nicht sicher, wie ich es beheben soll. Ich habe einige C# im Hintergrund haben dies zu tun:

HiddenField IsExpanded = row.FindControl("IsExpanded") as HiddenField; 
var uniqueId = IsExpanded.UniqueID; 
IsExpanded.Value = Request.Form[uniqueId]; 

Aber wenn dieser entfernt ist es macht keinen Unterschied, wie es funktioniert, weil Request.Form [UniqueId] gibt null zurück.

Antwort

0

Also habe ich es endlich geschafft, es zum Laufen zu bringen!Hier ist, was ich habe (beachten Sie, dass dies nicht die Zeile nicht erweitern, wenn der Benutzer auf eine Schaltfläche in dieser Zeile drückt):

$(function() { 
    $("[id*=gvParent] td").click(function() { 
     if ($(this).parents('tr').find('input[type="hidden"]').val() == "expanded") 
      collapseRow(this); 
     else 
      expandRow(this); 
    }); 

    // Ensure the row doesn't expand/collapse if a button is clicked 
    $("[id*=gvParent] td .btn").click(function (e) { 
     e.stopPropagation(); 
    }); 
    //Ensures any clicks on the child row aren't registered 
    $("[id*=gvParent] td .gvChild").click(function (e) { 
     e.stopPropagation(); 
    }); 
}); 

function expandRow(row) { 
    $(row).closest("tr").after("<tr><td></td><td colspan = '999'>" + 
       $("[id*=pnlFiles]", $(row).closest("tr")).html() + 
       "</td></tr>"); 
    $(row).parents('tr').find('input[type="hidden"]').val("expanded"); 
}; 

function collapseRow(row) { 
    $(row).closest("tr").next().hide(); 
    $(row).parents('tr').find('input[type="hidden"]').val("collapsed"); 
} 

ich auch die ClientIDMode aus statischen geändert:

<asp:HiddenField ID="IsExpanded" ClientIDMode="Static" runat="server" /> 

zu AutoID:

<asp:HiddenField ID="IsExpanded" ClientIDMode="AutoID" runat="server" /> 
0

Haben Sie versucht, eine Listview anstelle einer Gridview zu verwenden? Ich benutze einen LinkButton, um die Zeilenerweiterung zu aktivieren/deaktivieren.

  1. In der ItemTemplate umschließen Sie Ihre Anzeigezellen innerhalb der LinkButton-Definition.

<ItemTemplate> 
 
    <tr> 
 
    <td> 
 
     <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Select"> 
 
     LOC: 
 
     <asp:Label Text='<%# Eval("LocationCode") %>' runat="server" ID="LocationCodeLabel" /></span> 
 
     </asp:LinkButton> 
 
    </td> 
 
    <td> 
 
     <asp:Button ID="editLocation" runat="server" Text="EDIT" CommandName="Edit" CommandArgument='<%# Eval("LocationID") %>' /> 
 
     <asp:Button ID="deleteLocation" runat="server" Text="DELETE" CommandName="Delete" CommandArgument='<%# Eval("LocationID") %>' /> 
 
    </td> 
 
    </tr> 
 
</ItemTemplate>

  1. der Linkbutton Command = "Select" des ItemTemplate Geben - dies den Effekt der Aktivierung des SelectedItemTemplate hat.

  2. Umschließen Sie in der SelectedItemTemplate die Datenzellen mit einem anderen LinkButton. Der LinkButton CommandName = "UnSelect".

Die ListView behandelt den Select-Befehl kostenlos. Der UnSelect muss vom Listview1_ItemCommand() Event Handler behandelt werden.

Sie können Ihre GridView in eine Div in SelectedItemTemplate einfügen. Ein anderer ListView, der in dem SelectedItemTemplate eingebettet wird, wäre jedoch ideal.

+0

Vielen Dank für Ihre Antwort, aber nach [diese Frage] (http://stackoverflow.com/questions/891918/asp-net-grid-view-vs-list-view), ein Listview ist nicht wirklich wonach ich suche. Außerdem möchte ich die ganze Zeile klickbar machen, nicht nur eine Schaltfläche. – madster

+0

Die Verknüpfungsschaltfläche ist nicht sichtbar - sie macht im Wesentlichen die gesamte Zeile anklickbar/auswählbar. – Renshai

+0

Aoplogies für die Aufsicht vor. Ich habe jetzt alle oben genannten implementiert, aber die verschachtelte Gridview wird nicht angezeigt, wenn die Zeile ausgewählt ist, die gleiche Liste wird angezeigt. Sobald es wieder ausgewählt ist, verschwinden alle Zeilen. Ich denke nicht, dass dies der richtige Ansatz ist, da ich nur die Felder in der ausgewählten Elementvorlage wiederhole, und ich muss sie manuell bearbeiten, um sie in einem Rasterformat anzuzeigen, während dies bereits bei einer Rasteransicht der Fall ist. – madster