DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データグリッドで「選択」ボタンをクリックしてもSelectedIndexChangedイベントが発生しない

環境/言語:[VB.NET .NET Framework 1.1]
分類:[ASP.NET]

ASP.NETの初心者です。

DataGrid1をWebForm1に配置し、プロパティビルダによって選択ボタンを
追加しました。

テキスト:選択
コマンド名:Select
ボタンの種類:PushButton

そして、Page_LoadイベントでデータグリッドをDataBindし、DataGrid1の
SelectedIndexChangedイベントを記述しました。

この状態で実行してみると、DataGrid1には、「選択」ボタンが表示され
データも表示されます。

しかし、「選択」ボタンをクリックしても、SelectedIndexChangedイベントが
発生しません。

SelectedIndexChangedイベントにブレイクポイントを設定してもSelectedIndexChangedイベントが発生している気配がありません。

何が問題なのか、さっぱり分かりません。
何か必要な処理があるのでしょうか?
もし、何か必要な処理、あるいは確認しなければいけないことが
ありましたら教えてください。

よろしくお願い致します。
とりあえず以下のコードで試してみてください。
take さんの環境でポストバックイベント、SelectedIndexChangedイベントは発生しますでしょうか?
# VWD2008(.NET2.0)で書いたので、そのままでは動かないかもしれません。そのときは適宜修正してください。

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="DataGridSelectedIndexChangedTest.aspx.vb"
 Inherits="DataGridSelectedIndexChangedTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>無題のページ</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:DataGrid ID="DataGrid1" runat="server">
        <Columns>
            <asp:ButtonColumn ButtonType="PushButton" CommandName="select" HeaderText="ボタン" 
                Text="ボタン"></asp:ButtonColumn>
        </Columns>
    </asp:DataGrid>
    </form>
</body>
</html>

Imports System.Data

Partial Class DataGridSelectedIndexChangedTest
    Inherits System.Web.UI.Page
    Implements IPostBackEventHandler

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        If Me.IsPostBack = False Then
            Me.DataGrid1.DataSource = Me._createDataSource
            Me.DataGrid1.DataBind()
        End If
        Dim i As Integer = 0
        For i = 0 To Me.DataGrid1.Items.Count - 1
            Me.DataGrid1.Items(i).Cells(0).Attributes.Add("onclick", _
 Me.Page.GetPostBackEventReference(Me, i.ToString))
        Next
        MyBase.OnLoad(e)
    End Sub

    Private Function _createDataSource() As DataTable
        Dim dt As New DataTable
        dt.Columns.Add("列1", GetType(String))
        dt.Columns.Add("列2", GetType(String))
        Dim i As Integer = 0
        For i = 0 To 10
            dt.Rows.Add("データ−" + i.ToString, "メモ−" + i.ToString)
        Next
        Return dt
    End Function

    Protected Sub DataGrid1_SelectedIndexChanged(ByVal sender As Object, _
 ByVal e As System.EventArgs) Handles DataGrid1.SelectedIndexChanged
        MsgBox("SelectedIndexChanged", MsgBoxStyle.OkOnly, "サーバーサイド")
    End Sub

    Public Sub RaisePostBackEvent1(ByVal eventArgument As String) _
 Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
        MsgBox("RaisePostBackEvent−" + eventArgument, MsgBoxStyle.OkOnly, "サーバーサイド")
    End Sub

End Class
H.K.R.さん、返信ありがとうございました。

早速、試したところ、SelectedIndexChangedイベントが発生します。

一体、どういうことなんでしょうか?
初心者なので、ソースの意味が良く分かりません。

なぜ、私の最初のやり方では、出来ないのでしょうか?
もし、宜しければ解説をお願いできないでしょうか?

よろしくお願いいたします。
私も詳しくないので、なぜtakeさんのコードでSelectedIndexChangedイベントが発生しないのかは分かりません。

そこで、1つの回避策として以下のコードを書きました。
SelectedIndexChangedイベントの代わりにPostBackイベントが使えるかもしれません。

> Implements IPostBackEventHandler
PostBackイベントをPageが補足できるようにします。

> Me.DataGrid1.Items(i).Cells(0).Attributes.Add("onclick", _
> Me.Page.GetPostBackEventReference(Me, i.ToString))
DataGridの先頭列のセルをクリックしたときにPostBackイベントを
発生させるコードを、HTMLに埋め込みます。
第2引数「i.ToString」がRaisePostBackEvent1メソッドに渡されます。

> Public Sub RaisePostBackEvent1(ByVal eventArgument As String) _
> Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
> MsgBox("RaisePostBackEvent−" + eventArgument, MsgBoxStyle.OkOnly, "サーバーサイド")
> End Sub
PostBack発生時にこのメソッドが呼ばれます。引数eventArgumentで、発生元を識別できます。

以上、何か参考になれば幸いです。
H.K.R.さん、丁寧な解説ありがとうございます。

SelectedIndexChangedイベントを発生させるには、「選択」ボタンを
クリックした時にPostBackイベントを発生させるようにすれば
いいのですね!

この方法で試してみたいと思います。

本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板