-1

语境:

使用 RadGrid,您可以拥有内置的自动 CRUD 操作。但是这些操作似乎只能在源/父表上进行。

<asp:LinqDataSource ID="myLinqDataSource" runat="server"
                    ContextTypeName="ExempleDataContext" TableName="Order"/>
<telerik:RadGrid ID="myRadGrid" runat="server" DataSourceID="myLinqDataSource">
    <MasterTableView .../>
</telerik:RadGrid>

虽然将能够显示 Parent 或 Child 的属性:

<telerik:GridBoundColumn DataField="CustomerId" HeaderText="CustomerId"
                         SortExpression="CustomerId" UniqueName="CustomerId"/>                             
<telerik:GridBoundColumn DataField="Product.Name" HeaderText="Product.Name"
                         SortExpression="Product.Name" UniqueName="Product.Name" />

并将它们绑定到您的 EditForm 中:

Customer Id :
    <asp:TextBox ID="tb_CustomerId" runat="server"
        Text='<%#Bind("CustomerId")%>' AutoPostBack="false" />

Product Name:
    <asp:TextBox ID="tb_Product_Name" runat="server"
        Text='<%#Bind("Product.Name")%>' AutoPostBack="false" />

但只有“父亲领域”(这里CustomerId)得到更新。
Product.Name被忽略并且不抛出任何错误。

示例 Dbml 架构:

数据库示例

我尝试了什么:

  • 将子主键添加到 Grid DataKeyNames
  • 添加RetrieveDataTypeFromFirstItem="true", 以MasterTableView试图强迫他从子项目中获取类型。
  • 和经典的 Telerik vodoo,使用手动插入和 ItemCommand 事件结束。

铌:

  • 就地和自动更新工作。只有模板化表单绑定失败。
4

1 回答 1

0

我不熟悉 AJAX(使用 Telerik 的 C# 版本),但是 AFAIK,您不能使用诸如“Product.Name”之类的语法。绑定仅指类内的字段,在您的情况下,它类似于

class Product()
{
   public int Id
   public string Name
}  

class Customer()
{
   public int Id
   public string Name
}   

class Order()
{
   public int Id
   public int CustomerId
   public int ProductId
} 

这意味着,您只能直接引用类属性。如果您使用数据类型(即客户)填充容器,则只能绑定到 Id 和 Name 属性。

为了实现您想要做的事情,您可以创建自定义 DTO 类,例如

  class FullDataObject()
  {
          public int ProductId
          public string ProductName
          public int CustomerId
          public string CustomerName
          public int OrderId
  }

然后创建这些对象的集合并使用数据库中的数据填充它,并操作容器中的数据。

如果您想坚持在 CRUD 中构建选项,您需要决定要在容器内编辑哪种类型的对象 - 订单、客户或产品。

由于您的表之间的关系非常简单,即一对零或一,因此我将创建 DTO 类以轻松管理数据。

好运

于 2018-01-31T09:21:13.797 回答