Binding 复杂嵌套对象模型上的XtraGrid绑定

Binding 复杂嵌套对象模型上的XtraGrid绑定,binding,devexpress,entity,xtragrid,custom-object,Binding,Devexpress,Entity,Xtragrid,Custom Object,我想知道如何解决/简化在使用DevExpress XtraGrid套件开发过程中有时会弹出的任务。 有时我会陷入这种情况: 给定这两个表示来自业务逻辑层的模型类的类: public class Customer { public Int32 CustomerId { get; set; } public String Name { get; set; } public String Address { get; set; }

我想知道如何解决/简化在使用DevExpress XtraGrid套件开发过程中有时会弹出的任务。 有时我会陷入这种情况: 给定这两个表示来自业务逻辑层的模型类的类:

 public class Customer
    {
        public Int32 CustomerId { get; set; }
        public String Name { get; set; }
        public String Address { get; set; }
        public List<Order> Orders { get; set; }
    }

    public class Order
    {
        public Int32 OrderId { get; set; }
        public String ItemCode { get; set; }
        public Int32 Quantity { get; set; }
        public Decimal Price { get; set; }
        public DateTime Date { get; set; }
    }
公共类客户
{
公共Int32 CustomerId{get;set;}
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公共列表顺序{get;set;}
}
公共阶级秩序
{
公共Int32 OrderId{get;set;}
公共字符串ItemCode{get;set;}
公共Int32数量{get;set;}
公共十进制价格{get;set;}
公共日期时间日期{get;set;}
}
我想创建一个简单的窗口,显示一个XtraGrid,允许编辑/添加/删除客户列表及其嵌套订单。 为了做到这一点,我创建了一个简单的表单,其中包含一个GridControl和一个GridView控件,其中AllowAddRow和AllowDeleteRow属性==true。 然后,在Form1课程中,我做了以下工作:

//List of my customers
private List<Customer> _customers;

public Form1()
{

    //Initialize UI components
    InitializeComponent();

    //Call the provider in order to get customers 
    CustomerProvider cp = new CustomerProvider();
    _customers = cp.GetCustomers();

    //Initialize bindingSource
    BindingSource bs = new BindingSource();
    bs.DataSource = _customers;

    //Set GridControl's dataSource
    gridControl1.DataSource = bs;
}
//我的客户列表
私人客户名单;
公共表格1()
{
//初始化UI组件
初始化组件();
//致电提供商以获得客户
CustomerProvider cp=新CustomerProvider();
_customers=cp.GetCustomers();
//初始化bindingSource
BindingSource bs=新的BindingSource();
bs.DataSource=_客户;
//设置GridControl的数据源
gridControl1.DataSource=bs;
}
现在我有了漂亮的GridControl,它显示了我列表的内容

但现在的问题是…我如何添加或删除行? 事实:

  • 如果我将焦点设置在一行上,然后按“Delete”键,则不会 工作

  • 如果我尝试添加新行,当它失去焦点时,它会突然消失

很明显我错过了什么。不幸的是,我发现DevExpress文档(在我看来)对这种论点和最佳实践有很大的混淆,所以我无法达到我的目标

有人能帮我吗

附言。
是我的示例的.csproj的超链接

将gridControl1.UseEmbeddedNavigator属性设置为true。您将在视图底部获得一个数据导航器小部件

然而,这只能让你走到一半。如果您希望能够从网格向客户添加订单,那么您的客户类需要对Orders属性使用
BindingList
而不是
List

有关更多信息,请参阅。如果您发现缺少文档,还可以在网站上找到有用的资源

编辑:考虑的其他选项是:

  • 将网格绑定到数据库
  • 绑定到XML数据并使用
    数据集

  • 如果您已经将数据存储在数据库中,那么选择1将是一个不错的选择。如果您还没有将数据持久化到任何地方,您可以选择任何一种方式。

    非常感谢您的建议!我尝试过使用bindingList而不是简单的list类,它很管用……现在我可以添加主行(在我最新的示例中是customers行),但在细节方面没有解决(在我最新的示例中是orders行)。很明显,DetailGridView直接绑定到“Orders”属性,该属性是一个列表而不是BindingList。在不将“Orders”属性的类型从List更改为BindingList的情况下,如何解决该问题?我不想在模型层中使用面向绑定的类型,也不想重新编译所有业务逻辑模型容器程序集,因为它们太多了……是否有任何解决方法或方法包装我的模型以使其完全可编辑并将其用作gridcontrol的数据源?谢谢据我所知没有。在最高级别,您可以选择1)使用实现IBindingList接口的容器,2)将控件绑定到数据库,或3)通过DataSet类绑定到XML数据。有关更多信息,请参阅。我不能使用第二种或第三种方法,因为我的许多模型既不是DB实体,也不是XML序列化类。当你说“使用实现IBindingList接口的容器”时,我不理解第一种方式。不管怎样,我读了文件,但我的病例没有得到治疗……也许我是盲人:-)你有其他想法吗?谢谢!通过使用实现IBindingList的容器,我的意思是按照我在回答中的建议去做。将“List orders”成员更改为“BindingList”。如果列出的方法中没有一个不经过修改就适合您的模型类,那么您需要在它们和网格之间开发另一层(考虑适配器),以将它们转换为网格可以使用的东西。