- PR -

GridView内の二つのLinkButtonのCommandArgumentに値をセット

1
投稿者投稿内容
apo
常連さん
会議室デビュー日: 2008/11/10
投稿数: 27
投稿日時: 2009-03-10 18:10
Visual Web Developer 2008 Express Editionで
サーバ・クライアントのシステムを開発しています。
asp.net / 言語は vb.net
今、GridViewの中の違うセルに二つのLinkButtonをセットしています。
RowCreatedイベントで、この二つのボタンのCommandArgumentに数値をセットしています。
--- ソース参照 ---
Private Sub gv_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvIchiran.RowCreated
If e.Row.RowType = DataControlRowType.DataRow Then
Dim linkBtn1 As LinkButton = CType(e.Row.Cells(1).Controls(1), LinkButton)
Dim linkBtn2 As LinkButton = CType(e.Row.Cells(7).FindControl("linkBtnName2"), LinkButton)

If e.Row.RowType = DataControlRowType.Header Then
iRowCreatedNo = 1
ElseIf e.Row.RowType = DataControlRowType.DataRow Then
iRowCreatedNo += 1
ElseIf e.Row.RowType = DataControlRowType.EmptyDataRow Then
Exit Sub
ElseIf e.Row.RowType = DataControlRowType.Separator Then
iRowCreatedNo = iRowCreatedNo
ElseIf e.Row.RowType = DataControlRowType.Footer Then
iRowCreatedNo = 0
ElseIf e.Row.RowType = DataControlRowType.Pager Then
iRowCreatedNo = 0
End If
linkBtn1.CommandArgument = iRowCreatedNo
linkBtn2.CommandArgument = iRowCreatedNo + 23
linkBtn1.CommandName = "LinkBtn1"
linkBtn2.CommandName = "LinkBtn2"

End If
End Sub
---- ソース参照終わり ---

そして、LinkButton1をクリックすると、
RowCommandイベントでクリックしたLinkButton1の値を取得してみると
---- ソース2 ---
Private Sub gv_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvIchiran.RowCommand
If e.CommandName = "LinkBtn1" Or e.CommandName =
                    "LinkBtn2" Then
Dim index As Integer = Convert.ToInt32(e.CommandArgument) <--(2)
Dim row As GridViewRow = gvIchiran.Rows(index - 1)

End If
End Sub
--- ソース2 End ---
(2) で取得できた番号が、
1行目の場合で
LinkButton1.CommandArgument --> 24
LinkButton2.CommandArgument --> 47
になっています。

これは、正解は
LinkButton1 -> 1
LinkButton2 -> 24
とならなくてはいけませんが。

なぜこのようになるのかがわかりません。
linkButton1は、1〜23の番号が振られ
LinkButton2は、24〜46の番号が振られます。
これで、どのレコードを取得しているかを判別したいのですが、
今のところ、LinkButton1をクリックするとLinkButton2のレコードの数値になり、
判別不可能となっています。

この原因がわかる人がいたら、ぜひ教えていただけませんか。
よろしくお願いします。

[ メッセージ編集済み 編集者: apo 編集日時 2009-03-10 18:18 ]
apo
常連さん
会議室デビュー日: 2008/11/10
投稿数: 27
投稿日時: 2009-03-10 18:40
デバッグしてわかったことですが、
GridViewのRowCreatedでの処理が実行された後、
Page_Loadイベントで
me.Grid.DataBind()
を実行すると、再度RowCreatedの処理が実行されています。

このため、LinkButtonのCommandArgumentに再度値が設定され
値が二回目に続けて実行したときの数になっているみたいです。

このバグの回避の方法を考えていますが、
1つは、
一度、Page_Loadで、CommandArgumentに入れる
数値の変数を初期化する。
これ以外に良い方法がありますでしょうか?

よろしくお願いします
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2009-03-10 22:25
ポストバックのときもme.Grid.DataBind()を実行していませんか?
IsPostBackでないときだけ実行するようにしてみては?
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2009-03-11 05:38
コード:
GridViewのRowCreatedでの処理が実行された後、 
Page_Loadイベントで 
me.Grid.DataBind() 
を実行すると、再度RowCreatedの処理が実行されています。 


Grid.DataBind()の処理ですが、すべてシステムに委ねるか
それともすべてアプリケーション側で行うか
どっちかに統一したらどうでしょうか。

今回のように、システムとアプリケーション側で混在させると
期待しない結果になると思います。

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
apo
常連さん
会議室デビュー日: 2008/11/10
投稿数: 27
投稿日時: 2009-03-16 10:06
とても参考になりました。
初期化するところを修正して問題は解決しました。
それと、isPostBackのところは間違っていましたので修正しました。
また、何かありましたらよろしくお願いします。

[ メッセージ編集済み 編集者: apo 編集日時 2009-03-16 10:07 ]
1

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