0

すべてのオンライン ユーザーを含む ListBox があります。ユーザーは MySQL データベースからロードされ、毎秒 ListBox にロードされます。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 でやろうとしましたが、リストボックスのスクロールバーの位置を取得/設定できませんでした

4

2 に答える 2

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>

コードビハインドで同じことを行うことができます。選択したものを取得し、リストの新しい更新の後に配置します。

于 2012-09-01T20:10:53.283 に答える
0

毎秒コントロールをクリアするべきではありません。これはあなたの問題です:

lstUsers.Items.Clear();

ListBox items最も簡単な解決策は、Except メソッドを使用してデータ ソースと比較することですIEnumerable

IEnumerableデータ ソースを手動で変換する必要があります。その方法については、この投稿を参照してください。

注: 拡張メソッドの型を変更する必要があります。

その後、差分セット ( の返されたオブジェクト.Except()) をループして、次のようにリスト ボックスに追加できます。

lstUsers.Items.Add("a new list item");
于 2012-09-01T20:40:15.477 に答える