none
treeview控件问题 RRS feed

  • 问题

  • 我的treeview控件初始化完成后,自动运行我的treeview_AfterSelect事件,请问是为什么,换了NodeMouseClick就可以了,我的代码是从另一个窗体复制过来的,这个2个窗体功能完全相同。搞不清为什么。还有现在换成NodeMouseClick事件了,获取子节点treeview.SelectedNode.Text 又不管用了获取的总是根节点内容,那个大哥帮下忙啊
    代码附下:
    private void CK_FrmDept_Load(object sender, EventArgs e)
            {
                initTree();
            }
      private void initTree()
            {
                subCreat_Node(trvSetDept);
                trvSetDept.ExpandAll();

            }
     private void subCreat_Node(TreeView trv)
            {
                int i, j;
                string deptName;
                string strsql = "select DeptName from WZT_Dept";
                string sql = "select count(*) AS DeptName from WZT_Dept";
                DataTable dt1 = new DataTable();
                if (!BFSearch.SearchBySQL(sql, dt1))
                {
                    MessageBox.Show("与网络连接失败!");
                    return;
                }
                j = Convert.ToInt32(dt1.Rows[0][0]);
                for (i = 0; i < j; i++)
                {
                    DataTable dt = new DataTable();
                    if (!BFSearch.SearchBySQL(strsql, dt))
                    {
                        MessageBox.Show("与网络连接失败!");
                        return;
                    }
                    deptName = (dt.Rows[i][0]).ToString();
                    TreeNode newNode = new TreeNode(deptName);
                    trv.Nodes[0].Nodes.Add(newNode);
                }
            }
     private void trvSetDept_AfterSelect(object sender, TreeViewEventArgs e)
            {
                string deptName;
                int state;
                int type;
                deptName= trvSetDept.SelectedNode.Text.Trim();
                string strsql = "select DeptUID,Remark,State,Type from WZT_Dept where DeptName='" + deptName + "'";
                DataTable dt = new DataTable();
                if (!BFSearch.SearchBySQL(strsql, dt))
                {
                    MessageBox.Show("与网络连接失败!");
                    return;
                }
                txtDeptName.Text = deptName;
                txtDeptUID.Text = dt.Rows[0]["DeptUID"].ToString();
                Remark.Text = dt.Rows[0]["Remark"].ToString();
                state = Convert.ToInt32(dt.Rows[0]["State"]);
                type = Convert.ToInt32(dt.Rows[0]["Type"]);
                if (state == 1)
                {
                    ckState.Checked = true;
                }
                if (type == 2)
                {
                    ckType.Checked = true;
                }
            }
    麻烦你给看下吧

    2009年6月2日 4:20

答案

  • 刚才试了下 TreeView 默认会选中第一个节点,你可以定义TreeView BeforeSelect 事件能过下面的文件来解决你的问题

    private bool fIsFirst = true;
    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        if (fIsFirst && e.Node == treeView1.Nodes[0])
        {
            e.Cancel = true;
            fIsFirst = false;
        }
    }


    知识改变命运,奋斗成就人生!
    2009年6月2日 6:00
    版主

全部回复

  • 你好!
         请问可以提供相关的代码吗?
    周雪峰
    2009年6月2日 5:04
    版主
  • 自动运行 treeview_AfterSelect 可能是你在初始TreeView 时设置TreeView.SelectedNode = xxx
    知识改变命运,奋斗成就人生!
    2009年6月2日 5:05
    版主
  • private void CK_FrmDept_Load(object sender, EventArgs e)
            {
                initTree();
            }
      private void initTree()
            {
                subCreat_Node(trvSetDept);
                trvSetDept.ExpandAll();

            }
     private void subCreat_Node(TreeView trv)
            {
                int i, j;
                string deptName;
                string strsql = "select DeptName from WZT_Dept";
                string sql = "select count(*) AS DeptName from WZT_Dept";
                DataTable dt1 = new DataTable();
                if (!BFSearch.SearchBySQL(sql, dt1))
                {
                    MessageBox.Show("与网络连接失败!");
                    return;
                }
                j = Convert.ToInt32(dt1.Rows[0][0]);
                for (i = 0; i < j; i++)
                {
                    DataTable dt = new DataTable();
                    if (!BFSearch.SearchBySQL(strsql, dt))
                    {
                        MessageBox.Show("与网络连接失败!");
                        return;
                    }
                    deptName = (dt.Rows[i][0]).ToString();
                    TreeNode newNode = new TreeNode(deptName);
                    trv.Nodes[0].Nodes.Add(newNode);
                }
            }
     private void trvSetDept_AfterSelect(object sender, TreeViewEventArgs e)
            {
                string deptName;
                int state;
                int type;
                deptName= trvSetDept.SelectedNode.Text.Trim();
                string strsql = "select DeptUID,Remark,State,Type from WZT_Dept where DeptName='" + deptName + "'";
                DataTable dt = new DataTable();
                if (!BFSearch.SearchBySQL(strsql, dt))
                {
                    MessageBox.Show("与网络连接失败!");
                    return;
                }
                txtDeptName.Text = deptName;
                txtDeptUID.Text = dt.Rows[0]["DeptUID"].ToString();
                Remark.Text = dt.Rows[0]["Remark"].ToString();
                state = Convert.ToInt32(dt.Rows[0]["State"]);
                type = Convert.ToInt32(dt.Rows[0]["Type"]);
                if (state == 1)
                {
                    ckState.Checked = true;
                }
                if (type == 2)
                {
                    ckType.Checked = true;
                }
            }
    这是代码

    2009年6月2日 5:35
  • 刚才试了下 TreeView 默认会选中第一个节点,你可以定义TreeView BeforeSelect 事件能过下面的文件来解决你的问题

    private bool fIsFirst = true;
    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        if (fIsFirst && e.Node == treeView1.Nodes[0])
        {
            e.Cancel = true;
            fIsFirst = false;
        }
    }


    知识改变命运,奋斗成就人生!
    2009年6月2日 6:00
    版主
  • bool mblnCreateNode=false;

    private void subCreat_Node(TreeView trv)
            {
    mblnCreateNode=true;

    ......

    mblnCreateNode=false;
            }
     private void trvSetDept_AfterSelect(object sender, TreeViewEventArgs e)
            {
    if (mblnCreateNode) return;

    ......

    }


    http://feiyun0112.cnblogs.com/
    2009年6月2日 6:27
    版主
  • 是的,第一次TreeView具有输入焦点的时候会选中第一个节点,所以会触发AfterSelect事件!

    周雪峰
    2009年6月2日 11:13
    版主