none
silverlight ria如何实现在一个datagrid中显示两个表的某些字段 RRS feed

  • 问题

  • 谁用ria做过两个表的链接查询显示在一个datagrid中啊,

    主表:商户信息,子表:商户业务信息:共有字段:商户登记编号

    在服务端HyxtDomainService.metadata.cs中  的子表中   [Include ]
                public EntityCollection<商户信息> 商户信息 { get; set; }

    查询语句写为   public IQueryable<商户业务信息> Get商户业务信息()
            {
                return this.ObjectContext.商户业务信息.Include("商户信息");
            }

    客户端:   HyxtDomainContext dc = new HyxtDomainContext();
            public Gtsh()
            {
                InitializeComponent();
                Get_Data();
            }

            private void Get_Data()
           {
              LoadOperation<商户业务信息> load = dc.Load(dc.Get商户业务信息Query(),Getcallblack,null);
             
               
           }

            public void Getcallblack(LoadOperation<商户业务信息> load)
            {
                foreach (商户业务信息 商户业务信息 in load.Entities)
                {
                    var t = from c in dc.商户业务信息s select new { 商户业务信息.封顶,商户业务信息.商户信息.行政区划};
                    PagedCollectionView pcv = new PagedCollectionView(t);
                    dataGrid_Gtsh.ItemsSource = pcv;
                }
             
            }

     

    结果在datagrid中只显示字段,而没有具体的数据,把select new 换成select 某个字段则显示一个字段及这个字段的数据。

    2010年5月18日 3:53

答案

  • 一句话:DataGrid不支持匿名类(Anonymous class). 

    Select new {} 产生的是Anonymous class

    推荐解决方法,用RiaServices的 Presentation Model

    既:在Server端,新添加一个类

    比如:

    public class CustomerInfo
    {
    [Key]
    public int id {get;set;}
    public string 封顶{get;set;}
    public string 行政区划 {get;set;}
    }
    
    
    然后在DomainService中添加Query:
    public IQueryable GetCustomerInfo()
    {
    return this.ObjectContext.商户业务信息.年厘里微第亿("商户信息").Select(p => new CustomerInfo()
    {
     id = p.Id,
     封顶 = p.封顶,
     行政区划 = p.商户信息.行政区划
    });
    }
    
    这样你在client端就可以直接绑定了dataGrid_Gtsh.ItemsSource = load.Entities; (我没太理解你为什么用一个循环来建立pcv,那样不是每条数据都覆盖上一条吗?每次都是一个新的pcv啊?)

     

    参考:http://msdn.microsoft.com/en-us/library/ee707347(v=VS.91).aspx

    • 已标记为答案 王志刚 2010年5月18日 6:36
    2010年5月18日 4:36

全部回复

  • 一句话:DataGrid不支持匿名类(Anonymous class). 

    Select new {} 产生的是Anonymous class

    推荐解决方法,用RiaServices的 Presentation Model

    既:在Server端,新添加一个类

    比如:

    public class CustomerInfo
    {
    [Key]
    public int id {get;set;}
    public string 封顶{get;set;}
    public string 行政区划 {get;set;}
    }
    
    
    然后在DomainService中添加Query:
    public IQueryable GetCustomerInfo()
    {
    return this.ObjectContext.商户业务信息.年厘里微第亿("商户信息").Select(p => new CustomerInfo()
    {
     id = p.Id,
     封顶 = p.封顶,
     行政区划 = p.商户信息.行政区划
    });
    }
    
    这样你在client端就可以直接绑定了dataGrid_Gtsh.ItemsSource = load.Entities; (我没太理解你为什么用一个循环来建立pcv,那样不是每条数据都覆盖上一条吗?每次都是一个新的pcv啊?)

     

    参考:http://msdn.microsoft.com/en-us/library/ee707347(v=VS.91).aspx

    • 已标记为答案 王志刚 2010年5月18日 6:36
    2010年5月18日 4:36
  • 按照您的方法我在HyxtDomainService.metadata.cs中添加了
      // [MetadataTypeAttribute(typeof(sysdiagrams.sysdiagramsMetadata))]
      public partial class CustomerInfo
      {
        [Key]
        public string id { get; set; }
        public decimal 封顶 { get; set; }
        public string 行政区划 { get; set; }
       }
    
    在HyxtDomainservice.cs中添加了
      public IQueryable GetCustomerInfo()
            {
                return this.ObjectContext.商户业务信息.Include("商户信息").Select(p => new CustomerInfo()
                {
                    id = p.商户登记编号,
                    封顶 = p.封顶,
                    行政区划 = p.商户信息.行政区划
                });
            }

    客户端: public partial class Gtsh : Page
        {
            HyxtDomainContext dc = new HyxtDomainContext();
            public Gtsh()
            {
                InitializeComponent();
                Get_Data();
            }

            private void Get_Data()
           {
              LoadOperation<商户业务信息> load = dc.Load(dc.Get商户业务信息Query(),Getcallblack,null);//dc.get时找不到GetCustomerInfoQuery()

           }

            public void Getcallblack(LoadOperation<商户业务信息> load)
            {
                dataGrid_Gtsh.ItemsSource = load.Entities;
            }
        }

     

    这时我感觉它执行的Query里面的

      public IQueryable<商户业务信息> Get商户业务信息()
            {
                return this.ObjectContext.商户业务信息.Include("商户信息");
            }

    所以在datagrid中显示的全部都是商户业务信息表中的内容。

    在dc.load时,dc.get不到  GetCustomerInfoQuery()
    中的查询。不知道应该怎么样解决。

    本人新手,麻烦帮助解决

     

    2010年5月18日 5:49
  • oops,my bad

    Query方法应该是

    public IQueryable<CustomerInfo> GetCustomerInfo()
            {
                return this.ObjectContext.商户业务信息.Include("商户信息").Select(p => new CustomerInfo()
                {
                    id = p.商户登记编号,
                    封顶 = p.封顶,
                    行政区划 = p.商户信息.行政区划
                });
            }
    忘了加 CustomerInfo了

    这样你在客户端应该可以直接调用dc.GetCustomerInfoQuery()了。

    2010年5月18日 6:11
  • 这回可以了,谢谢你啊!太感谢了,研究一天半了,也没研究出什么!

    由于是刚学编程,所以对这些东西不太了解,再次感谢你!有什么给你加分的方法吗?

    已经标记为答案了。

    谢了。以后有问题了还来这。

    2010年5月18日 6:27
  • 刚开始的时候也碰到过你这样的问题!也是Xun Sun大哥帮忙解决的!

    希望下面的链接对你有用。

    http://social.microsoft.com/Forums/zh-CN/silverlightzhchs/thread/a8f4499b-6ad3-417f-9419-6f366d93ff6c/#9f182f89-73e1-4e8b-bda4-d4aeddc7075b

    2010年5月18日 7:58