1

プロジェクトでTreeViewを使用して、データベースからのデータを階層的に表示しています。少量のデータ、たとえば500エントリに対しては正常に機能します。ただし、そのエントリ数を超えると、読み込みに時間がかかりすぎます。大量のデータ(たとえば2500エントリ)を入力する必要があります。「tRegistered」という名前のテーブルが1つあり、そこから「Date」列をツリービューの親ノードとしてバインドします。また、同じテーブルから、「ユーザー」列をツリービューノードとしてバインドします。私の目的は、過去7日間のすべての登録ユーザーを階層的に表示することです。進め方を教えてください。

私のコードは次のとおりです。

private void PopulateTreeView()
{
    treeView1.Nodes.Clear();

    SqlDataAdapter daPatient = new SqlDataAdapter("SELECT TOP 100 PERCENT pId, pDate, pName FROM tRegistered WHERE pDate >= DATEADD(day,-7, GETDATE())", con);
    SqlDataAdapter daDate = new SqlDataAdapter("SELECT     TOP 100 PERCENT pDate FROM  tRegistered
         WHERE     pDate >= DATEADD(day, - 7, GETDATE()))
         GROUP BY pDate
         ORDER BY pDate DESC", con);

    DataSet ds = new DataSet();
    daPatient.Fill(ds, "tRegistered");
    daDate.Fill(ds, "tRegistered");

    //Add root node
    TreeNode root = new TreeNode("Registered");
    treeView1.Nodes.Add(root);      //Hard code

    ds.Relations.Add("Regsd", ds.Tables["tRegistered"].Columns["pDate"], ds.Tables["tRegistered"].Columns["pDate"]);
    foreach (DataRow dr in ds.Tables["tRegistered"].Rows)
    {
        DateTime dt = Convert.ToDateTime(dr["pDate"]);
        TreeNode tn = new TreeNode(String.Format("{0:dd-MMM-yyyy}", dt));

        foreach (DataRow drChild in dr.GetChildRows("Regsd"))
        {

            TreeNode childTn = new TreeNode(drChild["pId"].ToString() + "- " + drChild["pName"].ToString());
            childTn.Tag = drChild["pId"];
            tn.Nodes.Add(childTn);
        }

        root.Nodes.Add(tn);
        root.Expand();      
    }
}
4

2 に答える 2

3

TreeView1.BeginUpdate()およびEndUpdate()を使用して、GUIが常に更新されないようにします。

サブレベルが多数ある場合は、childTN.Expand()をいくつかのレベルに対してのみ実行するか、日付ノード(tn)を展開することもできます。

        TreeNode root = new TreeNode("Registered");
        root.Expand();
        ds.Relations.Add("Regsd", ds.Tables["tRegistered"].Columns["pDate"], ds.Tables["tRegistered"].Columns["pDate"]);
        foreach (DataRow dr in ds.Tables["tRegistered"].Rows)
        {

            DateTime dt = Convert.ToDateTime(dr["pDate"]);
            TreeNode tn = new TreeNode(String.Format("{0:dd-MMM-yyyy}", dt));
            tn.Expand();

            foreach (DataRow drChild in dr.GetChildRows("Regsd"))
            {

                TreeNode childTn = new TreeNode(drChild["pId"].ToString() + "- " + drChild["pName"].ToString());
                childTn.Tag = drChild["pId"];
                childTN.Expand();
                tn.Nodes.Add(childTn);

            }

            root.Nodes.Add(tn);
            //root.Expand();      
        }
        TreeView1.BeginUpdate();
        TreeView1.Nodes.Add(root);      //Hard code
        TreeView1.EndUpdate();

編集:テキストとコードスニペットを変更しました。

于 2013-03-24T22:26:42.117 に答える
0

すべての子ノードをツリービューコントロールにロードした後、ルートノードをTreeViewコントロールに追加してみてください。速度が大幅に向上するはずです。

于 2013-03-24T21:39:37.787 に答える