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:
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?
Werfen Sie einen Blick auf diese SO Antwort: http://stackoverflow.com/questions/9969061/scroll-to-bottom-of-c-sharp-datagridview –
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). –
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