【问题标题】:c# navigate or skip formsc# 导航或跳过表单
【发布时间】:2011-06-07 17:51:28
【问题描述】:

我之前学习了如何在两个表单之间来回移动。但是如果有更多的表格呢? 这是我的 form1 代码:

    Form2 form2 = new Form2();
    private void aboutoldtrafford_MouseClick(object sender, MouseEventArgs e)
    {
        this.Hide();
        form2.ShowDialog();
        this.Show();
    }

我可以去form2,那里有两个按钮:返回和下一步

     private void backbutton_MouseClick(object sender, MouseEventArgs e)
    {
        this.DialogResult = DialogResult.OK;
    }

    Form3 form3 = new Form3();
    private void nextbutton_MouseClick(object sender, MouseEventArgs e)
    {
            this.Hide();
            form3.ShowDialog();
            this.Show();

    }

后退按钮将返回到 form1,下一个按钮将转到 form3。下面是我的form3代码。 在form3中,有两个按钮:返回和完成

    private void back_MouseClick(object sender, MouseEventArgs e)
    {
        this.DialogResult = DialogResult.OK;
    }

    private void finish_MouseClick(object sender, MouseEventArgs e)
    {
        this.Hide();
        // i want to go back to form1

    }

返回按钮将返回到form2,完成按钮将返回到form1。 显然,我不能做“this.DialogResult = DialogResult.OK;”在完成按钮中。 我怎样才能回到form1而不去form2?请帮忙...

【问题讨论】:

  • 你不是在这里问过类似的问题吗? stackoverflow.com/questions/6260221/…
  • 哈哈,是的,但我得到的答案只是在两个表格之间......我在处理这么多表格时遇到了问题

标签: c# forms navigation


【解决方案1】:

第一个选项 - 您可以使用 UserControls 而不是 Forms,只需在要激活的控件上调用 BringToFront()。

另一个选项 - 将应用程序状态管理移至某个对象。创建州地图

public class StateManager
{
   private Dictionary<ApplicationState, Form> _stateMap = new Dictionary<ApplicationState, Form>();
   private ApplicationState _currentState;

    public void RegisterState(ApplicationState state, Form form)
    {
        if (_stateMap.ContainsKey(state))
            // throw an exception, or rewrite mapping

       _stateMap.Add(state, form);
    }

    public ApplicationState CurrentState
    {
        get { return _currentState; }
        set
        {
            if (!_stateMap.ContainsKey(value))
                // do nothing or throw exception

            if (_currentState == value)
                return;                

            CurrentForm.Hide();                
            _currentState = value;
            CurrentForm.Show();
        }
    }

    public Form CurrentForm
    {
        get { return _stateMap[_currentState]; }
    }
}

我这里使用了表单实例,但是你可以通过工厂创建实例。

下一步 - 注册应用程序状态(当然,您应该为应用程序状态提供更有意义的名称):

StateManager stateManager = StateManager.Instance;
stateManager.RegisterState(ApplicationState.Form1, new Form1());
stateManager.RegisterState(ApplicationState.Form2, new Form2());
stateManager.RegisterState(ApplicationState.Form3, new Form3());

设置当前状态并运行应用程序:

stateManager.CurrentState = ApplicationState.Form1;
Application.Run(stateManager.CurrentForm);

最后一步 - 更改应用程序状态。您可以将 stateManager 实例传递给表单构造函数,或使用静态 Singleton:

private void previousButton_Click(object sender, EventArgs e)
{
   StateManager.Instance.CurrentState = ApplicationState.Form1;
}

您还可以动态创建表单,使用配置文件进行状态定义等。

祝你好运!

【讨论】:

  • 你能举个例子吗?你发布的第一个代码,你把它放在哪里?在主窗体中?
  • 第一个代码是具有自己文件的单独类。注册和设置当前状态转到 Program.cs 文件中的 Main() 函数。同样对于这个例子,你需要由 StateManager (msdn.microsoft.com/en-us/library/ff650316.aspx) 实现的单例模式
  • aw...这对我来说太多了,我刚开始学习 c#...这需要很长时间才能学习...感谢您提供的信息
  • 然后您可以将 StateManager 创建为静态类(将单词“static”添加到类及其所有成员定义中)。并且只需通过静态属性和方法使用它:StateManager.CurrentState = ApplicationState.Form3。 BTW ApplicationState 是枚举。
  • 我知道这对我来说太多了,但你能创造一个喜欢的吗?如果你能给我一个这样的项目,我可以学习和修补,那将非常有帮助,因为我真的不知道如何开始它......
猜你喜欢
  • 2015-05-11
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2014-03-20
  • 2019-11-22
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多