同一个WinFOrm变成两个界面后怎么同步变化界面

浩洁 2014-04-29 09:42:14
是这样的,我有一个窗体,上面有一个按钮是全屏显示,其实就是把这个窗体重新再生成一个全屏的窗体
        private void button1_Click(object sender, EventArgs e)
{
if (this.button1.Text == "Full Screen")
{
Report f = new Report();
f.StartPosition = FormStartPosition.CenterScreen;
f.FormBorderStyle = FormBorderStyle.None;
f.WindowState = FormWindowState.Maximized;
f.button1.Text = "Exit Screen";
f.TopMost = true;
this.WeekList.Width = Screen.PrimaryScreen.WorkingArea.Width;
f.ShowDialog();
}
else
{
this.Dispose();
this.Close();
}
}
为什么要保证两个窗体同步,是因为在窗体操作更新了一些选项后,如果退出全屏后小窗体的选项想要保持在全屏后选择的那些状态。不知道要怎么操作?
...全文
537 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
寂空冷 2014-04-30
  • 打赏
  • 举报
回复
浩洁 2014-04-30
  • 打赏
  • 举报
回复
引用 32 楼 jiangfling 的回复:
使用相同的数据源就OK了
谢谢,我会尝试,我的这个窗体有多个表分别分布在一个TabControl里面的多个页面里面,而且每个页面里的表是根据该页面的工作间栏的选项来筛选数据。现在考虑可能使用变量把各个选项做为配置或变量储存起来再在窗体里加载的时候把这些加载进去还是怎么做吧。
Johnyin 2014-04-30
  • 打赏
  • 举报
回复
学学委托和事件吧。可以完美解决你的问题。
PaulyJiang 2014-04-30
  • 打赏
  • 举报
回复
使用相同的数据源就OK了
PaulyJiang 2014-04-30
  • 打赏
  • 举报
回复
引用 34 楼 mpy2003 的回复:
引用 32 楼 jiangfling 的回复:
使用相同的数据源就OK了
谢谢,我会尝试,我的这个窗体有多个表分别分布在一个TabControl里面的多个页面里面,而且每个页面里的表是根据该页面的工作间栏的选项来筛选数据。现在考虑可能使用变量把各个选项做为配置或变量储存起来再在窗体里加载的时候把这些加载进去还是怎么做吧。
没有关系,筛选只是不显示而已。只要是同一行的数据用同一个对象来表示,那么他们在内存中的地址是相同的,所以修改其中一个只会另外的也会跟着变的。 也就是说你不同的From直接传值传的只是对象的指针
wfy4422 2014-04-30
  • 打赏
  • 举报
回复
虽然不是很明白为什么要两个窗体。不过还是有两个办法的。1.定义委托,关闭全屏窗体就回传那些控件的状态就行了啊,不过要定义好回传过来的对象;2.在窗体类内定义一个自身的属性,打开全屏窗体就引用过去,操作全屏窗体时顺便更新引用过去的对象。

Report  frm=null;
 private void button1_Click(object sender, EventArgs e)
        {
            if (this.button1.Text == "Full Screen")
            {
                Report f = new Report();
              //引用自身
               f.frm=this;
                f.StartPosition = FormStartPosition.CenterScreen;
                f.FormBorderStyle = FormBorderStyle.None;
                f.WindowState = FormWindowState.Maximized;
                f.button1.Text = "Exit Screen";
                f.TopMost = true;
                this.WeekList.Width = Screen.PrimaryScreen.WorkingArea.Width;
                f.ShowDialog();
            }
            else
            {
                this.Dispose();
                this.Close();
            }
        }
dianjixue1 2014-04-29
  • 打赏
  • 举报
回复
这个全屏是本身全屏比较好,把要全屏的部分里面的控件都设置成自适应大小的,也就是把Anchor和Dock属性都设置好 原理是把要全屏的部分重新放置在一个新的窗体里,这个窗体最大化,全屏还原的时候再把它塞回原来的窗体里。 代码仅供参考

protected Form con = null;//保存父级容器
/// <summary>
        /// 最大化
        /// </summary>
        protected void BaseFullScreen(out Form parentForm)
        {
            parentForm = this.ParentForm;//这里的this是要全屏的Form,这段代码是在这个Form里面写的,不是在主窗体里写的
            MainForm main = parentForm as MainForm;//MainForm是主窗体
            main.pnlMain.Controls.Remove(this);///这里在主窗体中把要全屏的部分,也就是this抠除
            main.Visible = false;
            this.TopLevel = true;
            //this.TopMost = true;
            //获取屏幕分辨率
            int SH = Screen.PrimaryScreen.Bounds.Height;
            int SW = Screen.PrimaryScreen.Bounds.Width;
            this.Size = new Size(SW, SH);
            //SetToolTipName();
            this.Activate();
            this.isFullScreen = true;
        }
//要说明的是,上述代码要全屏的部分已经是一个Form了,所以就把大小和位置改了一下,如果不是Form而是UserControl或者是Panel之类的,就再新建一个全屏的Form把它放进去。
/// <summary>
        /// 最大化还原
        /// </summary>
        protected void BaseReduction(Form parentForm)
        {
            if (parentForm != null)
            {
                //this.TopMost = false;
                this.TopLevel = false;
                this.Dock = DockStyle.Fill;
                MainForm2 main = parentForm as MainForm2;
                main.pnlMain.Controls.Add(this);//把这个Form塞回去
                main.Visible = true;
                this.isFullScreen = false;
                //this.Focus();
            }
        }

/// <summary>
        /// 窗体全屏
        /// </summary>
        protected override void TabFormFullScreen()
        {
            if (!isFullScreen)//全屏
            {
                this.picFullScreen.Image = global::MachineTeachUI.Properties.Resources.t6;//更换切换按钮图标
                base.BaseFullScreen(out con);
                this.ttVia.SetToolTip(this.picFullScreen,"还原");//设置切换按钮浮动显示内容
            }
            else//还原
            {
                this.picFullScreen.Image = global::MachineTeachUI.Properties.Resources.t5;
                base.BaseReduction(con);
                this.ttVia.SetToolTip(this.picFullScreen, "全屏");
                con = null;
           }
思路就是这样的。
wg5945 2014-04-29
  • 打赏
  • 举报
回复
全屏主要不就是设置 this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized; 这两个属性么? 会对当前form其他的属性有影响? 你的form里面有个下拉框,选个1,全屏之后会变成2?
引用 13 楼 mpy2003 的回复:
[quote=引用 9 楼 qyj2009 的回复:]
引用 10 楼 wg5945 的回复:
引用 11 楼 zhujiawei7 的回复:
例如窗体中有这些选项,我是要根据这些选项来加载不同的消息,所以做为全屏的消息窗体改变后,怎么让原窗体跟着变,这就是关键,前面有大哥说可以使用配置,可能是一种方法,但是感觉每一个选项都会触发事件,加载配置的话是不是要重复很多次事件?[/quote]
浩洁 2014-04-29
  • 打赏
  • 举报
回复
引用 12 楼 BenBenBears 的回复:
全屏与否会改变控件的状态?
肯定是要改变的呀,有选项要变化
浩洁 2014-04-29
  • 打赏
  • 举报
回复
引用 9 楼 qyj2009 的回复:


引用 10 楼 wg5945 的回复:


引用 11 楼 zhujiawei7 的回复:
例如窗体中有这些选项,我是要根据这些选项来加载不同的消息,所以做为全屏的消息窗体改变后,怎么让原窗体跟着变,这就是关键,前面有大哥说可以使用配置,可能是一种方法,但是感觉每一个选项都会触发事件,加载配置的话是不是要重复很多次事件?
BenBenBears 2014-04-29
  • 打赏
  • 举报
回复
全屏与否会改变控件的状态?
zhujiawei7 2014-04-29
  • 打赏
  • 举报
回复
采用数据绑定DataBindings,无论多少个UI界面都绑定到同一个数据源。操作一个界面全部跟着变。
wg5945 2014-04-29
  • 打赏
  • 举报
回复
引用 8 楼 mpy2003 的回复:
[quote=引用 6 楼 BenBenBears 的回复:] [quote=引用 3 楼 wg5945 的回复:] 为什么要2个窗口呢? 本身全屏不可以么?
+1[/quote]因为这个窗体是我的一个子窗体用来放到一个显示器上的,如果要操作其他子窗体则要退出全屏,再回来全屏的话,不是选项都没了吗?另外铜臂阿铁木说的我没有用过,我的想法是不是可以添加模块来做?[/quote] 表示没看懂~~ 全屏的窗口退出全屏,再回来全屏,上面的选项会没了?
水目 2014-04-29
  • 打赏
  • 举报
回复
引用 8 楼 mpy2003 的回复:
[quote=引用 6 楼 BenBenBears 的回复:] [quote=引用 3 楼 wg5945 的回复:] 为什么要2个窗口呢? 本身全屏不可以么?
+1[/quote]因为这个窗体是我的一个子窗体用来放到一个显示器上的,如果要操作其他子窗体则要退出全屏,再回来全屏的话,不是选项都没了吗?另外铜臂阿铁木说的我没有用过,我的想法是不是可以添加模块来做?[/quote] 这个会没数据吗?没关闭的话还是存在的吧?没试过 两窗体同步数据这个只要在需要的时候读一下最新数据不就行了么? 楼上各位的说法都可以啊 就看你怎么实现了
浩洁 2014-04-29
  • 打赏
  • 举报
回复
引用 6 楼 BenBenBears 的回复:
[quote=引用 3 楼 wg5945 的回复:] 为什么要2个窗口呢? 本身全屏不可以么?
+1[/quote]因为这个窗体是我的一个子窗体用来放到一个显示器上的,如果要操作其他子窗体则要退出全屏,再回来全屏的话,不是选项都没了吗?另外铜臂阿铁木说的我没有用过,我的想法是不是可以添加模块来做?
IEEE_China 2014-04-29
  • 打赏
  • 举报
回复
把配置写入数据库,或者文件。 无论几个窗体,载入时读取配置就是了。 再者,能用一个就不要用2个了吧。
BenBenBears 2014-04-29
  • 打赏
  • 举报
回复
引用 3 楼 wg5945 的回复:
为什么要2个窗口呢? 本身全屏不可以么?
+1
铜臂阿铁木 2014-04-29
  • 打赏
  • 举报
回复
引用 4 楼 mpy2003 的回复:
[quote=引用 2 楼 sunzongbao2007 的回复:] 让两个窗口都具有 LoadData 方法, 当focus或者关闭其中一个时, 调用另一个的LoadData方法。 就酱啊
这个LoadData是怎么操作?不太了解这样的操作,能举些例子吗?谢谢[/quote] 如果你的程序特别小的话, 就把两个窗口都需要的数据存到static 对象里面 ,虽然不是什么好习惯。 比如叫public static DataContainer Datas{get;set;} 让你的两个窗口都有共同的方法 reloadData() 然后reloadData做的是 通过Datas里面存的东西,来改变页面的显示内容。 我只能解释到这里了,我不可能抽出时间写代码给你,今天会csdn只是溜达溜达。。。
浩洁 2014-04-29
  • 打赏
  • 举报
回复
引用 2 楼 sunzongbao2007 的回复:
让两个窗口都具有 LoadData 方法, 当focus或者关闭其中一个时, 调用另一个的LoadData方法。 就酱啊
这个LoadData是怎么操作?不太了解这样的操作,能举些例子吗?谢谢
wg5945 2014-04-29
  • 打赏
  • 举报
回复
为什么要2个窗口呢? 本身全屏不可以么?
加载更多回复(17)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧