私のGridviewがデータの「数行」にバインドされているとき、新しい行を追加するための私の現在のアプローチは適切な設計であり、しかし、データの「多くの行」にバインドされている場合、新しい行を追加する現在の方法に欠陥があります。EmptyDataTemplate私はFooterTemplateを使用して公開しています。したがって、3行のデータがあり、[Add New Record]をクリックすると、グリッドが再表示され、4行目がすべてデータ入力用に「準備済み」になります。しかし、もし私が30の行を持っていれば、挿入される行の表示は今のところスクロールする必要があります。.Net 3.5のGridviewで新しい行を挿入するためのフッターのみを表示
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
私は新しい行を追加する操作を改善したいと考えていますが、依然としてFooterTemplateを使用しています。
既存のデータ行を非表示にまだFooterTemplateのを経由して挿入するためのEmptyDataTemplateを公開するために私のGridView1_RowDataBoundハンドラに追加できる任意のコードはありますか?私はそこでいくつかのことを成功させることなくハッキングしようとしました。ここではそのハンドラのための私の既存のコードは次のとおりです。
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
私はすべての列にTemplateField定義を使用しています。ここFooterTemplateのの一部を示した一例である:GridViewの再増殖するとき、「挿入」行が常に表示されますので、私はそれがうまくいくかもしれない持っていた
<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>
もう一つのアイデアは、下にページをスクロールするだろうShowFooter = Trueの場合。しかし、それは私がこのページで避けたがっているいくつかのJavaScriptを含んでいるようです。
EDIT:2016年2月18日 - GridViewのページングを追加しようとしました - 新しい合併症
@Lesmian - あなたが示唆したようにページャを追加することは簡単だったけど、今では完全にGridViewのを破る:
私はそのエラーを調べて、Positionsの厳密に型指定されたコレクションがページングをサポートできない理由がわかりません。元の問題を解決するためにページャを追加するアプローチは、新たな問題を開いた
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()
:ここにGridViewのための私のデータソースをインスタンス化するコードがあります。それについての考えは?
このSOの答えをご覧ください:http://stackoverflow.com/questions/9969061/scroll-to-bottom-of-c-sharp-datagridview –
ありがとうございました。 DataGridView(私の場合ではなく、WebフォームとGridViewコントロール)。 –
フッターの適切なコントロールで 'Focus()'メソッドを使用しようとしましたか?私が知る限り、ページはそのコントロールにスクロールします。[here](https://msdn.microsoft.com/en-us/library/ms178232.aspx)を参照してください。これは私がフォーカスを設定するデフォルトの 'Page'' javascript'を使うと思いますが、おそらくそれは受け入れられます..? – user1429080