2

私の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のを破る:does not support server-side data paging

私はそのエラーを調べて、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のための私のデータソースをインスタンス化するコードがあります。それについての考えは?

+0

このSOの答えをご覧ください:http://stackoverflow.com/questions/9969061/scroll-to-bottom-of-c-sharp-datagridview –

+1

ありがとうございました。 DataGridView(私の場合ではなく、WebフォームとGridViewコントロール)。 –

+3

フッターの適切なコントロールで 'Focus()'メソッドを使用しようとしましたか?私が知る限り、ページはそのコントロールにスクロールします。[here](https://msdn.microsoft.com/en-us/library/ms178232.aspx)を参照してください。これは私がフォーカスを設定するデフォルトの 'Page'' javascript'を使うと思いますが、おそらくそれは受け入れられます..? – user1429080

答えて

2

実際の質問では、ポストバック後に「ビューに挿入する行を維持するにはどうすればよいですか」とのように思われます。

オブジェクトにはすでにFocusというメソッドがあります。このメソッドは、ページのレンダリングが完了した後に特定のコントロールにフォーカスを受け取らせるために使用できます。

ブラウザの可視領域外にあるコントロールにフォーカスが当てられると、ブラウザーはそのコントロールをビューにスクロールして、ユーザーが何をフォーカスしているかを確認できます。

インサート行を表示するには、行の適切なコントロールにコードを表示するときにフォーカスを設定してください。

0

スクロールグリッドビューにはjavascriptが必要ですが、使用したくない場合は、他の方法が必要に応じて適しています。ポケットベルをグリッドビューに追加し、ページごとに少数のアイテムを設定した場合、新しいアイテムを追加してもスクロールバーは表示されません。このアプローチでは、我々は、しかし、他の欠陥いる - あなたは最後のページを表示するグリッドを強制する必要がありますので、新しい項目が新しいページに表示される可能性があり、新しい行が常に表示されます:

ここ
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 

あなたは、このアプローチの完全な例を見つけることができます:http://www.asp.net/web-forms/overview/data-access/enhancing-the-gridview/inserting-a-new-record-from-the-gridview-s-footer-vb

EDIT:2016年2月18日 - データソースは、サーバー側のデータページングエラーをサポートしていません

カスタムコレクションはGridViewのサーバー側のページングを使用するためにICollectionインターフェイスを実装する必要があります。 IEnumerableはICollectionを実装しないため、エラーが発生します。vbでの実装の例については、https://support.microsoft.com/en-us/kb/306961とこれを読むことができます:http://www.codeproject.com/Articles/265692/Having-fun-with-custom-collections。その後、GridViewはあなたのために残りの作業を行う必要があります。

+0

ありがとうございます。スコット・ミッチェルのチュートリアル全体を読みました。私の編集編集:2016年2月18日、新しい問題へのこのモーフィングに関するオリジナルの投稿をご覧ください。 –

+0

私はそれに応じて私の答えを更新しました。これがあなたの問題を解決することを願っています。 – Lesmian

0

一般的なアイデア:あなたは新しいレコードを挿入し、する必要があるすべてのコントロールと、固定高さ、スクロールのdiv divの場所一行テーブルの下
2.であなたのGridViewのボタン
3「追加」
1.。可能であれば、SqlDataSourceを使用してGridViewにデータを挿入し、SqlDataSourceにinsertコマンドを追加します。
4. InsertParametersブロックで、asp:controlParameterを使用して新しい値にバインドします。
5.

mySqlDataSource.Insert() 

にAdd_ClickハンドラにPSのコードを追加します。ListViewコントロール(.NET 3.5でサポートされている)に、あなたのGridViewを書き換え、さらに良いが。これにより、柔軟性がさらに向上します。たとえば、最初の行に挿入することができます。

+0

一般的な考えに感謝します。 OP状態では、グリッドビューの行数が画面よりも大きくなるまでデザインがうまく機能します。私はデータソースコンストラクタを書き直すことに非常に戸惑う(私の最新のEDをOPに見てください)、リストビューに切り替えてください。あなたの提案の要点には、ほぼ完全な書き換えが含まれています。 –

関連する問題