1
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ChatUserControl.ascx.cs"
    Inherits="MetamorphismApp.ChatUserControl" %>
<asp:Timer ID="timer1" runat="server" OnTick="timer1_Tick" Interval="5000">
</asp:Timer>
<div id="divChatWindow" class="clChatWindow">
    <div>
        <asp:Label runat="server" Text='<%# Eval("username") %>' class="divHeader" ID="lblChatFriend"></asp:Label>
        <asp:Image ID="imgFriend" runat="server" CssClass="classFriendImage"/>
        <asp:LinkButton ID="lbClose" runat="server" CommandName="Close" CssClass="lbClose"
            OnClick="lbClose_Click">Close</asp:LinkButton></div>
    <div class="chatText" id="idChatText" runat="server">
        <asp:UpdatePanel ID="UpdatePanel" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="timer1" EventName="Tick" />
                <asp:AsyncPostBackTrigger ControlID="btnSendChat" EventName="Click" />
            </Triggers>
            <ContentTemplate>
                <asp:Repeater runat="server" ID="rpChatMessages">
                    <ItemTemplate>
                        <asp:Image ID="imageForFriend" runat="server" CssClass="clFriendsImage" ImageUrl='<%# "HttpImageHandler.jpg?username=" +  DataBinder.Eval(Container.DataItem,"fromusername").ToString() %>' />
                        <asp:Label ID="chatMessage" runat="server" Text='<%# Eval("Message") %>'></asp:Label>
                        <br>
                    </ItemTemplate>
                </asp:Repeater>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    <asp:TextBox ID="txtChatMessage" runat="server" Width="142px" CssClass="clChatMessage"
        TextMode="MultiLine"></asp:TextBox>
    <asp:LinkButton ID="btnSendChat" runat="server" CommandName="Insert" CommandArgument='<%# Eval("username") %>'
        OnClick="btnSendChat_Click">Send</asp:LinkButton>
</div>





protected void btnSendChat_Click(object sender, EventArgs e)
    {
        TextBox txt = this.FindControl("txtChatMessage") as TextBox;
        string username = lblChatFriend.Text;            
        ucc.InsertMessage(Session["username"].ToString(), username, txt.Text);

        string javaScript = "<script type='text/javascript'>\n" + "CallScroller();\n" + "</script>";
        ScriptManager.RegisterStartupScript(this, typeof(ChatUserControl), "startUpScript", javaScript, false);
    }

btnSendChat 関数は、ユーザー コントロールのコード ビハインド ファイルにあります。CallScroller 関数は呼び出されません。

4

1 に答える 1

0

これRegisterStartupScriptは、DOM がロードされたときに呼び出されるためです。これは、jQuery と同等です。

$(function () { ... });

UpdatePanelトリガーを使用してボタンからイベントをキャプチャしているため、ビューを効果的に部分的にレンダリングしているため、登録されたスクリプトRegisterStartupScriptはこの状況では決して実行されません

代替案:

Sys.load イベントに反応する

このイベントは、ページが部分的にレンダリングされるたびに発生します。

イベントを次のように処理します。

    <asp:ScriptManager runat="server" ID="sm">

    </asp:ScriptManager>
    <script type="text/javascript">
        function callScroller() {
            alert("call scroller called");
        }
        Sys.Application.add_load(function () {
            if ($get("hidden").getAttribute("value") == "1") {
                callScroller();
            }
        });
    </script>

JavaScript 関数をいつ呼び出すかを示すフラグとして使用するには、HiddenField内部に a を追加します。これがないと、すべての投稿で関数が呼び出されます。UpdatePanel.ContentTemplate

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:HiddenField  runat="server" ID="hidden" Value="0" />
        ....

最後に、コード ビハインドで、ニーズに最適なイベントでフラグをオンにします。

    protected void btnSendChat_Click(object sender, EventArgs e)
    {
        this.hidden.Value = "1";
    }

それでおしまい

于 2012-07-26T09:13:52.407 に答える