PageSize = 20 (20 行) の GridView がありますが、垂直スクロールバーが表示されずに 10 行しか表示できません。
私の問題は、ポストバックが発生すると、別の行を選択したにもかかわらず、グリッドの一番上の行にジャンプすることです。選択した行までスクロールしたい。これどうやってするの?
MaintainScrollPositionOnPostback
ページディレクティブを追加します。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" MaintainScrollPositionOnPostback ="true"%>
別の方法として、GridViewをラップするDIVのscrollTopメソッドを使用します。
private void ScrollGrid()
{
int intScrollTo = this.gridView.SelectedIndex * (int)this.gridView.RowStyle.Height.Value;
string strScript = string.Empty;
strScript += "var gridView = document.getElementById('" + this.gridView.ClientID + "');\n";
strScript += "if (gridView != null && gridView.parentElement != null && gridView.parentElement.parentElement != null)\n";
strScript += " gridView.parentElement.parentElement.scrollTop = " + intScrollTo + ";\n";
ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "ScrollGrid", strScript, true);
}
編集: これはいくつかの理由で機能しません:
1)gridViewがPanelのようにNamingContainerコントロール内にある場合、クライアント側のIDはではないためClientId
。UniqueId
代わりに、oftehcontrolを使用する必要があります。
2)スクロール位置を計算するために行の高さを信頼することはできません。いずれかの列のテキストが複数行に折り返されている場合、またはいずれかの行にスタイルよりも高いものが含まれている場合、行のサイズは異なります
3)ブラウザが異なれば動作も異なります。jQueryscrollTop()
とscroll()
関数を使用する方が良いでしょう。それらを使用するにはscrollTop
、クライアント側で使用しHiddenControl
、サーバー側で読み取れるaの値を設定して位置をリセットする必要があります。クライアント側でレンダリングされるまで、ブラウザで行の高さを取得することはできません。