【问题标题】:BindingList<> (master) with a composed BindingList<> (child) referenceBindingList<>(主)与组合的 BindingList<>(子)引用
【发布时间】:2014-06-29 09:35:45
【问题描述】:

我有一种情况,其中 BindingList 表示具有相似性质的子集合的 POCO 集合,以下是两个此类 POCO 及其各自列表的示例代码:

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&lt;DirectoryTypePoco&gt;

  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&lt;DirectoryDefinitionPoco&gt;:

  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 时,在代码中,我得到的DirectoryDefinitionPocoobject 有一个零为其父对象。在上图中,Test5.dll234DirectoryTypePocoDirectoryTypeId = 8,除了我创建的新子之外,它下面的所有子都可以。在这种情况下,我应该怎么做才能确保我有主子关系?

【问题讨论】:

    标签: winforms c#-4.0 poco xtragrid


    【解决方案1】:

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

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

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

    然而,就我而言,这并不能解决我的问题,因为当我在网格上直观地添加新行时,会调用默认构造函数并且它不接受任何参数,因此父 poco 引用将保持 NULL 并且 ID(数字)将默认为 0

    第二点帮助彻底解决了我的问题。我能够为 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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 2011-09-09
      • 2011-02-17
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多