2014-06-29 69 views
0

我有一種情況,其中BindingList <>表示具有類似性質的子集合的POCO的集合。下面是兩個這樣的示例代碼波蘇斯及相應的清單:綁定列表<>(主)與組成BindingList <>(子)參考

DirectoryTypePoco

public class DirectoryTypePoco : IBasePoco 
    { 

    public DirectoryTypePoco() 
    { 

    } 

    public DirectoryTypePoco(Int16 directoryTypeId, String directoryImplementation, String directoryDescription, DirectoryDefinitionPocoList directoryDefinition) 
    { 
     DirectoryTypeId = directoryTypeId; 
     DirectoryImplementation = directoryImplementation; 
     DirectoryDescription = directoryDescription; 
     DirectoryDefinition = directoryDefinition; 
    } 

    public Int16 DirectoryTypeId { get; set; } 
    public String DirectoryImplementation { get; set; } 
    public String DirectoryDescription { get; set; } 
    public DirectoryDefinitionPocoList DirectoryDefinition { get; set; } 

    public object GenerateEntity(GenericRepository repository, params object[] parameters) 
    { 
     var lastMaxEntityId = repository.GetQuery<DirectoryType>().Select(select => @select.DirectoryTypeId).DefaultIfEmpty().Max(); 

     var newEntity = new DirectoryType 
     { 
     DirectoryTypeId = (short)(lastMaxEntityId + 1), 
     DirectoryImplementation = this.DirectoryImplementation, 
     DirectoryDescription = this.DirectoryDescription 
     }; 

     return newEntity; 
    } 

    } 

而且BindingList<DirectoryTypePoco>

public class DirectoryTypePocoList : BindingList<DirectoryTypePoco> 
    { 

    public DirectoryTypePocoList() 
    { 
     using (var repository = new GenericRepository(new PWRDbContext())) 
     { 
     var query = repository.GetQuery<DirectoryType>(); 

     foreach (var r in query) 
     { 
      Add(new DirectoryTypePoco(r.DirectoryTypeId, r.DirectoryImplementation, r.DirectoryDescription, new DirectoryDefinitionPocoList(r.DirectoryTypeId))); 
     } 
     } 
    } 

    public DirectoryTypePocoList(short directoryTypeId) 
    { 
     using (var repository = new GenericRepository(new PWRDbContext())) 
     { 
     var query = repository.GetQuery<DirectoryType>(where => where.DirectoryTypeId == directoryTypeId); 

     foreach (var r in query) 
     { 
      Add(new DirectoryTypePoco(r.DirectoryTypeId, r.DirectoryImplementation, r.DirectoryDescription, new DirectoryDefinitionPocoList(r.DirectoryTypeId))); 
     } 
     } 
    } 
    } 

第二對象:DirectoryDefinitionPoco

public class DirectoryDefinitionPoco : IBasePoco 
    { 

    public DirectoryDefinitionPoco() 
    { 

    } 

    public DirectoryDefinitionPoco(Int16 directoryTypeId, Byte parameterId, String parameterName, String parameterValidation, Boolean encryptionRequired, PocoChangeType changeType = PocoChangeType.None) 
    { 
     DirectoryTypeId = directoryTypeId; 
     ParameterId = parameterId; 
     ParameterName = parameterName; 
     ParameterDescription = parameterName; 
     ParameterRequired = false; 
     ParameterValidation = parameterValidation; 
     EncryptionRequired = encryptionRequired; 
    } 

    public Int16 DirectoryTypeId { get; set; } 
    public Byte ParameterId { get; set; } 
    public String ParameterName { get; set; } 
    public String ParameterDescription { get; set; } 
    public String ParameterValidation { get; set; } 
    public Boolean ParameterRequired { get; set; } 
    public Boolean EncryptionRequired { get; set; }  

    public object GenerateEntity(GenericRepository repository, params object[] parameters) 
    { 
     var masterId = (short) parameters[0]; 
     var lastMaxEntityId = repository.GetQuery<DirectoryDefinition>(where => where.DirectoryTypeId == masterId).Select(select => @select.ParameterId).DefaultIfEmpty().Max(); 

     var newEntity = new DirectoryDefinition 
     { 
     DirectoryTypeId = (short)parameters[0], 
     ParameterId = (byte)(lastMaxEntityId + 1), 
     ParameterName = this.ParameterName, 
     ParameterDescription = this.ParameterDescription, 
     ParameterValidation = this.ParameterValidation, 
     ParameterRequired = this.ParameterRequired, 
     EncryptionRequired = this.EncryptionRequired 
     }; 

     return newEntity; 
    } 
    } 

而且BindingList<DirectoryDefinitionPoco>

public class DirectoryDefinitionPocoList : BindingList<DirectoryDefinitionPoco> 
    { 
    public DirectoryDefinitionPocoList(short directoryTypeId) 
    { 
     using (var repository = new GenericRepository(new PWRDbContext())) 
     { 
     var query = repository.GetQuery<DirectoryDefinition>(where => where.DirectoryTypeId == directoryTypeId); 

     foreach (var r in query) 
     { 
      Add(new DirectoryDefinitionPoco(r.DirectoryTypeId, r.ParameterId, r.ParameterName, r.ParameterValidation, r.EncryptionRequired)); 
     } 
     } 
    } 

    public List<DirectoryDefinition> GetSourceQuery() 
    { 
     List<DirectoryDefinition> result; 

     using (var repository = new GenericRepository(new PWRDbContext())) 
     { 
     result = repository.GetQuery<DirectoryDefinition>().ToList(); 
     } 

     return result; 
    } 

    public List<DirectoryDefinition> GetSourceQuery(short directoryTypeId) 
    { 
     List<DirectoryDefinition> result; 

     using (var repository = new GenericRepository(new PWRDbContext())) 
     { 
     result = repository.GetQuery<DirectoryDefinition>(where => where.DirectoryTypeId == directoryTypeId).ToList(); 
     } 

     return result; 
    } 
    } 

在形式,我通過BindingSource組件加載數據到電網。子行被正確添加並且數據有效。

Sample application

這裏是問題:我能夠添加新的DirectoryTypePoco但是當試圖添加DirectoryDefinitionPoco,在代碼中,在DirectoryDefinitionPoco對象,我得到了一個零它的父對象。在上面的圖片中,Test5.dll234是一個DirectoryTypePocoDirectoryTypeId = 8和它下面的所有孩子都好,除了我創建的新孩子。在這種情況下,我想要做什麼來確保我擁有母子關係?

回答

0

好的。看來在我的設計中我應該注意到兩件事。

  • 單個孩子Poco需要通過參考知道父母Poco。
  • DevExpress Grid 方法允許在子視圖的特定行中檢索附加數據到父行。

第一部分很簡單:在父poco類型的子poco中添加一個新屬性。

然而,這在我的情況,並沒有解決我的問題,因爲當我在視覺上的網格中添加一個新行,默認構造函數被調用,它不帶任何參數,因此家長POCO參考仍將NULL並且Ids(數字)將默認爲

第二點幫助完全解決了我的問題。我能變出的擴展方法爲XtraGrid中的GridView控件如下:

public static class DevExpressGridHelper 
{ 
    public static IBasePoco GetPocoFromSelectedRow(this BaseView view) 
    { 
    return (IBasePoco)view.GetRow(((GridView)view).FocusedRowHandle); 
    } 

    public static IBasePoco GetParentPocoFromSelectedRow(this GridView view) 
    { 
    if (view.ParentView !=null) 
    { 
     // return (IBasePoco)(view.ParentView).GetRow(((GridView)(view.ParentView)).FocusedRowHandle); 
     return (IBasePoco)((GridView)view.ParentView).GetFocusedRow(); 
    } 

    return null; 

    } 

} 

,並用它如下:

private void GridMain_Level_1_RowUpdated(object sender, RowObjectEventArgs e) 
{ 
    var view = sender as GridView; 

    if (view == null) 
    { 
    return; 
    } 

    var pocoObject = e.Row as DirectoryDefinitionPoco; 

    if (pocoObject == null) 
    { 
    return; 
    } 

    var parentPocoObject = view.GetParentPocoFromSelectedRow(); 

    if (parentPocoObject == null) 
    { 
    return; 
    } 

    if (view.IsNewItemRow(e.RowHandle)) 
    { 
    Create(pocoObject, parentPocoObject); 
    } 
    else 
    { 
    Update(pocoObject); 
    } 
}