1

好的,所以我有 3 个不同的类(rl 事件的类型)每个事件都有不同的属性

例如游泳课有温度、PH值、游泳长度等下一个事件是自行车课有自行车类型、轮胎宽度等

现在这些事件都有一个日期,我想在列表中按日期排序。

现在每个类都必须根据设计进行不同的渲染,所以我有点困惑我应该如何解决这个问题?

正在考虑创建一个对象列表,然后将所有类型的所有事件按日期排序传递到列表中,然后遍历列表并根据我得到的对象类型,将其绑定到用户控件并呈现它..

这是最好的方法吗?还是有更简单的方法?

4

4 回答 4

1

创建一个所有事件派生自的基类。这个基类应该有一个public virtual被调用的方法RenderDateTime字段。

从该类派生所有事件类并覆盖该Render方法,以便每个事件类都可以“呈现自己”。

您需要做的就是保留一个按时间戳排序的基类实例列表,然后调用Render

样本:

public class BaseEvent
{
    public DateTime TimeStamp;

    public virtual void Render() { }
}

public class Swimming : BaseEvent
{
    public override void Render()
    {
        // Code to render a Swimming instance
    }
}

public class Cycling: BaseEvent
{
    public override void Render()
    {
        // Code to render a Cycling instance
    }
}

跟踪所有事件的列表:

private List<BaseEvent> m_events;

渲染所有事件:

foreach (BaseEvent e in m_events)
    e.Render();
于 2012-05-31T12:04:22.863 回答
0

创建一个包含 dateTime 的类,然后创建基于它的其他类。然后您可以创建一个基类列表,并将对象转换为扩展类并使用它们。这是一个工作示例

编辑哇我对此感到困惑,不知道如何解释它,所以请要求澄清,我会尽力而为

 public Form1()
    {
        InitializeComponent();
        List<Sport> Sports = new List<Sport>();
        //create a swim object and give it some data
        Swimming swim1 = new Swimming();
        //create a cycle object and give it some data
        Cycling cycle1 = new Cycling();
        swim1.PH = 5;
        cycle1.BikeType = 2;
        // add the two objects to a list of base class
        Sports.Add(swim1);
        Sports.Add(cycle1);

        //iterate through the list of base class and cast the objects to their extended class
        //display a independent property of each just to prive it works.
        foreach (Sport s in Sports)
        {
            if (s is Cycling)
            {
                MessageBox.Show(((Cycling)s).BikeType.ToString());
            }
            else if (s is Swimming)
            {
                MessageBox.Show(((Swimming)s).PH.ToString());
            }

        }
    }
}

class Sport
{
    DateTime DateAndTime = new DateTime();
}
class Swimming : Sport
{
    public int PH = 0;
    public int temperature = 0;
}
class Cycling : Sport
{
    public int BikeType = 1;
    public int TireSize = 26;
}
于 2012-05-31T11:57:38.707 回答
0

是的,这是一个很好的方法。

但尽量避免自己渲染控件。将它们添加到父容器控件的 Controls 集合中。Asp.net 将以这种方式呈现控件本身。

于 2012-05-31T11:48:09.400 回答
0

几乎就像 Thorsten Dittmar 的解决方案,但如果您将列表绑定到 GridView 等控件,则无需关心 Render() 方法。反而:

1)声明一个新的枚举:

public enum EventType {Swimming, Cycling, etc}

2) 像在类声明中一样将枚举值传递给基类

public class Cycling: BaseEvent

    {
        public Cycling() : base(EventValue.Swimming)
    }

3) 向 BaseEvent 添加构造函数,同时添加 Event 属性

public class BaseEvent
{
    public BaseEvent(EventType type)
    {
        Event = type;
    }

    EventType Event { get; set; }
    DateTime EventDate ....
}

4)然后将类型列表绑定List<BaseEvent>到您的控件并在 OnItemDataBound 事件中根据 Event 属性值呈现您想要的任何内容

于 2012-05-31T13:13:06.063 回答