好的,所以我有 3 个不同的类(rl 事件的类型)每个事件都有不同的属性
例如游泳课有温度、PH值、游泳长度等下一个事件是自行车课有自行车类型、轮胎宽度等
现在这些事件都有一个日期,我想在列表中按日期排序。
现在每个类都必须根据设计进行不同的渲染,所以我有点困惑我应该如何解决这个问题?
正在考虑创建一个对象列表,然后将所有类型的所有事件按日期排序传递到列表中,然后遍历列表并根据我得到的对象类型,将其绑定到用户控件并呈现它..
这是最好的方法吗?还是有更简单的方法?
创建一个所有事件派生自的基类。这个基类应该有一个public virtual
被调用的方法Render
和DateTime
字段。
从该类派生所有事件类并覆盖该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();
创建一个包含 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;
}
是的,这是一个很好的方法。
但尽量避免自己渲染控件。将它们添加到父容器控件的 Controls 集合中。Asp.net 将以这种方式呈现控件本身。
几乎就像 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 属性值呈现您想要的任何内容