winform同一个窗体下切换界面实现上一步下一步

pencher_liu 2018-09-03 05:14:42
做了一个检测软件,用来检测PCB板的一些功能是否正常。要求:有两个界面,一个landing界面,选择要检测的功能,点击下一步,在第二个界面显示第一个界面选择的功能,并做检测,该界面同时也有上一步的按钮。
由于两个界面菜单栏相同,所以我想做成一个form下显示。我把两个界面上的所有控件分别做成了usercontrol,control1和control2,问题是在一个form下该怎么切换显示这两个control?或者还有其他方案吗,boss要求做的模块化一点。
...全文
1911 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
polic 2019-01-31
  • 打赏
  • 举报
回复
建议用TabControl来做
  • 打赏
  • 举报
回复
但是实际上纠结这两个语句其实都是纠结于皮毛,你的 boss 应该会告诉你,该从哪一个层次来搞软件设计。 注意是设计软件。而不是从底层来拼凑代码。
  • 打赏
  • 举报
回复
“上一步、下一步”操作,其实使用 Visible 控制或者使用 Controls.Add 都有可能。例如
private int p;   //实际上在 VM 中,这里应该设计为属性并且可以触发 INotifyPrpertyChanged 事件

private ObservableCollection<MyUserControl> uc = new ObservableCollection<MyUserControl>();

public void 下一步()
{
    p++;
    for(var i=0; i<uc.Count; i++)
        if(i==p)
            uc[i].Visible = true;
        else 
            uc[i].Visible = false;
}
或者是
private int p;   //实际上在 VM 中,这里应该设计为属性并且可以触发 INotifyPrpertyChanged 事件

private ObservableCollection<MyUserControl> uc = new ObservableCollection<MyUserControl>();

public void 下一步()
{
    p++;
    this.Controls.Clear();
    for(var i=0; i<uc.Count; i++)
        if(i==p)
            this.Controls.Add(uc[i]);
}
但是这里最关键地是,用户控件实例是持久化在内存中的,不会因为什么 controls.Clear() 方法而动态创建或者被 gc 释放,而是在一个独立的集合中维系的用户控件。这样它才不会在“下一步、上一步”的操作中丢失状态。
release他爹爹 2018-12-29
  • 打赏
  • 举报
回复
可能是窗体实例加载的不对
  • 打赏
  • 举报
回复
引用 19 楼 desperaso 的回复:
大概这么个意思么?

        Panel panel_A, panel_B;
        Label View;

肯定不是! 用户控件应该是一个 Observable<MyUserControl> 的动态集合(这里你自己设计用户控件的抽象父类或者接口),应该实现动态添加用户控件时,Form就自动更新界面表现,并且自动产生“上一步、下一步”的控制逻辑。 怎么能写死只有两个Panel?怎么能写死什么 Label?怪不得你们 boss 说让你“模块化一点”,其实是你还不会搞软件设计,只会照抄最简单的代码。你需要跟 boss 请教一下程序设计时为什么要抽象。
gd6321374 2018-12-29
  • 打赏
  • 举报
回复


可以参考我的,使用一个panel 点击上一步或下一步,切换不同窗体。




/// <summary>
/// 数据库配置窗口
/// </summary>
private void ShowActivationForm2Step()
{
if (mActivationForm2Step == null)
{
mActivationForm2Step = new ActivationStep2Form(this);

mActivationForm2Step.FormBorderStyle = FormBorderStyle.None;
mActivationForm2Step.TopLevel = false;
mActivationForm2Step.ControlBox = false;
mActivationForm2Step.Dock = System.Windows.Forms.DockStyle.Fill;
mActivationForm2Step.AutoScroll = true;
mActivationForm2Step.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
}

this.mSubPanel.Controls.Clear();
this.mSubPanel.Controls.Add(mActivationForm2Step);

mActivationForm2Step.Show();

//数据库完成,可以跳过当前操作
mActivationForm2Step.CheckDatabaseIsIntact();

WriteLogcat();

mBtnJumpStep.Enabled = false;
mBtnPrev.Enabled = false;
mBtnNext.Enabled = false;
}


desperaso 2018-12-28
  • 打赏
  • 举报
回复
大概这么个意思么?


Panel panel_A, panel_B;
Label View;
public Form1()
{
InitializeComponent();

panel_A = new Panel() { Dock = DockStyle.Fill,Visible=false };
Label LabelShow = new Label() { AutoSize=true,Text="文字",Name="label_txt"};
panel_A.Controls.Add(LabelShow);
panel_A.Controls.Add(control1);

panel_B = new Panel() { Dock = DockStyle.Fill, Visible = false };
View = new Label() { AutoSize = true, Text = panel_A.Controls["label_txt"].Text };
panel_B.Controls.Add(View);
panel_B.Controls.Add(control2);

this.Controls.Add(panel_A);
this.Controls.Add(panel_B);
}

private void button_Click(object sender, EventArgs e)
{
View.Text = panel_A.Controls["label_txt"].Text;
panel_A.Visible = true;
panel_B.Visible = false;
}
}
threenewbee 2018-12-28
  • 打赏
  • 举报
回复
叠加很多panel了,按照顺序放在一个数组里,上一步下一步就是让数组索引-1/+1的那个panesl[i].BringToFront
  • 打赏
  • 举报
回复
引用 楼主 pencher_liu 的回复:
做了一个检测软件,用来检测PCB板的一些功能是否正常。要求:有两个界面,一个landing界面,选择要检测的功能,点击下一步,在第二个界面显示第一个界面选择的功能,并做检测,该界面同时也有上一步的按钮。 由于两个界面菜单栏相同,所以我想做成一个form下显示。我把两个界面上的所有控件分别做成了usercontrol,control1和control2,问题是在一个form下该怎么切换显示这两个control?或者还有其他方案吗,boss要求做的模块化一点。
模块化一点,就是你要做一个 abstract 的 Form 父类,设计一个 ObservalCollection<MyUserControl> 的集合作为属性,并且自动(例如在右下方或者左上方)产生一个导航条,来实现“下一步、上一步”的界面,并且自动从 MyUserControl 父类中读取用户控件通用的 Title 之类的信息来写到导航条中。 然后以后你们的类似的 Form 都可以从这个 Form 父类去继承。
  • 打赏
  • 举报
回复
在一个 Form 中同时有 uc1 和 uc2 两个实例的内容,“同时存在两种 uc 的数据状态,才可能真正灵活切换”,这是关键!而并不是只存在一种状态数据。
  • 打赏
  • 举报
回复
引用 9 楼 乖乖睡觉不要乱搞 的回复:
在一个groupBox里通过clear和add来分别显示control1和control2 是这个意思吗?

groupBox1.Controls.Clear();
control1 uc1 = new control1();
groupBox1.Controls.Add(uc1);
uc1.Show();
有“上一步”的动做(对应地就必定有“下一步”的动做),那么怎么可能用 Controls.Clear 来胡乱丢弃用户操作状态呢?!
平底锅锅锅 2018-12-28
  • 打赏
  • 举报
回复
TabControl
timsqin 2018-12-28
  • 打赏
  • 举报
回复
用Visible的 你们是原始人吗
9楼的方法是正解~
我是小数位 2018-09-05
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
你可以把你的用户控件全都加入窗体 Controls。通过切换不同用户控件(实例)的 Visible 属性来改变当前界面。
赞同,通过显示隐藏就可以实现你的要求
  • 打赏
  • 举报
回复
你可以把你的用户控件全都加入窗体 Controls。通过切换不同用户控件(实例)的 Visible 属性来改变当前界面。
assky124 2018-09-04
  • 打赏
  • 举报
回复
Dev 里面有Pager
  • 打赏
  • 举报
回复
在一个groupBox里通过clear和add来分别显示control1和control2
是这个意思吗?


groupBox1.Controls.Clear();
control1 uc1 = new control1();
groupBox1.Controls.Add(uc1);
uc1.Show();
xian_wwq 2018-09-04
  • 打赏
  • 举报
回复
可以考虑使用TreeView做个导航栏
具体的功能模块使用TabControl,
通过导航栏来激活不同Tab的显示
exception92 2018-09-03
  • 打赏
  • 举报
回复
在一个form下该怎么切换显示这两个control
->可以使用一个容器控件把用户控件 add进去
cheng2005 2018-09-03
  • 打赏
  • 举报
回复
既然
引用
boss要求做的模块化一点
,你为什么不去问你的boss?
加载更多回复(4)

110,532

社区成员

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

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

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