Javascript 将项目添加到列表框而不向上滚动

Javascript 将项目添加到列表框而不向上滚动,javascript,jquery,asp.net,ajax,Javascript,Jquery,Asp.net,Ajax,我有一个包含所有在线用户的列表框。 用户从MySQL数据库加载,并每秒加载到列表框中。 当我向列表框添加一个项目时,列表框会向上滚动,我不希望发生这种情况 <asp:UpdatePanel ID="usersPanel" UpdateMode="Conditional" runat="server"> <ContentTemplate> <asp:ListBox ID="lstUsers" runat="server

我有一个包含所有在线用户的列表框。 用户从MySQL数据库加载,并每秒加载到列表框中。 当我向列表框添加一个项目时,列表框会向上滚动,我不希望发生这种情况

       <asp:UpdatePanel ID="usersPanel" UpdateMode="Conditional" runat="server">
        <ContentTemplate>
          <asp:ListBox ID="lstUsers" runat="server" ViewStateMode="Enabled" AutoPostBack="True"></asp:ListBox>
          <asp:Timer ID="mainTimer" runat="server" ontick="Timer1_Tick" Interval="1000"></asp:Timer>
        </ContentTemplate>
       </asp:UpdatePanel>

我曾尝试使用javascript进行此操作,但无法获取/设置列表框上的滚动条位置。这里要做的是在客户端保存当前选定的列表,并在使用新值更新面板后将其设置回原位

<script type="text/javascript" language="javascript" >
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_beginRequest(beighnloadinf);        
    prm.add_endRequest(EndRequest);

    var selected = "";
    //get selected index and store in variable
    function beighnloadinf() {
     var sel = document.getElementbyId('<%=lstUsers.ClientID%>');
     var listLength = sel.options.length;
         for(var i=0;i<listLength;i++){
                 if(sel.options[i].selected){
                     selected =sel.options[i].value;
                     break;
                 }
         }
    }

    // set selected index back afrer update finished
    function EndRequest(sender, args) {
     var sel = document.getElementbyId('<%=lstUsers.ClientID%>');
            sel.value = selected;
    }

</script>

var prm=Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(贝恩洛迪夫);
prm.add_endRequest(endRequest);
var selected=“”;
//获取所选索引并存储在变量中
函数beighnoladinf(){
var sel=document.getElementbyId(“”);
var listLength=sel.options.length;

对于(var i=0;i您不应该每秒清除控件。这是您的问题:

lstUsers.Items.Clear();
最简单的解决方案是使用
IEnumerable
上的Except方法将您的
列表框项目与您的数据源进行比较

您必须手动将数据源转换为
IEnumerable
。有关如何转换的信息,请参见此

注意:您必须更改扩展方法的类型

之后,您可以循环使用差异集(返回的
.Except()
)对象,并将它们添加到列表框中,如下所示:

lstUsers.Items.Add("a new list item");

如果我不执行清除操作,只需每秒添加项目(这会导致重复),滚动条也会重置。在控件中获取列表项目的IEnumerable,如下所示:var listOfControlItems=lstUsers.items.Cast().Select(f=>f.Text)。AsEnumerable()为MySqlDataReader实现IEnumerable,如本文所示(确保它的类型是IEnumerable),将它推入一个变量,给它一个名称,让我们称它为listFromDB以便于解释。获取如下新项:var listOfItemsToAddToControl=listFromDB.Except(listOfControlItems);将它们添加到控件中,如下所示:foreach(listOfItemsToAddToControl中的var项){lstUsers.items.add(new ListItem(item));}老实说,如果我是你,我会在客户端上查看绑定listbox(select)的数据。这种类型的东西将为你提供所需的客户端行为:$(document).ready(函数(){var cursor=0;setInterval(函数(){$('[id$=lstUsers]')。append('+cursor+'');cursor++;},10);});您只需要考虑将数据以json的形式高效地发送到客户端。您可以查询web服务中的数据库列表,并与控件列表(javascript)进行比较,向控件添加新项,如上面代码段中演示的那样(将间隔换成循环等)。
lstUsers.Items.Add("a new list item");