4 Stimmen

Mit Timer wieder nach oben blättern

Ich habe eine Chat-Anwendung erstellt. Wenn ich etwas in ein Textfeld eintrage und auf Enter klicke, wird der Text in die Datenbank eingefügt und die Bildlaufleiste geht hoch. Ich habe ein Javascript verwendet, um beim Klicken nach unten zu scrollen, was gut funktioniert, aber aufgrund des Timers bewegt sich die Bildlaufleiste wieder nach oben, sobald sie nach unten gezogen wird. Mein Code folgt

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!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>
<style type="text/css">
#kdiv1
{
    position:relative;
    left:300px;
    top:20px;
    height:400px;
    width:400px;
    overflow:auto;
}
#kdiv2
{
    position:relative;
    top:100px;
    left:300px;
}
</style>
    <script type="text/javascript">
    function scrooldown(div) {
        var scrollDiv = document.getElementById(div);
        scrollDiv.scrollTop = scrollDiv.scrollHeight;
        scrollDiv = null;
    }
    </script>
</head>
<body>
    <form id="form1" runat="server" defaultfocus="text">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">

        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true" RenderMode="Block">
        <Triggers>
        <asp:AsyncPostBackTrigger ControlID="button1" EventName="Click" />
        </Triggers>
        <ContentTemplate>
        <div id="kdiv1">
           <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
            <span>
             <%# DataBinder.Eval(Container.DataItem, "Message") %> <br />
            </span>
            </ItemTemplate>
            </asp:Repeater>
        </div>
            <div id="kdiv2">
            <asp:TextBox ID="text" runat="server"/>
            <asp:Button ID="button1" runat="server" onclick="button1_Click" OnClientClick="scrooldown('kdiv1')" />
            </div>
        </ContentTemplate>
        </asp:UpdatePanel>
        </div>
    </form>
</body>
</html>

C#-Code

protected void button1_Click(object sender, EventArgs e)
    {
        string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" + "SERVER=localhost;" + "DATABASE=chatserver;" + "UID=root;" + "PASSWORD=********;" + "OPTION=3";
        OdbcConnection MyConnection = new OdbcConnection(MyConString);
        try
        {
            OdbcCommand cmd = new OdbcCommand("INSERT INTO shoutbox(name, message)VALUES(?, ?)", MyConnection);
            cmd.Parameters.Add("@email", OdbcType.VarChar, 255).Value = "something";
            cmd.Parameters.Add("@email", OdbcType.Text).Value = text.Text;
            MyConnection.Open();
            cmd.ExecuteNonQuery();
            MyConnection.Close();
        }
        catch
        {
        }
        try
        {
            MyConnection.Open();
            OdbcCommand cmd = new OdbcCommand("Select message from shoutbox", MyConnection);
            OdbcDataReader dr = cmd.ExecuteReader();
            ArrayList values = new ArrayList();
            while (dr.Read())
            {
                string ep = dr[0].ToString();
                values.Add(new PositionData(ep));
            }
            Repeater1.DataSource = values;
            Repeater1.DataBind();
            text.Text = "";
            UpdatePanel1.Update();
        }
        catch
        {

        }
    }
}

1voto

Elian Ebbing Punkte 17941

Sie erhalten ein besseres Ergebnis, wenn Sie das div kdiv1 um den UpdatePanel statt innen:

<div id="kdiv1">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true" RenderMode="Block">
        ...
    </asp:UpdatePanel>
</div>

Das Problem bei der derzeitigen Situation ist, dass die div kdiv1 selbst wird nach jedem teilweisen Postback ersetzt, und der gesamte Status (wie die Bildlaufpositionen) geht verloren.

Aber auch nach dieser Änderung hätten Sie immer noch das Problem, dass die nach dem partiellen Postback hinzugefügte(n) Zeile(n) nicht innerhalb des sichtbaren Bereichs liegen, da diese neuen Zeilen nach dem letzten Aufruf von scrolldown('kdiv1') .

Um dieses Problem zu lösen, könnten Sie eine Funktion registrieren, die jedes Mal aufgerufen wird, wenn ein teilweises Postback erfolgt. Dazu fügen Sie das folgende Javascript in die Kopfzeile der Seite ein:

<script language="javascript">
    window.onload = function()
    {
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {
            scrolldown('kdiv1');
        });
    };
</script>

Hinweis: In meinen Beispielen habe ich "scrolldown" statt "scrooldown" geschrieben, da ich davon ausgehe, dass es sich um einen Tippfehler handelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X