0

基本的にフォルダーであるデータベース オブジェクトを含む TreeView があります。ツリー内の「フォルダー」をクリックして、その「フォルダー」に関するデータを一連のコントロールに入力できるようにしたいと考えています。これはすべて私が書いたコードで問題なく動作しますが、問題は、キーボードの矢印キーを使用してフォルダー リストを上下に移動すると、最終的にアプリケーションがハングすることです。私の推測では、コントロールを設定するために使用しているバックグラウンド ワーカーがハングアップしているということです。

検索しましたが、私の問題に似たものは見つかりません。

これが私のツリービューafterselectコードです。

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;
        }
    }

矢印キーを使用してツリー ノードをカーソルで移動し、ユーザーがノードに着陸して数秒間そこにとどまるまで、選択後のコードが起動しないようにしたいと考えています。それは可能ですか?

ありがとう、これが私の最初の質問です。フォーマットが良くない場合は申し訳ありません。ここから多くのソリューションを使用しました。

4

1 に答える 1

0

私はより良い方法を見つけました。AfterSelect を使用する代わりに、NodeMouseClick を使用しています。これは、Windows エクスプローラーの機能を反映しています。これで、ユーザーは問題なくフォルダ ツリーを上下に移動できます。右側のデータは、ノードをクリックしたときにのみ入力されます。これは私にとって完璧に機能します。

于 2016-07-29T17:35:18.557 に答える