65.9K
CodeProject 正在变化。 阅读更多。
Home

完全控制视图

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2007年4月30日

CPOL

3分钟阅读

viewsIcon

27279

downloadIcon

137

一个使视图管理更灵活和稳健的类对象。

引言

在本文中,我将展示一个我创建的名为ViewManager的类。它基本上允许您将任何控件添加到其内部的视图列表及其关联控件中。它最适用于利用多个视图的 Web 表单(例如,为每个不同的用户角色提供不同外观的表单)。

背景

在我的工作中,我经常遇到同时管理许多对象可见性的代码。从本质上讲,Web 表单试图给人一种错觉,即它们实际上只有一页,但却有两到三页不同的页面。我个人更希望看到这些页面是单独的页面,但我需要一个中间步骤,用于我的重构(代码隐藏很容易超过一千行代码,所以我喜欢采取较小的步骤,以便我的测试可以更彻底)。

那我该怎么做呢?我可以使用面板或视图控件。就视图管理而言,视图控件比面板略胜一筹,但是如果某些控件属于多个视图呢?如果构成我视图的控件是分散的呢?进入我的工具,ViewManager类。

Using the Code

好的,您有了这个类,但是您如何使用它呢?您经常会看到其他程序员提供的这些类,它们做了很多事情,并且留下了很多让您思考的事情,以至于它们实际上毫无用处。我在下面粘贴了我用来构建这个类的测试用例之一。

它是用 NUnit/C# 编写的,所以希望至少对每个人来说都是可读的

[Test]
public void MultiPanelAdds()
{
    Panel PanelA = new Panel();
    Panel PanelB = new Panel();
    Panel PanelC = new Panel();
    TextBox TextBoxA = new TextBox();

    ViewManager MyViews = new ViewManager();

    MyViews.Add("View AB", PanelA);
    MyViews.Add("View AB", PanelB);
    MyViews.Add("View AB", TextBoxA);

    MyViews.Add("View AC", PanelA);
    MyViews.Add("View AC", PanelC);

    Assert.IsFalse(PanelA.Visible, "PanelA should be hidden.");
    Assert.IsFalse(PanelB.Visible, "PanelB should be hidden.");
    Assert.IsFalse(PanelC.Visible, "PanelC should be hidden.");
    Assert.IsFalse(TextBoxA.Visible, "The textbox should be hidden.");

    MyViews.SetActiveView("View AB");

    Assert.IsTrue(PanelA.Visible, "PanelA should be visible.");
    Assert.IsTrue(PanelB.Visible, "PanelB should be visible.");
    Assert.IsTrue(TextBoxA.Visible, "The textbox should be visible.");

    Assert.IsFalse(PanelC.Visible, "PanelC should be hidden.");

    MyViews.SetActiveView("View AC");

    Assert.IsTrue(PanelA.Visible, "PanelA should be visible.");
    Assert.IsFalse(PanelB.Visible, "PanelB should be hidden.");
    Assert.IsFalse(TextBoxA.Visible, "The textbox should be hidden.");

    Assert.IsTrue(PanelC.Visible, "PanelC should be hidden.");
}

所有的Assert都仅用于测试目的。首先,我基本上实例化了一些我的测试将使用的面板。通常,您不会显式地实例化这些,并且我的类也不需要它。接下来,我实例化我的ViewManager。添加视图就像向ViewManger传递您的视图名称和您想成为该视图一部分的对象一样简单。

关注点

该类本身利用一个Dictionary对象,该对象包含与强类型Lists(List<Control>)关联的键。幸运的是,C# 在所有控件直到列表之间都保持了引用,因此对其中一个列表中的控件的更改与对控件本身的更改一样好。

还有另外一个说明...

添加到视图后,控件的Visible属性设置为 false。基本上,如果您不显式地将视图设置为活动状态,则该视图将被假定为非活动状态。另一个注意事项是,一次只能有一个视图处于活动状态。考虑到将控件重叠到多个视图中的能力,这不应该是一个限制因素,但只是提一下,以便您了解该类的假设。

历史

我可能会添加该类同时可见多个视图的功能。但我可能会先看看反馈意见,然后再这样做。

© . All rights reserved.