2012-04-14 58 views
0

我有一個名爲BaseEvent一個基類和幾個後代類:獲取所有後代類型的基類的

public class BaseEvent { 
    // the some properties 
    // ... 
} 

[MapInheritance(MapInheritanceType.ParentTable)] 
public class Film : BaseEvent { 
    // the some properties 
    // ... 
} 
[MapInheritance(MapInheritanceType.ParentTable)] 
public class Concert : BaseEvent { 
    // the some properties 
    // ... 
} 

我有在運行時創建的BaseEvent實例代碼:

BaseEvent event = new BaseEvent(); 
// assign values for a properties 
// ...  
baseEvent.XPObjectType = Database.XPObjectTypes.SingleOrDefault(
    t => t.TypeName == "MyApp.Module.BO.Events.BaseEvent"); 

現在,此活動將在BaseEvent列表視圖中顯示。

我想做以下事情:當用戶點擊Edit按鈕,然後顯示列表視圖查找字段與所有後代類型。當用戶將記錄更改ObjectType保存爲選定值時。

我怎樣才能做到這一點?
謝謝。

PS。這是asp.net應用程序。

+0

有什麼部分有問題?使用後代類型創建列表,從列表中獲取所選項目還是更新ObjectType屬性? – Filip 2012-04-16 10:51:05

+0

@Leonid:如果在那裏提供的解決方案不能滿足您的需求,請隨時重新激活DevExpress支持中心票證(http://www.devexpress.com/issue=Q395003)中的票證。我們很樂意爲您提供幫助。 – 2012-04-26 09:05:08

回答

5

我不確定你的方法對你想要達到的目標是否正確。首先,我會回答你提出的問題,之後我會試着解釋XAF如何提供你正在嘗試實現的功能,即如何從用戶界面中選擇要創建的記錄子類。

爲了創建一個屬性,它允許用戶選擇應用程序中的Type,你可以聲明一個類型轉換器:

public class EventClassInfoTypeConverter : LocalizedClassInfoTypeConverter 
{ 
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
    { 
     List<Type> values = new List<Type>(); 
     foreach (ITypeInfo info in XafTypesInfo.Instance.PersistentTypes) 
     { 
      if ((info.IsVisible && info.IsPersistent) && (info.Type != null)) 
      { 
       // select BaseEvent subclasses 
       if (info.Type.IsSubclassOf(typeof(BaseEvent))) 
        values.Add(info.Type); 
      } 
     } 
     values.Sort(this); 
     values.Insert(0, null); 
     return new TypeConverter.StandardValuesCollection(values); 
    } 
} 

然後你的基本事件類會是什麼樣子:

public class BaseEvent: XPObject 
{ 
    public BaseEvent(Session session) 
     : base(session) 
    { } 

    private Type _EventType; 
    [TypeConverter(typeof(EventClassInfoTypeConverter))] 
    public Type EventType 
    { 
     get 
     { 
      return _EventType; 
     } 
     set 
     { 
      SetPropertyValue("EventType", ref _EventType, value); 
     } 
    } 
} 

但是,我懷疑這不是你需要的功能。修改該屬性的值不會更改記錄的基本類型。也就是說,您最終將獲得類型爲BaseEvent的記錄,該記錄的屬性Type等於'音樂會'或'電影'。

XAF已經提供了一種選擇要創建的記錄類型的機制。在你的情況,你會發現,按鈕與您的不同的子類下拉作爲選項:

enter image description here

因此,你不需要創建對象中的「類型」屬性。如果需要在列表視圖中顯示事件類型的列,可以按如下方式聲明屬性:

[PersistentAlias("XPObjectType.Name")] 
public string EventType 
{ 
    get 
    { 
     return base.ClassInfo.ClassType.Name; 
    } 
} 
+0

我需要這個,因爲我在運行時創建BaseEvent實例(我從遠程系統獲取信息),我不知道應該是什麼類型,因此用戶必須手動選擇它。謝謝你的回答。 – user1260827 2012-04-19 06:46:31