3

行をGridViewクリックしてメソッドを呼び出す必要がSelectedIndexChangedあります(選択された行に基づいてページの別の部分を更新します)。SelectedIndexChanged以前にこれと同様のことを行ったことがありますが、うまくいきましたが、何らかの理由でその部分を呼び出すことができないようです。

form runat="server"ページは、タグを持つマスターページに保持され、<asp:ScriptManager>タグ

行の任意の場所をクリックして起動e.Row.Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex))できるようにするために使用しています。SelectedIndexChanged

それとは別にコードが機能することを確認するために、 aCommandFieldと aを追加SelectButtonして正常に起動しましたが、それを使用せずに解決策を見つけたいと思います。

コードは以下のとおりです - どんな助けでも大歓迎です。ありがとう

GridView:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
    <ContentTemplate>
        <asp:HiddenField runat="server" ID="hdnScrollPosition" />
        <asp:GridView ID="gridMessages" runat="server" CssClass="gridView" AutoGenerateColumns="False"
            AllowPaging="true" GridLines="None" PageSize="10" ShowHeader="True"
            EmptyDataText="--No Messages Received--" Width="100%">
            <Columns>
                <asp:TemplateField HeaderText="Messages Received" HeaderStyle-HorizontalAlign="Left" HeaderStyle-CssClass="headerClass">
                    <ItemTemplate>
                        ....
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

コードビハインド:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        Me.gridMessages.DataSource = ...
        Me.gridMessages.DataBind()
    End If
End Sub

Protected Sub gridMessages_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gridMessages.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#D2E6F8'")
        e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff'")

        e.Row.Attributes.Add("onclick", "saveScrollPosition(); " & ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex))

    End If
End Sub

SelectedIndexChanged(これは決して発火しません):

Protected Sub gridMessages_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles gridMessages.SelectedIndexChanged
    Response.Redirect("test.aspx")
End Sub
4

3 に答える 3

4

CommandFieldとして定義された列は必要ありませんSelectButtonか? 次に、マークアップは次のようになります。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
    <ContentTemplate>
        <asp:HiddenField runat="server" ID="hdnScrollPosition" />
        <asp:GridView ID="gridMessages" runat="server" CssClass="gridView" AutoGenerateColumns="False"
            AllowPaging="true" GridLines="None" PageSize="10" ShowHeader="True"
            EmptyDataText="--No Messages Received--" Width="100%">
            <Columns>
                <asp:CommandField ShowSelectButton="true" ButtonType="Button" />
                <asp:TemplateField HeaderText="Messages Received" HeaderStyle-HorizontalAlign="Left" HeaderStyle-CssClass="headerClass">
                    <ItemTemplate>
                        ....
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

あなたはこれについて質問しませんでしたが、私はいつも次の 2 行のようなことを言わざるを得ないと感じています。

e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#D2E6F8'")
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff'")

これはコードの匂いです。それは悪いことではありませんが、JavaScript 属性を VB/C# コードと混在させることは、今すぐやめるべき習慣です。このようなことを行う必要がある場合はCssClass、GridView にプロパティを追加し、それらのアクションを CSS (CSS に十分なイベントがない場合は JavaScript/jQuery) で定義します。


編集:

コメントでの議論に基づくと、これは GridView を変更できる方法と矛盾しているように見えます。ページ/イベントのライフサイクルに関連している可能性があります (どういうわけか、ASP.NET がイベントを適切に接続するには遅すぎますか?)。ここでの最善の策は、SelectedIndexChangedイベントからSelectedIndexChanging.

于 2011-12-02T15:41:06.637 に答える
1

私は同じ問題に取り組んできました...

あなたのシナリオではうまくいかないかもしれません(またはまったく良いことではありません)が、ページの設定EnableEventValidation="false"を試してください。これが私にとっての違いでした。上記のいずれかSelectedIndexChangedまたはイベントを使用して動作しました。SelectedIndexChanging

于 2012-08-31T02:39:19.347 に答える
0

これを使って:

e.Row.Attributes["onclick"]=ClientScript.GetPostBackEventReference(this.grvDetails,"Select$"+e.Row.RowIndex.ToString());
于 2012-07-03T06:03:55.720 に答える