我的C#应用程序中用两个窗体(Form1与Form2),Form1与Form2之间是平等关系(不是父窗体与子窗体的关系),如何将Form1总在Form2之前(而不是将Form1的TopMost属性设为true,将Form1最前端显示),且打开其他程序的界面时,新打开的界面在Form1和Form2之前显示(也就是说让Form1与Form2紧贴在一起),而不是将新打开的其他程序界面在Form1和Form2之间显示。
    这种情况如何控制,是不是需要自己写代码啊?如果需要写代码,从哪开始着手呢?

解决方案 »

  1.   

    多谢netnpc ,呵呵,第一次发贴,希望大家多多帮助!
      

  2.   

    设置 Form2的 Owner为Form1,不过跟楼主的要求不是完全一致,可以测试一下,不符合要求就继续等其他人的好办法
      

  3.   

    呵呵,不会。顺便把以下的还给你!  C#中   DataGridView   属性说明           
    ① 取得或者修改当前单元格的内容   
    ② 设定单元格只读   
    ③ 不显示最下面的新行   
    ④ 判断新增行   
    ⑤ 行的用户删除操作的自定义   
    ⑥ 行、列的隐藏和删除   
    ⑦ 禁止列或者行的Resize   
    ⑧ 列宽和行高以及列头的高度和行头的宽度的自动调整   
    ⑨ 冻结列或行   
    ⑩ 列顺序的调整   
    ⑪ 行头列头的单元格   
    ⑫ 剪切板的操作   
    ⑬ 单元格的ToolTip的设置   
    ⑭ 右键菜单(ContextMenuStrip)的设置   
    ⑮ 单元格的边框、   网格线样式的设定   
    ⑯ 单元格表示值的设定   
    ⑰ 用户输入时,单元格输入值的设定   
    ⑱ 设定新加行的默认值   
    http://blog.csdn.net/tangcx/archive/2007/09/12/1782297.aspx#A1
      

  4.   

    cncxz 的方法可行,试了一下,将form1的owner设为form2,把form2的owner设为form1,两个窗体就在一起了,中间不能再插入其他的窗体
      

  5.   

    多谢wuhq030710914 ,我试试!
      

  6.   

    Form1 f1=new Form1();Form2 f2=new Form2();f2.AddOwnedForm(f1);
    f1.Show();
      

  7.   

    wuhq030710914,我将form1的owner设为form2,把form2的owner设为form1时,提示下面异常:    “ArgumentException was unhandled: A circular control reference has been made. A control cannot be owned by or parented to itself.”,自己想了一下,这样的逻辑是不对的,不可能“将一个窗体的父窗体设置成它的子窗体”啊?wuhq030710914你是怎么做的啊?
      

  8.   

    谢谢hbxtlhx,我试了一下,还是不行!打开其他程序的界面,还会出现在这两个窗体中间。
      

  9.   

    可能是我说的不太清楚吧,我再描述详细点!
        我的C#应用程序中用到两个窗体(Form1与Form2),Form1与Form2之间是平等关系(不是父窗体与子窗体的关系),在Form1上设置一个按钮,当点击该按钮时new窗体Form2,并调用Form2.Show()将Form2显示,如何将Form2总在Form1之前(而不是将Form2的TopMost属性设为true,将Form2最前端显示),且打开其他程序的界面时,新打开的界面在Form1和Form2之前显示(也就是说让Form1与Form2紧贴在一起),而不是将新打开的其他程序界面在Form1和Form2之间显示。 
        这种情况如何控制,是不是需要自己写代码啊?如果需要写代码,从哪开始着手呢? 
      

  10.   

    wuhq030710914,我将form1的owner设为form2,把form2的owner设为form1时,提示下面异常:         “ArgumentException   was   unhandled:   A   circular   control   reference   has   been   made.   A   control   cannot   be   owned   by   or   parented   to   itself.”,自己想了一下,这样的逻辑是不对的,不可能“将一个窗体的父窗体设置成它的子窗体”啊?wuhq030710914你是怎么做的啊? 
    ------------------------------------------------------------------------------------
    你不是说不是父窗体和子窗体的关系吗 ?
    我是这样写的,在一个窗体中通过两个按钮分别打开两个窗体:
    Form2_1_ f21;
    Form1 f1;
    private void button1_Click(object sender, EventArgs e)
            {
                f21 = new Form2_1_();
                f21.Show();
                f21.Owner =f1;
            }
    private void button2_Click(object sender, EventArgs e)
            {
                f1 = new Form1();
                f1.Show();
                f1.Owner =f21;
            }
    我这儿没有问题,看看你是不是这个意思 
      

  11.   

    我点Form2_1_的时候Form1 也会一起显示在最前面来,点Form1 的时候Form2_1_同样也会显示在最前面来
      

  12.   

    没有问题的啊,我测试过了,和楼主说的问题正好相符,如下的代码可以粘到Form1的类中,并进行测试应该是可以的:
    protected override void OnDoubleClick(EventArgs e)
    {
    base.OnDoubleClick(e); Form2 f = new Form2();
    f.Show(this);//这里和AddOwnerdForm是一样的,两个窗体不是父子窗体,但确会关联在一起
    }
      

  13.   

    在Form1上设置一个按钮,当点击该按钮时new窗体Form2,并调用Form2.Show()将Form2显示,如何将Form2总在Form1之前(而不是将Form2的TopMost属性设为true,将Form2最前端显示
    --------------------------------------------------------------------------------
    打开Form2 的按钮在Form1 上,那不是用showDialog()打开Form2就行了嘛
      

  14.   

    showDialog(this);就实现你要的效果了。
      

  15.   

        wuhq030710914,我用你的代码执行了一下,当打开其他程序界面(比如一个文件夹)时,文件夹还能出现在Form1和Form2之间! 
        其实我想做到的是:在Form1上设置一个按钮,当点击该按钮时new窗体Form2,并调用Form2.Show()将Form2显示;此时Form2在Form1前,在打开其他程序界面时,使其他程序界面出现在屏幕最前端,而不是出现在Form1与Form2之间!
      

  16.   

    wuhq030710914,我用你的代码执行了一下,当打开其他程序界面(比如一个文件夹)时,文件夹还能出现在Form1和Form2之间!   
            其实我想做到的是:在Form1上设置一个按钮,当点击该按钮时new窗体Form2,并调用Form2.Show()将Form2显示;此时Form2在Form1前,在打开其他程序界面时,使其他程序界面出现在屏幕最前端,而不是出现在Form1与Form2之间!
    ------------------------------------------------------------------------------------------
    按钮事件中:
    Form2 f2=new Form2();
    f2.ShowDialog();
      

  17.   

    多谢lye2000000_super,lye2000000_super,hbxtlhx...
    可是还没有完全解决该问题:
        其实我想做到的是:在Form1上设置一个按钮,当点击该按钮时new窗体Form2,并调用Form2.Show()将Form2显示;此时Form2在Form1前,在打开其他程序界面时,使其他程序界面出现在屏幕最前端,而不是出现在Form1与Form2之间!
        重点是在打开其他程序界面时,使其他程序界面出现在屏幕最前端,而不是出现在Form1与Form2之间! 
      

  18.   

    LZ看看是不是你的其他地方搞错了,我的两种方法在打开其他程序的时候都不会显示在Form1和Form2之间(在我这儿)
      

  19.   

        lye2000000_super,lye2000000_super你们的方法是对的。
         可是ShowDialog()方法是将窗体显示为有模式对话框,也就是说该打开窗体必须关闭或隐藏,才能继续使用应用程序的其余部分。而我现在想要的是在打开Form2的同时,操作Form1的其它部分,因此,我觉得只能用Form.Show()方法去实现。
         也就是说在用Form.Show()显示窗体的前提下,实现“在Form1上设置一个按钮,当点击该按钮时new窗体Form2,并调用Form2.Show()将Form2显示;此时Form2在Form1前,在打开其他程序界面时,使其他程序界面出现在屏幕最前端,而不是出现在Form1与Form2之间”的功能!
      

  20.   

    楼主你的From2是不是设置了TopMost为True了?
      

  21.   


    using System;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Windows.Forms;namespace WorkFlowNew.UIimage
    {

    public class ScanToolWinAPI
    {
    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern IntPtr GetForegroundWindow();   private delegate void SetThreadTest();   
    private Thread Th; 
    private IntPtr MainInt;  
            private Form TForm;  
    public ScanToolWinAPI(IntPtr MainIntPrt,Form ToolForm)
    {
    MainInt=MainIntPrt;  
    TForm=ToolForm;
    }

    public void Star()
    {
    SetThreadTest delega =new SetThreadTest(SetForm);     
    Th=new Thread(new ThreadStart(delega));  
    Th.Start();
    }
    /// <summary>
    /// 方法(用于委托)更改前后位置
    /// </summary>
    private void SetForm()
    {
    while(true)  //死循环 除非ABORT
    {
    if(MainInt==GetForegroundWindow())  
    {
    TForm.TopMost=true; 
    }
    else
    {
    TForm.TopMost=false;  
    }
    Thread.Sleep(1);  
    }
    }
    /// <summary>
    /// 关闭线程
    /// </summary>
    public void Close()
    {
    if(Th.IsAlive==true)Th.Abort();   
    }
    }
    }private WorkFlowNew.UIimage.ScanToolWinAPI SelectToolFrom;   
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null) 
    {
    components.Dispose();
    }
    }
    SelectToolFrom.Close();    //在关闭前 要关闭线程
    base.Dispose( disposing );
    }
    private void LoadFrom()
    {
    From2 from2=new From2;
    SelectToolFrom=new ScanToolWinAPI(this.Handle,from2);   //启动线程类开始检查窗体是否是活动窗体
    }看看能行不
      

  22.   

    多谢克劳德,不过还是不能得到预想结果,和直接调用Show()的效果一样!
      

  23.   

    经测试,hbxtlhx的两种方法都可以实现我想要的功能!多谢wuhq030710914,cncxz(克劳德) 帮我提供思路,谢谢大家的热心帮助,现在圆满结贴!