我的gridview里面的数据是通过time定时刷新的,右边和下面有滚动条
我想问下在我查看gridview的时候如何固定住滚动条,不受刷新时候的影响。
因为我time的时间间隔比较短,在查看的时候,gridview数据刷新,滚动条就会回到最上面
对我查看数据非常的不便。能不能在刷新的通知,固定好滚动条的位置。不知道如何实现。
希望各位知道能帮下忙哦

解决方案 »

  1.   

    用AJAX
    的Updatepanel放置gridview
    然后用Timer定时刷新页面
      

  2.   

    我觉得,你还是换一种方法好,
    因为,浏览器更新后,你原来浏览记录的位置相对与GridView内部已经发生改变。
    我推荐一种方法,添加两个控件:
    一个如Button 点击后刷新GridView。
    一个是提示控件,在Timer中,每一时间对数据库进行探测一次,如果有数据更新,就在提示控件中作出提示。这样,用户既能知道有记录更新,又可以选择性是否马上刷新页面而不影响当前查看。
      

  3.   

    数据时一直都在更新的,所以你的button方法不可行。第二种方法治标不治本。还是有那种情况出现
      

  4.   

    设置aspx页面◎page指令的一个属性,具体什么记不住了
      

  5.   

    element.scrollTop 
    element.scrollLeft
      

  6.   

    element 这是什么?是gridview么?滚动的时候触发它的事件是什么?
      

  7.   

    你能否写详细一点,写出具体的gridview的代码?我这样不是很看得懂
      

  8.   

    <%@ Page Language="C#" MaintainScrollPositionOnPostback="true" %>
    这样设置一下就没问题了
      

  9.   

    重写控件,继承GridView,然后设置RowStyle
      

  10.   

    我搞了个,你看看是不是你要的效果
    前台代码
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %><!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>
        <script type="text/javascript" language="javascript">
            function RecordPostion(obj)
            {
                var div1 = obj;
                var sx = document.getElementById('dvscrollX');
                var sy = document.getElementById('dvscrollY');
                
                sy.value = div1.scrollTop;
                sx.value = div1.scrollLeft; 
            }
            
            function GetResultFromServer()
            {
                var sx = document.getElementById('dvscrollX');
                var sy = document.getElementById('dvscrollY');
                
                document.getElementById('dvGridView').scrollTop = sy.value;
                document.getElementById('dvGridView').scrollLeft = sx.value;               
            }
        </script>
    </head>
    <body style="height:1500px">
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" >
        </asp:ScriptManager>
           
        <div>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <div id="dvGridView" style="height:400px; overflow:scroll" onscroll="javascript:RecordPostion(this);">                
                    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ShowHeader="false" >      
                        <Columns>
                            <asp:TemplateField>
                                <ItemTemplate>
                                    <asp:Label ID="Label2" runat="server" Text='<%#Eval("Id") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <ItemTemplate>
                                    <asp:Label ID="Label1" runat="server" Text='<%#Eval("Name") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                    <asp:Timer ID="Timer1" runat="server" ontick="Timer1_Tick" Interval="2000">
                    </asp:Timer>
                    </div>
                    <asp:HiddenField ID="dvscrollX" runat="server" />
                    <asp:HiddenField ID="dvscrollY" runat="server" />
                </ContentTemplate>       
            </asp:UpdatePanel>
        </div> 
        </form>
    </body>
    </html>后台
    using System;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;public partial class _Default : System.Web.UI.Page
    {
        protected static DataTable dt1;    protected static DataTable dt2;    protected static int iFlag = 0;    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                dt1 = new DataTable();
                dt2 = new DataTable();            dt1.Columns.Add("Id", typeof(string));
                dt1.Columns.Add("Name", typeof(string));            dt2.Columns.Add("Id", typeof(string));
                dt2.Columns.Add("Name", typeof(string));            for (int i = 0; i < 100; i++)
                {
                    DataRow dr1 = dt1.NewRow();
                    dr1["Id"] = i.ToString();
                    dr1["Name"] = "Jack_" + i.ToString();
                    dt1.Rows.Add(dr1);
                }            for (int j = 0; j < 200; j++)
                {
                    DataRow dr2 = dt2.NewRow();
                    dr2["Id"] = j.ToString();
                    dr2["Name"] = "Tom_" + j.ToString();
                    dt2.Rows.Add(dr2);
                }
            }      
        }    private void BindGridView()
        {        if (iFlag % 2 == 1)
            {
                this.GridView1.DataSource = dt1;
            }
            else
            {
                this.GridView1.DataSource = dt2;
            }        this.GridView1.DataBind();        string sjs = "GetResultFromServer();";        ScriptManager.RegisterClientScriptBlock(this.GridView1, this.GetType(), "", sjs, true);    }    protected void Timer1_Tick(object sender, EventArgs e)
        {
            iFlag++;        BindGridView();
        }
    }
      

  11.   

    厉害啊,能把你的工程打包发我邮箱或者QQ么?
    69490741我的QQ号
      

  12.   

    我试过了你的这个方法,在新建的工程里是可以的,但是把部分代码贴到我这边来,貌似不行。
    我是在.ascx 用户控件中写代码的,代码运行没问题,但是实际运行时滚动条还是会置顶<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MainBody.ascx.cs" Inherits="MainBody" %>
        <script type="text/javascript" language="javascript">
            function RecordPostion(obj)
            {
                var div1 = obj;
                var sx = document.getElementById('dvscrollX');
                var sy = document.getElementById('dvscrollY');
                
                sy.value = div1.scrollTop;
                sx.value = div1.scrollLeft; 
            }
            
            function GetResultFromServer()
            {
                var sx = document.getElementById('dvscrollX');
                var sy = document.getElementById('dvscrollY');
                
                document.getElementById('dvGridView').scrollTop = sy.value;
                document.getElementById('dvGridView').scrollLeft = sx.value;               
            }
        </script>
    <asp:UpdatePanel ID="upd1" runat="server">
     <ContentTemplate>
     <div style="pasition:absolute;overflow: auto; height: 100px; width: 100%" runat="server">
            <asp:GridView ID="AlarmGV" runat="server" CssClass="tablestyle" 
                      align="center" Width="980px" 
                    AutoGenerateColumns="False"
                     EmptyDataText="There are no data records to display.">
                    <Columns>
                        
                        <asp:BoundField DataField="告警ID" HeaderText="告警ID" SortExpression="告警ID" />
                        <asp:BoundField DataField="信号名称" HeaderText="信号名称" SortExpression="信号名称" />
                        <asp:BoundField DataField="单位" HeaderText="单位" SortExpression="单位"/>
                        <asp:BoundField DataField="告警值" HeaderText="告警值" SortExpression="告警值"/>
                        <asp:BoundField DataField="告警时间" HeaderText="告警时间" SortExpression="告警时间"/>
                        <asp:BoundField DataField="通信状态" HeaderText="通信状态" SortExpression="通信状态"/>
                        <asp:BoundField DataField="当前状态" HeaderText="当前状态" SortExpression="当前状态"/>
                        <asp:BoundField DataField="告警类型" HeaderText="告警类型" SortExpression="告警类型"/>
                        <asp:BoundField DataField="结束值" HeaderText="结束值" SortExpression="结束值"/>
                        <asp:BoundField DataField="结束时间" HeaderText="结束时间" SortExpression="结束时间"/>
                        <asp:BoundField DataField="持续时间" HeaderText="持续时间" SortExpression="持续时间"/>
                        <asp:BoundField DataField="确认时间" HeaderText="确认时间" SortExpression="确认时间"/>
                        
                    </Columns>
            <PagerStyle HorizontalAlign="Center" />
            <AlternatingRowStyle CssClass="altrowstyle" />
            <HeaderStyle CssClass="headerstyle" />
            <RowStyle CssClass="rowstyle" />
            </asp:GridView>
                <asp:Timer ID="Timer1" runat="server" Interval="1000" ontick="Timer1_Tick" Enabled="false">
        </asp:Timer>
    </div>
    <asp:HiddenField ID="dvscrollX" runat="server" />
    <asp:HiddenField ID="dvscrollY" runat="server" />
    </ContentTemplate> 
    <%--        <Triggers> 
                <asp:AsyncPostBackTrigger ControlID="Timer1" /> 
            </Triggers> --%>
    </asp:UpdatePanel> using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Data.OleDb;
    using System.Data.Common;
    using System.Data.SqlClient;public partial class MainBody : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //this.SmartNavigation = true;
            string cc;
            string aa;
            aa = "Server = " + MainVariable.h_DataSourse + ";Integrated Security = True;Database = " + MainVariable.h_Database;
            cc = "select iAlarmID as 告警ID,sSigName as 信号名称,sUnit as 单位,sASigValue as 告警值,dASigDT as 告警时间,sSigSComm as 通信状态,"
            + "sASigStatus as 当前状态,sAType as 告警类型,sASigEndValue as 结束值,dASigEndDT as 结束时间,sALastT as 持续时间,dAffirm as 确认时间 "
            + "from RG_SIGINFO,RG_ALARM where iSID = iSigID and dRemove is null order by dASigDT desc";
            SqlConnection themConnection = new SqlConnection(@aa);
            SqlDataAdapter themAdpater = new SqlDataAdapter(cc, themConnection);
            DataSet dnn = new DataSet();
            themAdpater.Fill(dnn, "RG_SIGINFO,RG_ALARM");
            AlarmGV.DataSource = dnn.Tables["RG_SIGINFO,RG_ALARM"].DefaultView;
            AlarmGV.DataBind();
        }    protected void Timer1_Tick(object sender, EventArgs e)
        {
            string cc;
            string aa;
            aa = "Server = " + MainVariable.h_DataSourse + ";Integrated Security = True;Database = " + MainVariable.h_Database;
            cc = "select iAlarmID as 告警ID,sSigName as 信号名称,sUnit as 单位,sASigValue as 告警值,dASigDT as 告警时间,sSigSComm as 通信状态,"
            + "sASigStatus as 当前状态,sAType as 告警类型,sASigEndValue as 结束值,dASigEndDT as 结束时间,sALastT as 持续时间,dAffirm as 确认时间 "
            + "from RG_SIGINFO,RG_ALARM where iSID = iSigID and dRemove is null order by dASigDT desc";
            SqlConnection themConnection = new SqlConnection(@aa);
            SqlDataAdapter themAdpater = new SqlDataAdapter(cc, themConnection);
            DataSet dnn = new DataSet();
            themAdpater.Fill(dnn, "RG_SIGINFO,RG_ALARM");
            AlarmGV.DataSource = dnn.Tables["RG_SIGINFO,RG_ALARM"].DefaultView;
            AlarmGV.DataBind();        string sjs = "GetResultFromServer();";        ScriptManager.RegisterClientScriptBlock(this.AlarmGV, this.GetType(), "", sjs, true);
        }
    }
      

  13.   

    把这个问题搁置了一段时间
    现在就剩下这个问题了
    不知道有没有高手指点下
    我在前面说得应该很清楚了
    最后的那位AngleProgrammer朋友给我的方法是可行的,我单独建立工程的时候也是可以实现的
    但是,我把代码放到我的工程里面时,就出现了问题,提示SCRIPT里面的代码里面的参数不能为空
    不知道是什么缘故。
    希望知道的高手能帮助下
      

  14.   

    this.SmartNavigation = true;不过已经被MS否决了
    试试SetFocus   方法和   MaintainScrollPositionOnPostback   属性。   
      

  15.   

    不知道你的问题解决没
    你的代码里好像没有调用RecordPostion(),所以dvscrollX dvscrolly里没有值吧
      

  16.   

    你好,可以说清楚一点么?
    像我这种情况,RecordPostion应该怎么写
      

  17.   

    19楼是这样写的
    <div style="pasition:absolute;overflow:scroll; height: 100px; width: 100%" onscroll="javascript:RecordPostion(this);" runat="server">