在树视图中选择树节点以填充表单中的数据是悬挂的

时间:2016-07-28 17:45:44

标签: c# treeview backgroundworker treenode opentext

我有一个TreeView,它包含基本上是文件夹的数据库对象。我希望能够点击"文件夹"在树中,让它填充一组控件,其中包含有关"文件夹"的数据。虽然这一切都适用于我编写的代码,但问题是使用键盘上的箭头键来上下文件夹列表最终将挂起应用程序。我的假设是我用来填充控件的后台工作程序正在挂起。

我已经搜索过,但我找不到与我的问题类似的内容。

这是我的树视图后面的代码。

private void dmTree_AfterSelect(object sender, TreeViewEventArgs e)
    {
        object[] tagParts = e.Node.Tag as object[];
        SelectedFolderNumber = tagParts[1].ToString();
        if (!String.IsNullOrEmpty(SelectedFolderNumber) && SelectedFolderNumber != "0")
        {
            //update mini profile
            if (bgwMiniProfile.IsBusy)
            {
                bgwMiniProfile.CancelAsync();
            }
            while (bgwMiniProfile.CancellationPending)
            {
                Application.DoEvents();
            }

            bgwMiniProfile.RunWorkerAsync();
            while (bgwMiniProfile.IsBusy)
            {
                Application.DoEvents();
            }
            securityPanel.DisplayTrusteeList(folderTrustees);
        }
    }

securityPanel是表单上的用户控件。 这是DisplayTrusteeList代码

public void DisplayTrusteeList(List<DocumentTrustee> documentTrustees)
    {
        try
        {
            dgvTrustees.Rows.Clear();
            foreach (DocumentTrustee dt in documentTrustees)
            {
                dgvTrustees.Rows.Add(imagePG.Images[(int)dt.TrusteeType], dt.GetFullName(dmLogin), dt.AccessRights);
            }
            foreach (DataGridViewRow myRow in dgvTrustees.Rows)
            {
                ValidateRights(int.Parse(myRow.Cells["dmRights"].Value.ToString()), myRow);
            }
            dgvTrustees.ClearSelection();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "DisplayTrusteeList");
        }
    }

以下是后台工作人员:

private void bgwMiniProfile_DoWork(object sender, DoWorkEventArgs e)
    {
        if (!bgwMiniProfile.CancellationPending)
        {
            SetText(txtDocNumber, SelectedFolderNumber);
            SetText(txtDocName, Utility.GetProfileValue(adminLogin, SelectedFolderNumber, "DOCNAME"));
            SetText(txtClientId, Utility.GetProfileValue(adminLogin, SelectedFolderNumber, "CLIENT_ID"));
            SetText(txtClientName, Utility.SetDescription(adminLogin, "CLIENT", txtClientId.Text));
            SetText(txtMatterId, Utility.GetProfileValue(adminLogin, SelectedFolderNumber, "MATTER_ID"));
            SetText(txtMatterName, Utility.SetDescription(adminLogin, "CLIENT", txtClientId.Text, txtMatterId.Text));

            folderTrustees = Utility.GetFolderTrustees(adminLogin, SelectedFolderNumber);
        }
        else
        {
            e.Cancel = true;
        }
    }

我希望能够使用箭头键在树节点上进行游标,并且不会触发后选择代码,直到用户登陆节点并在那里停留几秒钟。这可能吗?

谢谢,这是我的第一个问题。对不起,如果格式不是很好。我从这里使用了很多解决方案。

1 个答案:

答案 0 :(得分:0)

我找到了更好的方法。而不是使用AfterSelect我正在使用NodeMouseClick。这反映了Windows Explorer的功能。现在,用户可以在没有任何问题的情况下上下移动文件夹树。右侧的数据仅在单击节点时才会填写。这完全适合我。