0

SQLListViewから 2 つのデータ セットを入力しています。これは 15 秒ごとに発生します。スクロール先の位置を維持しながらデータを更新するにはどうすればよいですか? ここで関連する問題に関するいくつかの質問を見てきましたが、実際に私の特定の問題に対処するものはありません。私は TopMost オプションを試しましたが、あまり成功しませんでした。

スクロール先の位置を維持する方法について何か提案はありますか? のデータを入力するために使用するコードを次に示しListBoxます。

private void PopulateData()
{        
    _agent.Stop();
    listView1.Items.Clear();
    listView1.Groups.Clear();
    listView1.BeginUpdate();
    string filter;

    DataTable dt1 = new DataTable();
    DataTable dt2 = new DataTable();

    dt1.Columns.Add("Name", typeof(string));
    dt1.Columns.Add("Status", typeof(string));
    dt1.Columns.Add("Time", typeof(double));
    dt1.Columns.Add("Calls", typeof(double));
    dt1.Columns.Add("InProgress", typeof(double));
    dt1.Columns.Add("Region", typeof(string));

    dt2.Columns.Add("Name", typeof(string));
    dt2.Columns.Add("CChats", typeof(double));
    dt2.Columns.Add("AChats", typeof(double));

    foreach (DataRow dr in _agentStates.Rows)
    {
        DataRow row = dt1.NewRow();
        row["Name"] = dr[0].ToString();
        row["Status"] = dr[1].ToString();
        row["Time"] = Convert.ToDouble(dr[2].ToString());
        row["Calls"] = Convert.ToDouble(dr[3].ToString());
        row["InProgress"] = Convert.ToDouble(dr[4].ToString());
        row["Region"] = dr[5].ToString();
        dt1.Rows.Add(row);
    }

    foreach (DataRow dr in _chatCount.Rows)
    {
        DataRow row = dt2.NewRow();
        row["Name"] = dr[0].ToString();
        row["CChats"] = Convert.ToDouble(dr[1].ToString());
        row["AChats"] = Convert.ToDouble(dr[2].ToString());
        dt2.Rows.Add(row);

    }

    var result = from table1 in dt1.AsEnumerable()
                 join table2 in dt2.AsEnumerable()
                 on (string)table1["Name"] equals (string)table2["Name"]
                 into joinedDt
                 from table2 in joinedDt.DefaultIfEmpty()
                 select new
                 {
                     Name = (string)table1["Name"],
                     Status = (string)table1["Status"],
                     Time = (double)table1["Time"],
                     Calls = (double)table1["Calls"],
                     InProgress = (double)table1["InProgress"],
                     Region = (string)table1["Region"],
                     CChats = (table2 != null ? (double)table2["CChats"] : 0),
                     AChats = (table2 != null ? (double)table2["AChats"] : 0)
                 };

    foreach (var item in result)
    {
        if (item.Status != "NLO" && item.Status !="Webchat Account")
        {
            var calls = item.Calls + item.CChats;
            var lvi = new ListViewItem(item.Name);
            lvi.SubItems.Add(item.Status);
            lvi.SubItems.Add(Conv.Time(item.Time));
            lvi.SubItems.Add(item.Calls.ToString());
            lvi.SubItems.Add(item.CChats.ToString());
            lvi.SubItems.Add((item.AChats + item.InProgress).ToString());
            lvi.SubItems.Add(calls.ToString());
            this.listView1.Items.Add(lvi);
        }
    }

    listView1.EndUpdate();
    _agent.Start();
}
4

1 に答える 1

2

モードでリストビューを使用し、イベントVirtualModeを実装します。RetrieveVirtualItem

表示されるものをより適切に制御できるようになり、更新するためにすべての項目をクリアする必要がなくなります。

VirtualModeが に設定されている場合は、 をリストに表示する項目の数にtrue設定するだけです。VirtualListSizeこのRetrieveVirtualItemイベントは、リストビューがユーザーに表示するアイテムごとに発生します。したがって、データが変更された場合は、リストビューのRefreshメソッドを呼び出すことができ、RetrieveVirtualItemハンドラーは新しいアイテム データを返します。

次の例を検討してください。

public partial class Form1 : Form
{
    private int i = 0;

    public Form1()
    {
        InitializeComponent();
        listView1.View = View.Details;
        listView1.Columns.Add("Col", 250);
        listView1.VirtualMode = true;
        listView1.RetrieveVirtualItem += listView1_RetrieveVirtualItem;
        listView1.VirtualListSize = 25;
        button1.Click += button1_Click;
    }

    private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
    {
        e.Item = new ListViewItem((i + e.ItemIndex).ToString());
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // simulate data update
        i += 10;
        //listView1.VirtualListSize += 5; // you can even change the virtual list size while keeping current scroll position
        listView1.Refresh();
    }
}
于 2012-08-13T20:47:02.140 に答える