3

ツリービューコントロールのイベントを使用するMouseClickと、常にツリーの最初のノードが選択されます。ユーザーが現在のノードを選択するにはどうすればよいですか?私はC#を使用しています。

これは私が現在使用しているコードです:

private void TVRecorder_MouseClick(object sender, MouseEventArgs e)
{
    TreeNode selectedNode = TVRecorder.HitTest(e.Location).Node;
    if (selectedNode != null)
    {
        if (selectedNode.SelectedImageKey == "Test_Space")
        {
            frmRepository rep = new frmRepository();
            string ssql = string.Empty;
            rep.label1.Text = "Scenario-RepositoryDetails";
            rep.LoadAppSettings();
            SqlConnection con4 = new SqlConnection();

            con4.ConnectionString = "Data Source=" + rep.ScnServer + ";" + "initial catalog=" + rep.ScnDbName + ";" + "User Id=" + rep.ScnUserName + ";" + "Password=" + rep.ScnPwd;
            try
            {
                con4.Open();
            }
            catch
            {
                MessageBox.Show("Connection Failed");
            }
            ssql = "scn_select_testplan_sp";
            SqlCommand cmd = new SqlCommand(ssql, con4);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@testspace_key", SqlDbType.Int);
            cmd.Parameters["@testspace_key"].Value = testspace_key;
            SqlDataReader _datareader = cmd.ExecuteReader();
            try
            {
                while (_datareader.Read())
                {
                    testplan_key = (int)_datareader["testplan_key"];
                    testplan_desc = (string)_datareader["testplan_desc"];
                    //selectedNode.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");
                    TVRecorder.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");
                    TVRecorder.Visible = true;
                    TVRecorder.HideSelection = false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

前もって感謝します...

4

1 に答える 1

5

コントロールによって公開されたHitTestメソッドを、イベント発生TreeView時のマウス ポインターの位置 ( ) と組み合わせて使用​​して、どのノードがクリックされたかを判断できます (したがって、イベントの終了時に選択されているように見えます)。例えば:MouseClicke.Location

private void TreeView_MouseClick(object sender, MouseEventArgs e)
{
    // Get the node that was clicked
    TreeNode selectedNode = myTreeView.HitTest(e.Location).Node;

    if (selectedNode != null)
    {
        // ...
        // Do something with the selected node here...
    }
}

selectedNode上記のコードは、他の操作を行う前に、が null でないことを確認するためにチェックすることに注意してください。ユーザーがノードではないものをクリックした場合、メソッドselectedNodeによって取得されるオブジェクトはになります。HitTestnull

コントロールのSelectedNodeプロパティを使用しようとしているため、現在はおそらく機能していません。TreeViewイベント ハンドラー メソッドのコードが実行されているとき、ノードはまだ選択されていません。そのコードが実行された後MouseClickにのみ選択されます。代わりに上記の方法を使用すると、最終的に選択されるノードをより直接的に取得できます。


以下の更新とコメントに関する編集:

これは私には簡単な修正のように見えます。この問題は、コードの次の行で発生します。

TVRecorder.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");

上記のコードは、新しいノードを に表示される最初のノードの子として追加しますTreeView。代わりに、選択したノードの子としてそれらを追加したいようです。選択したノードが何であるかは既に決定しているため (回答の上記の部分を参照)、コードを変更して、選択したノードの子として新しいノードを追加する必要があります。次のようにします。

selectedNode.Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");

すべてのノード (TreeNodeクラスのインスタンス) には、を公開するNodesプロパティTreeNodeCollectionがあることに注意してください。このコレクションは、そのノードのすべての子ノードを保持します。MSDN は、おそらくこれを私ができるよりもうまく説明しています。

プロパティは、他のオブジェクトのNodesコレクションを保持できます。TreeNodeコレクション内の各ツリー ノードにNodesは、独自の を含むことができるプロパティがあります TreeNodeCollection。このツリー ノードのネストにより、ツリー構造のナビゲートが困難になる場合があります。この FullPathプロパティにより、ツリー内の位置を簡単に特定できます。

于 2011-01-03T05:34:13.950 に答える