2

Wenn meine Gridview mit "wenigen Zeilen" von Daten gebunden ist, ist meine aktuelle Vorgehensweise zum Hinzufügen einer neuen Zeile ein passendes Design und funktioniert "gut". Wenn jedoch mit vielen Datenzeilen verknüpft ist, ist mein aktueller Ansatz zum Hinzufügen einer neuen Zeile fehlerhaft: Die von mir verwendete EmptyDataTemplate wird mit der FooterTemplate freigegeben. Wenn ich also 3 Datenzeilen habe und auf "Neuen Datensatz hinzufügen" klicke, wird das Raster erneut mit einer vierten Zeile angezeigt, die alle für die Dateneingabe "vorbereitet" sind. Wenn ich jedoch 30 Zeilen habe, ist die Anzeige der Zeile, die eingefügt werden soll, so weit unten, dass ein Scroll erforderlich ist.Zeigen Sie nur die Fußzeile für das Einfügen neuer Zeile in Gridview in .NET 3.5

Protected Sub AddNewRecord(ByVal sender As Object, ByVal e As EventArgs) 
    GridView1.ShowFooter = True 
    'rebind data so GridView1_RowDataBound gets a chance to populate the footer 
    iSubscriberID = Session("SubscriberID") 
    LoadDataGrid(iSubscriberID) 
End Sub 

Ich hoffe, den Betrieb des Hinzufügens einer neuen Zeile zu verbessern, um der Lage sein, aber immer noch die FooterTemplate verwenden.

Gibt es einen Code, der zu meinem GridView1_RowDataBound Handler hinzugefügt werden könnte, um vorhandene Datenzeilen zu verbergen, aber die EmptyDataTemplate für die Einfügung über die FooterTemplate offen legen? Ich habe versucht, ein paar Dinge dort ohne Erfolg zu hacken. Hier ist meine vorhandenen Code für diesen Handler:

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) _ 
    Handles GridView1.RowDataBound 
    '-------------------------------------------------------------------------------------------* 
    ' Handle 'Insert' requirements: 
    ' - Bind dropdownlist controls with the possible incumbents and backups for some new position 
    '-------------------------------------------------------------------------------------------* 
    If e.Row.RowType = DataControlRowType.Footer Then 
     ' Finding the Dropdown control. 
     Dim ctrl As Control = e.Row.FindControl("ddlUsers") 
     If ctrl IsNot Nothing Then 
      Dim dd As DropDownList = TryCast(ctrl, DropDownList) 
      dd.DataSource = allUsers 
      dd.DataBind() 
     End If 
     Dim ctrlB As Control = e.Row.FindControl("ddlUsersBackup") 
     If ctrlB IsNot Nothing Then 
      Dim ddB As DropDownList = TryCast(ctrlB, DropDownList) 
      ddB.DataSource = allUsers 
      ddB.DataBind() 
     End If 
    End If 
End Sub 

Ich verwende Template Definitionen für alle Spalten; Hier ist ein Beispiel, das einen Teil des FooterTemplate zeigt:

<asp:TemplateField HeaderText="Incumbent"> 
     <ItemTemplate> 
      <asp:Label ID="lblUser" runat="server" Text='<%# Eval("Incumbent")%>'></asp:Label> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <asp:Label ID="lblUser" runat="server" Text='<%# Eval("Incumbent")%>' Visible = "false"></asp:Label>    
      <asp:DropDownList Width="100%" runat="server" 
       id="ddlUsers" AutoPostBack="true" 
       DataTextField="FullName" DataValueField="UserID" 
       OnSelectedIndexChanged="ddlUsers_SelectedIndexChanged"> 
      </asp:DropDownList> 
     </EditItemTemplate> 
     <FooterTemplate> 
      <asp:Label ID="lblUser" runat="server" Text='Set Incumbent'></asp:Label> 
      <br />   
      <asp:DropDownList Width="100%" runat="server" 
       id="ddlUsers" AutoPostBack="true" 
       DataTextField="FullName" DataValueField="UserID" 
       OnSelectedIndexChanged="ddlUsers_SelectedIndexChanged"> 
      </asp:DropDownList> 
     </FooterTemplate>    
    </asp:TemplateField> 

Eine andere Idee hatte ich, das wäre vielleicht arbeiten, um die Seite nach unten scrollen, um die „Einfügen“ Zeile immer sichtbar ist, wenn die gridview repopulating mit ShowFooter = True. Dies scheint jedoch etwas Javascript zu beinhalten, das ich auf dieser Seite lieber vermeiden würde.

EDIT: 18. Februar 2016 - Der Versuch, Paging zu Gridview hinzuzufügen - eine neue Komplikation

@Lesmian - Hinzufügen eines Pagers, wie Sie war einfach vorgeschlagen, aber jetzt bricht es völlig die Gridview: does not support server-side data paging

Ich habe diesen Fehler recherchiert und kann nicht erkennen, warum meine stark typisierte Sammlung für Positionen das Paging nicht unterstützen kann. hier ist der Code, meine Datenquelle für das Gridview instanziiert:

Public Class Positions 
Implements IEnumerable(Of Position) 
Public List As New List(Of Position) 
Public Function GetEnumerator() As IEnumerator(Of Position) _ 
       Implements IEnumerable(Of Position).GetEnumerator 
    Return List.GetEnumerator() 
End Function 
Private Function GetEnumerator1() As IEnumerator _ 
       Implements IEnumerable.GetEnumerator 
    Return List.GetEnumerator() 
End Function 
Public Sub New(ByVal subscriberID As Integer, Optional ByVal filterOnUserID As Integer = 0) 
    Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString 
    Dim connection As New SqlConnection(sConnDatabase) 
    Dim cmd As SqlCommand 
    Try 
     cmd = New SqlCommand("dbo.GetPositionsBySubscriberID", connection) 
     cmd.CommandType = CommandType.StoredProcedure 
     cmd.Parameters.AddWithValue("@SubscriberID", subscriberID) 
     cmd.Parameters.AddWithValue("@UserID", filterOnUserID) 'non-zero UserID returns only positions where User is Incumbent or Backup 
     connection.Open() 
     Dim objReader As SqlDataReader = cmd.ExecuteReader() 
     Do While objReader.Read() 
      Dim p As Position = New Position(objReader) 
      List.Add(p) 
     Loop 
     objReader.Close() 
     connection.Close() 

Der Ansatz eines Pager des Hinzufügens, das ursprüngliche Problem zu lösen, hat ein neues Thema eröffnet. Irgendwelche Gedanken dazu?

+0

Werfen Sie einen Blick auf diese SO Antwort: http://stackoverflow.com/questions/9969061/scroll-to-bottom-of-c-sharp-datagridview –

+1

Dank Ron, aber das SO Thema, das Sie Anliegen betrifft gewinnen Formen und die DataGridView (und nicht mein Fall, der Webformulare und das GridView-Steuerelement ist). –

+3

Haben Sie versucht, die Methode 'Focus()' für ein geeignetes Steuerelement in der Fußzeile zu verwenden? Soweit ich weiß, wird die Seite zu diesem Steuerelement blättern ... Siehe [hier] (https://msdn.microsoft.com/en-us/library/ms178232.aspx). Dies wird, glaube ich, Standard-'Page' 'Javascript' verwenden, um den Fokus zu setzen, aber vielleicht ist das akzeptabel ..? – user1429080

Antwort

2

Die eigentliche Frage im OP scheint auf "Wie halte ich die Zeile zum Einfügen in Sicht" nach Post zurück zu kochen.

Das Objekt Page verfügt bereits über eine Methode namens Focus, die verwendet werden kann, um zu bewirken, dass ein bestimmtes Steuerelement den Fokus erhält, nachdem das Seitenrendering abgeschlossen ist.

Wenn ein Steuerelement außerhalb des sichtbaren Bereichs des Browsers den Fokus erhält, blättert der Browser dieses Steuerelement in die Ansicht, damit der Benutzer sehen kann, was fokussiert ist.

Um die Einfügereihe sichtbar zu machen, stellen Sie sicher, dass Sie den Fokus auf ein geeignetes Steuerelement in der Zeile legen, wenn Sie es im nachfolgenden Code sichtbar machen.

0

Scrolling Gridview benötigt Javascript, aber wenn Sie es nicht verwenden möchten, ist vielleicht ein anderer Ansatz für Ihre Bedürfnisse geeignet. Wenn Sie Ihrer Gridview einen Pager hinzufügen und eine kleine Anzahl von Elementen pro Seite festlegen, wird beim Hinzufügen eines neuen Elements die Bildlaufleiste nicht angezeigt. Mit diesem Ansatz haben wir jedoch andere Fehler - Neuteil auf einer neue Seite erscheinen könnte, so dass Sie Raster zwingen sollten letzte Seite zu zeigen, dann werden neue Zeilen immer sichtbar sein:

Protected Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs) _ 
    Handles GridView1.RowCommand 

    ' Insert data if the CommandName == "Insert" 
    ' and the validation controls indicate valid data... 
    If e.CommandName = "Insert" AndAlso Page.IsValid Then 
     ' Insert new record 
     GridView1DataSource.Insert() 
     ' Indicate that the user needs to be sent to the last page 
     SendUserToLastPage = True 
    End If 
End Sub 
Protected Sub GridView1_DataBound(sender As Object, e As EventArgs) _ 
    Handles GridView1.DataBound 

    ' Send user to last page of data, if needed 
    If SendUserToLastPage Then 
     GridView1.PageIndex = GridView1.PageCount - 1 
    End If 
End Sub 

Hier können Sie komplettes Beispiel für diesen Ansatz finden : http://www.asp.net/web-forms/overview/data-access/enhancing-the-gridview/inserting-a-new-record-from-the-gridview-s-footer-vb

EDIT: 18. Februar 2016 - Datenquelle nicht auf serverseitige Daten Paging-Fehler

Ihre individuelle Sammlung unterstützen muss ICollection-Schnittstelle zu arbeiten, um mit Gridview-Server-Seite Paging implementieren. IEnumerable implementiert ICollection nicht, weshalb Sie einen Fehler erhalten.Für ein Beispiel der Implementierung in Vb können Sie dies lesen: https://support.microsoft.com/en-us/kb/306961 und dies: http://www.codeproject.com/Articles/265692/Having-fun-with-custom-collections. Danach sollte GridView den Rest für Sie erledigen.

+0

danke. Ich lese auch das ganze Tutorial von Scott Mitchell. Bitte beachten Sie meine Bearbeitung: 18. Februar 2016 der ursprünglichen Post über diese Verwandlung in ein neues Problem. –

+0

Ich habe meine Antwort entsprechend aktualisiert. Hoffe das löst dein Problem. – Lesmian

0

Allgemeine Idee:
1. Legen Sie Ihre Gridview in einer festen Höhe scrollbaren div
2. Unterhalb der div Platz einzige Zeile Tabelle mit allen Kontrollen Sie neuen Datensatz und „Hinzufügen“ einfügen müssen Taste
3. Wenn möglich, verwenden Sie SqlDataSource zum Auffüllen von GridView und fügen Sie den Befehl insert zur SqlDataSource hinzu
4. Verwenden Sie im InsertParameters-Block asp: controlParameter, um an neue Werte zu binden.
5. Fügen Sie Code zu Add_Click Handler

mySqlDataSource.Insert() 

PS: Noch besser, schreiben Sie Ihre Gridview Listview (unterstützt von .NET 3.5). Dies gibt Ihnen viel mehr Flexibilität. Zum Beispiel können Sie in die erste Zeile einfügen.

+0

danke für die generelle Idee. Wie das OP erklärt, funktioniert das Design sehr gut, bis die Anzahl der Gridview-Zeilen größer als ein Bildschirm wird. Ich zögere sehr, meinen Datenquellenkonstruktor neu zu schreiben (bitte sehen Sie mein spätes EDIT zum OP) und zu ListView zu wechseln. Der Kern Ihres Vorschlags beinhaltet fast eine vollständige Neuschreibung. –

Verwandte Themen