首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有组合BindingList<> (子)引用的BindingList<> (主)

带有组合BindingList<> (子)引用的BindingList<> (主)
EN

Stack Overflow用户
提问于 2014-06-29 09:35:45
回答 1查看 183关注 0票数 0

有一种情况是,BindingList<>表示具有类似性质的子集合的POCOs集合,下面是两个这样的POCOs的示例代码及其各自的列表:

The DirectoryTypePoco

代码语言:javascript
复制
  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>

代码语言:javascript
复制
  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

代码语言:javascript
复制
  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>

代码语言:javascript
复制
  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组件将数据加载到网格中。正确地添加子行,数据是有效的。

这里的问题是:--我可以添加新的DirectoryTypePoco --但是当尝试在代码中添加DirectoryDefinitionPoco时,我得到的DirectoryDefinitionPoco对象对于它的父对象有一个零。在上面的图片中,Test5.dll234是一个带有DirectoryTypeId = 8DirectoryTypePoco,除了我创建的新的一个之外,它下面的所有子DirectoryTypePoco都是安全的。在这种情况下,我该怎么做才能确保我有母子关系呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-30 09:45:28

好的。在我的设计中,似乎有两件事我应该注意到。

  • 单个子Poco需要通过引用来了解父Poco。
  • DevExpress Grid 有允许在子视图的特定行中检索附加数据到父行的方法。

第一部分是直接的:在父poco类型的子poco中添加一个新属性。

然而,在我的例子中,这并不能解决我的问题,因为当我在网格中可视化地添加一个新行时,默认构造函数将被调用,并且它不接受任何参数,因此父poco引用将保持为NULL,而it (数值)将默认为

第二点完全解决了我的问题。我能够为XtraGrid的GridView提供如下扩展方法:

代码语言:javascript
复制
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;

  }

}

并用于下列用途:

代码语言:javascript
复制
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);
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24474832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档