1

わかりましたので、3 つの異なるクラス (rl イベントのタイプ) があります。各イベントには異なるプロパティがあります。

例は、温度、PH 値、水泳の長さなどを持つ水泳クラスです。次のイベントは、自転車の種類、タイヤ幅などを持つ自転車クラスです。

イベントにはすべて日付があり、リスト内の日付で並べ替えてレンダリングしたいと考えています。

現在、各クラスはデザインに応じて異なる方法でレンダリングする必要があるため、これをどのように解決すればよいか少し混乱していますか?

オブジェクトのリストを作成し、すべてのタイプのすべてのイベントを日付順に並べ替えてリストに渡し、リストを繰り返し、取得したオブジェクトのタイプに基づいて、それをユーザーコントロールにバインドしてレンダリングすることを考えていました..

これはこれを行うための最良の方法ですか?それとももっと簡単なアプローチがありますか?

4

4 に答える 4

1

すべてのイベントが派生する基本クラスを作成します。この基本クラスには、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();
于 2012-05-31T12:04:22.863 に答える
0

はい、それは良いアプローチです。

ただし、コントロールを自分でレンダリングすることは避けてください。親コンテナー コントロールの Controls コレクションに追加します。Asp.net は、コントロール自体をそのようにレンダリングします。

于 2012-05-31T11:48:09.400 に答える
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

Thorsten Dittmar のソリューションとほぼ同じですが、リストを GridView などのコントロールにバインドする場合は、Render() メソッドを気にする必要はありません。その代わり:

1) 新しい列挙型を宣言します。

public enum EventType {Swimming, Cycling, etc}

2) クラス宣言のように列挙値を base に渡す

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 に答える