asp.net
2009-03-13 13 views 1 likes 
1

私はリピータ内でネストされたgridviewを持っており、あまり成功することなくグリッドビューでページングを有効にしようとしています。GridViewのリピータ内でのページング

GridViewのデータバインドされたが、私のLoadData方法の背後にあるコードオブジェクトの一覧を取得するには、この

<asp:repeater....> 
    <asp:gridview id="GridView1" Datasource='<%# LoadData(CInt(Eval("Id"))) %>' 
     OnPageIndexChanging="GridViewPageIndexChanging" AllowPaging="true" 
PageSize="10" ............. </asp:GridView> 
</asp:repeater> 

のようなものです:

Public Function LoadData(ByVal Id As Integer) As IList(Of Client) 
      Dim ds As IList(Of Client) = client.GetClientById(Id) 
      Return ds 
     End Function 

そして、イベントハンドラは以下の通りである:

Protected Sub GridViewPageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) 
      sender.PageIndex = e.NewPageIndex 
End Sub 

私のコードはグリッドビューのページを変更しませんが、何か不足していますか?

ご協力いただきありがとうございます。

答えて

1

私は評価上の例外を持って結合します後、私は、さらに一歩 です。 私はもう結合した後、評価の例外を得ることはありません%>

<%#loaddataの(DataBinder.Eval(Container.DataItem、「ID」))へのデータソースでそれを変更しました。しかし、私のグリッドはまだ空です。

[更新]

[OK]を、私はそれがハッシュテーブルに私のIdsを保つことによって解決してしまったと私はハッシュテーブルから同等のIDを持つ私のGridViewを再バインド。

あなたのお役に立てる皆様に感謝しています。

3

DataBind()を呼び出す必要があります。

Dim grid as GridView = DirectCast(sender, GridView) 
grid.PageIndex = e.NewPageIndex 
grid.DataBind() 

EDIT

私はコメントすることはできませんので、まだ、答えに別の答えを作成すると、すべての混乱になり、私はこの1つだけを編集します。

リピータは、あなたが望むものに使用するのが間違っています。この問題は、GridViewのページイベントが発生したときにDataItemが保持されないという事実に起因します。したがって、「id」は何も評価されず、その後はゼロと評価されます。 Btw、C#ではnull例外が発生します。

私はあなたの代わりにDataListコントロールを使用することをお勧め:背後にあるコードで

<asp:DataList ID="DataList" runat="server" DataKeyField="id"> 
    <ItemTemplate> 
     <asp:GridView ID="Grid" runat="server" 
      AllowPaging="true" 
      PageSize="2" 
      OnPageIndexChanging="Grid_PageIndexChanging" 
      DataSource='<%# GetData(DirectCast(DataList.DataKeys(DirectCast(Container, DataListItem).ItemIndex), Integer)) %>' 
     > 
     </asp:GridView> 
     <hr /> 
    </ItemTemplate> 
</asp:DataList> 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     DataList.DataSource = New Integer() {1, 2, 3, 4, 5}.Select(Function(x) New With {.id = x}) 
     DataList.DataBind() 
    End If 
End Sub 

Protected Function GetData(ByVal id As Integer) As String() 
    Dim arr As String() = New String(4) {} 
    For i As Integer = 0 To arr.Length - 1 
     arr(i) = String.Format("id {0}; grid item {1}", id, i) 
    Next 
    Return arr 
End Function 

Protected Sub Grid_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs) 
    Dim grid As GridView = DirectCast(sender, GridView) 
    grid.PageIndex = e.NewPageIndex 
    grid.DataBind() 
End Sub 

このコードは動作します - 私がテストしました。個人的には、私はバインディング式を使うのが好きではありません。

+1

ありがとうございましたruslan次のエラーがあります。 "Eval()、XPath()、Bind()などのデータバインディングメソッドは、データバインドされたコントロールのコンテキストでのみ使用できます。 – Youssef

0

あなたのマークアップが表示されます。サンプルでは、​​Repeaterコントロール内に直接GridViewがあります。 ItemTemplate内で必要になります。

<asp:Repeater ID="rpt" runat="server" ...> 
    <ItemTemplate> 
     <asp:GridView id="gv1" runat="server" ...> 
     . 
     . 
     . 
     </asp:GridView> 
    </ItemTemplate> 
</asp:Repeater> 
+0

ItemTemplateの内部にありますが、 – Youssef

関連する問題