- PR -

GridviewのRowCreatedイベントからsubプロシージャを呼び出す

1
投稿者投稿内容
oka
常連さん
会議室デビュー日: 2007/11/19
投稿数: 25
投稿日時: 2008-01-22 22:58
お世話になります。VisualStudio2005でWebアプリを作成しています。

以下のソースでGridveiwのページングの部分に「次へ」「前へ」ボタンを
追加する処理を作成しました。
しかし、この設定をするGridViewが複数あるため、この処理をsubプロシージャに
まとめて各GridViewのRowCreatedイベントから呼び出すようにしたいと思っています。
このような場合、RowCreatedイベントプロシージャからSubプロシージャへ
どのような形で引数を受け渡せばよいのでしょうか?

Protected Sub GridView1_RowCreated( _
ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs _
) Handles GridView1.RowCreated

If e.Row.RowType = DataControlRowType.Pager Then
If GridView1.PageIndex <> GridView1.PageCount - 1 Then
Dim lbn As LinkButton = New LinkButton()
lbn.CommandName = "Page"
lbn.CommandArgument = "Next"
lbn.Text = ">"
Dim tc1 As TableCell = New TableCell()
tc1.Controls.Add(lbn)
e.Row.Cells(0).Controls(0).Controls(0).Controls.Add(tc1)
End If
If (GridView1.PageIndex <> 0) Then
Dim lbp As LinkButton = New LinkButton()
lbp.CommandName = "Page"
lbp.CommandArgument = "Prev"
lbp.Text = "<"
Dim tc2 As TableCell = New TableCell()
tc2.Controls.Add(lbp)
e.Row.Cells(0).Controls(0).Controls(0).Controls.AddAt(0, tc2)
End If

End If

End Sub

アドバイスをよろしくお願いいたします。
pitfall
会議室デビュー日: 2007/12/05
投稿数: 14
お住まい・勤務地: 東京都
投稿日時: 2008-01-23 03:24
以下のコードで実現できませんか?(検証はしていません…)

イベントハンドラの引数にはGridView1そのものが入っていますので、sender, eの
両方とも引数に渡せばいいかと思います。

// RowCreatedイベントハンドラ
Protected Sub GridView1_RowCreated( _
ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs _
) Handles GridView1.RowCreated

CreatePager(sender, e)

End Sub

// 追加するプロシージャ
Private Sub CreatePager(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)

// senderをGridViewにキャスト
Dim gv As GridView = CType(sender, GridView)

If e.Row.RowType = DataControlRowType.Pager Then
If gv.PageIndex <> gv.PageCount - 1 Then
Dim lbn As LinkButton = New LinkButton()
lbn.CommandName = "Page"
lbn.CommandArgument = "Next"
lbn.Text = ">"
Dim tc1 As TableCell = New TableCell()
tc1.Controls.Add(lbn)
e.Row.Cells(0).Controls(0).Controls(0).Controls.Add(tc1)
End If
If (gv.PageIndex <> 0) Then
Dim lbp As LinkButton = New LinkButton()
lbp.CommandName = "Page"
lbp.CommandArgument = "Prev"
lbp.Text = "<"
Dim tc2 As TableCell = New TableCell()
tc2.Controls.Add(lbp)
e.Row.Cells(0).Controls(0).Controls(0).Controls.AddAt(0, tc2)
End If

End If

End Sub
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-01-23 06:57
コードを記述するよりも
Modeに「NextPrevious」で設定すれば解決しませんか?

コード:
      <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
        AutoGenerateColumns="False" DataKeyNames="CustomerID" 
        DataSourceID="SqlDataSource1" PageSize="5">
        <PagerSettings Mode="NextPrevious" />
        <Columns>
        </Columns>
      </asp:GridView>



_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
oka
常連さん
会議室デビュー日: 2007/11/19
投稿数: 25
投稿日時: 2008-01-23 21:34
返信ありがとうございます。

Accessさん、説明が足りず大変申し訳ございません。
ページングのページ番号を表示したまま、「次へ」「前へ」ボタンを追加したいため、
コードを記述いたしました。
pitfallさんのコードを記述して、実現できました。

お世話になりました。

Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-01-24 06:25
引用:

Accessさん、説明が足りず大変申し訳ございません。
ページングのページ番号を表示したまま、「次へ」「前へ」ボタンを追加したいため、
コードを記述いたしました。


本来は、GridViewのカスタムコントロールを作成すべきですね。

スコットさんがGridViewのカスタムコントロールを公開
していますので時間のあるときにでもチャレンジしてみたらどうでしょうか。

http://aspnet.4guysfromrolla.com/articles/012308-1.aspx

ちなみに、
ASP.NET 3.5のDataPagerコントロールを使用するとコードレスで
できるんですけどね!

こんな感じです。
http://asp35.maximumaspbeta.com/Goto.aspx?aid=080120VB-2

GridViewのページングは、データベースのテーブルからすべてのレコードを
読み込みますが、このDataPagerはカレントのページに表示するレコードのみ
読み込むように最適化されているスグレものです。

あと、AJAX Control ToolkitのSliderExtenderコントロールを使用すると
スライダーを移動してページングさせることもできます。

こんな感じです。
http://asp35.maximumaspbeta.com/Goto.aspx?aid=080124CS-1

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集


[ メッセージ編集済み 編集者: Access 編集日時 2008-01-24 07:57 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-01-24 11:26
> GridViewのページングは、データベースのテーブルからすべてのレコードを
> 読み込みますが、このDataPagerはカレントのページに表示するレコードのみ
> 読み込むように最適化されているスグレものです。

DataPagerがカレントのページに表示するレコードのみ読み込む、って本当ですか?
LinkDataSourceにはそのような機能がありますが、DataPagerは単純にページャの
表示を受け持っているだけじゃないでしょうか。
どのようにして確かめられました?
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2008-01-24 22:49
>DataPagerがカレントのページに表示するレコードのみ読み込む、って本当ですか?
>LinkDataSourceにはそのような機能がありますが、DataPagerは単純にページャの
>表示を受け持っているだけじゃないでしょうか。
>どのようにして確かめられました?

さすがするどい質問ですね!

おっしゃるようにDataPagerがサポートしているのではなく
LinqDataSourceコントロールがサポートしている機能でした。

つまり、ListViewにLinqDataSourceをバインドするとDataPagerでカレントページに
表示するレコードのみ読み込みます。

ListViewにSqlDataSourceをバインドしたときはDataPagerで全件読み込んで
カレントページのレコードを表示します。

念のためSQL Server Profilerにて確認しました。

もちろん、GridViewにLinqDataSourceをバインドしてページング機能を
有効にするとカレントページに表示するレコードのみ読み込みます。

ASP.NET 3.5ではSqlDataSourceの代わりにLinqDataSourceを
利用した方がよいですね。


_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
oka
常連さん
会議室デビュー日: 2007/11/19
投稿数: 25
投稿日時: 2008-01-24 23:30
Accessさん返信ありがとうございます。
本来はカスタムコントロールを作成するべきなのですね。
やり方を確認してみます。
ASP.NET 3.5のDataPagerコントロールは見やすいですね!

いろいろな情報をありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)