第一次发帖各位多照顾!frmmain窗体上有treeview,用treeview打开新窗体form时焦点不会在新窗体form上,而是在frmmain上。
.focus/.Activate 无效!
不想用form.ShowDialog和form.TopMost否则就不能切换了!
看了一些帖子有用timer或异步处理的!觉得不是很理想!期待高手解决这个问题!万分感谢!

解决方案 »

  1.   

       private void button1_Click(object sender, EventArgs e)
            {
                Form frm = new Form();
                frm.Show();
                frm.BringToFront();
            }
      

  2.   

    ShowWindow( StayOnTopForm.Handle, SW_SHOWNA );
    splitcontainer  
    将form2的parent设为panel1 
      

  3.   

    感谢楼上两位的回答!
    ZengHD 的 是用按钮打开,但是我想用的是treeview打开,frm.BringToFront()也没有用。
    wuyq11 的是在同一个窗口中操作,我想要的效果是打开一个主窗体以外的新窗体!接着补充,从treeview中打开新窗体时新窗体只是一闪就失去焦点了!我也觉得很奇怪,焦点一直在treeview上!
      

  4.   

    给出代码,看看你使用treeview的什么事件
      

  5.   


    private void treeView1_NodeMouseClick(object sender,TreeNodeMouseClickEventArgs e)
            {
            form2 f=new form2();
            f.show();
             }新窗体不属于主窗体!
      

  6.   

    在新窗体出来前先让主窗体失去焦点
    parent.losefocus();
    f.show();
      

  7.   

    lostFocus 不是这样用吧!我估计是treeview在执行完所有代码后会自动将焦点回归到自己身上来!怎么克服这点是关键!
      

  8.   


            #region 点击TV节点打开窗体
            private delegate void dlgProc(string path);//声明了一个代理用来执行一个异步的操作.        private void thProc(string path)//异步调用时执行的方法
            {
                dlgProc dp = new dlgProc(OpenSubForm);//声明一个代理用来执行原来线程里的方法
                this.Invoke(dp, new object[] { path });//在这里再用Invoke来调用原来线程里的打开窗体的方法
            }        private void OpenSubForm(string path)
            {
                switch (path)
                {
                    case "exit":
                        timer1.Stop();
                        this.Close();
                        break;
                    case "toubao":
                        if (Application.OpenForms["Toubao"] == null)
                        {
                            Toubao tb = new Toubao();
                            tb.Show();
                        }
                        break;
                    case "setting":
                        if (Application.OpenForms["Setting"] == null)
                        {
                            Setting set = new Setting();
                            set.Show();
                        }
                        break;
                    case "ExportData":
                        if (Application.OpenForms["ExportData"] == null)
                        {
                            ExportData ed = new ExportData();
                            ed.Show();
                        }
                        break;
                    case "LoadStud":
                        if (Application.OpenForms["LoadStud"] == null)
                        {
                            LoadStud ls = new LoadStud();
                            ls.Show();
                        }
                        break;
                    case "ClearStudInfo":
                        .......
                        break;
                }
            }
            private void TV_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                string path=e.Node.Name;
                dlgProc dp = new dlgProc(this.thProc);//声明代理实例
                dp.BeginInvoke(path, null, null);//开始执行异步的操作        }
            #endregion
      

  9.   

    异步是可以的!还有用timer也可以!我只是想知道问题出在哪?
    谢谢各位的回答!
    非常感谢!