我有一个包含所有在线用户的ListBox。 用户从MySQL数据库加载并每秒加载到ListBox中。 当我将一个Item添加到ListBox时,ListBox向上滚动,我不希望这种情况发生。
<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>
计时器代码:
protected void Timer1_Tick(object sender, EventArgs e)
{
...
MySqlDataReader datareader = command.ExecuteReader();
if (datareader.HasRows) {
lstUsers.Items.Clear();
while (datareader.Read()) {
lstUsers.Items.Add(new ListItem(datareader.GetString(1), datareader.GetInt32(0).ToString()));}
}
}
我尝试用javascript做但我无法获取/设置列表框上的滚动条位置
答案 0 :(得分:1)
这里要做的是在客户端保存当前选择的当前列表,并在使用新值更新面板后将其设置回来。
<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>
您可以执行相同的操作,在后面的代码中,您将获得所选的一个,并在新的列表更新后放置它。
答案 1 :(得分:0)
你不应该每秒清除控件。这是你的问题:
lstUsers.Items.Clear();
最简单的解决方案是使用ListBox items
上的Except方法将您IEnumerable
与数据源进行比较。
您必须手动将数据源转换为IEnumerable
。有关如何执行此操作,请参阅此post。
注意:您必须更改扩展方法的类型。
之后,您可以遍历差异集(.Except()
的返回对象)并将其添加到列表框中,如下所示:
lstUsers.Items.Add("a new list item");