【问题标题】:Treeview to control panels树视图到控制面板
【发布时间】:2010-10-02 00:58:54
【问题描述】:

我有一个项目,它的用户界面由两个面板(左和右)组成。

在左侧面板中是一个树视图。根据选择的节点,右侧面板中需要不同的“表单”。

到目前为止,我已经为右侧面板定义了一堆不同的“用户控件”,我创建它们并根据从树视图中选择的正确节点的要求显示它们。

是否有管理此类过程的“模式”,因为我的代码(此处包含的太长)非常脆弱且根本不可扩展。任何人都有任何建议,甚至知道实现相同目标的开源项目。

【问题讨论】:

标签: c# winforms


【解决方案1】:

这并不难。在左侧停靠一个 TreeView,添加一个面板并将其 Dock 设置为 Fill。然后使用这样的代码来选择一个用户控件:

    private UserControl currentView;

    public void SelectView(UserControl ctl) {
        if (currentView != null) {
            panel1.Controls.Remove(currentView);
            currentView.Dispose();
        }
        if (ctl != null) {
            ctl.Dock = DockStyle.Fill;
            panel1.Controls.Add(ctl);
        }
        currentView = ctl;
    }

您可以通过使用反射来了解 TreeView。在设计器中,将节点的 Name 属性设置为用户控件的名称(如“UserControl1”)。并实现与此类似的 BeforeSelect 事件:

    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) {
        string name = e.Node.Name;
        name = this.GetType().Namespace + "." + name;
        Type ctlType = System.Reflection.Assembly.GetExecutingAssembly().GetType(name);
        if (ctlType == null) e.Cancel = true;
        else {
            var ctor = ctlType.GetConstructor(new Type[] { });
            var ctl = ctor.Invoke(null) as UserControl;
            SelectView(ctl);
        }
    }

就是这样。如果用户控件位于不同的命名空间或不同的程序集中,请调整上述代码。

【讨论】:

  • +1:与其使用Name 属性和反射,不如将Tag 属性设置为Func<Control>
  • @Alex:是的,还有很多路要走。我试图避免初始化所有内容所需的样板代码。
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多