Как я могу получить текущий узел, выбранный в элементе управления TreeView? - PullRequest
3 голосов
/ 03 января 2011

Когда я использую событие 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;
            }

        }

Заранее спасибо ...

1 Ответ

5 голосов
/ 03 января 2011

Вы можете использовать метод HitTest , предоставляемый элементом управления TreeView в сочетании с расположением указателя мыши, когда произошло событие MouseClick ( e.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 не является нулевым, прежде чем делать что-либо еще с ним. Если пользователь щелкнул что-то, что является , а не узлом, объект selectedNode, полученный методом HitTest, будет null.

Вероятно, это сейчас не работает для вас, потому что вы пытаетесь использовать 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 предметов. Каждый из узлов дерева [s] в коллекция имеет свойство Nodes, которое может содержать свой собственный TreeNodeCollection. Это вложение узлы дерева могут затруднить перемещаться по древовидной структуре. FullPath свойство облегчает определите свое местоположение в дереве.

...