none
晕了?! RRS feed

  • 问题

  •  void Proxy_SearchSectionSCompleted(object sender, EMS.SLCore.SVC.SearchSectionSCompletedEventArgs e) {
       var offices = from office in (ObservableCollection<EMS.SLCore.SVC.Office>)e.UserState
              select new EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Office>(office, null);
       foreach (var office in offices) {
        var rs = this.SetSectionTree(null, e.Result.Where(s=>s.OfficeCode==office.InnerEntity.Code));
        if (office.InnerEntity.Code == "GZ") {
         var ss = rs.Where(s => s.InnerEntity.OID == 10).FirstOrDefault();
         var t = (from section in e.Result where section.UpId == 10 select new EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Section>(section, null));
         ss.Children = t;
         MessageBox.Show(ss.Children == null ? "null" : ss.Children.Count<EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Section>>().ToString());
         this.show(rs.Where(s => s.InnerEntity.OID == 10));
        }

       }
      }
      void show(IEnumerable<EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Section>> rs) {
       var ss = rs.Where(s => s.InnerEntity.OID == 10).FirstOrDefault();

       MessageBox.Show(ss.Children == null ? "null" : ss.Children.Count<EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Section>>().ToString());
      }
    上面show方法中的那句代码就是从上面copy下来的,可是messagebox显示的就是不一样,上面很正常显示,显示"1",而下面则是"null"?这是为什么啊??搞了一天了,也没找到原因

    2009年9月7日 9:02

答案

  • 只有一个可能了
    你用了where这个操作了 它是延迟操作符
    你确实引用了同一个对象 不过没有存储对象里面  ss不是rs对象了 是IEnumerable序列化对象
    2009年9月8日 8:22

全部回复

  •   上面是 this.show(rs.Where(s => s.InnerEntity.OID == 10)); 执行了  可能找不到控件

    2009年9月7日 9:18
  • 与控件没关系,都是有值的,我把下面改为
    MessageBox.Show(ss == null ? "null" : ss.Children.Count<EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Section>>().ToString());
    就是ss.Children去掉.children,之后,还是有值的,并且是正确的,所以,我感觉为,只是children这个值没有传过来,不知为什么?

    2009年9月7日 9:56
  •     this.show(rs.Where(s => s.InnerEntity.OID == 10)); 去掉where函数看看 你where太多了 你先传对象再操作
    2009年9月7日 10:32
  • ss被实例化,但是不一定 ss.children就一定也被实例化且有值吧,看得再查下程序,或者跟踪下。
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年9月7日 10:36
    版主
  •   void Test() {
        var ss = rs.Where(s => s.InnerEntity.OID == 10).FirstOrDefault();
        var t = (from section in e.Result where section.UpId == 10 select new EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Section>(section, null));
        ss.Children = t;
        MessageBox.Show(ss.Children == null ? "null" : "Y :" + ss.InnerEntity.OID.ToString());
        this.show(rs);
        //this.show(rs.Where(s => s.InnerEntity.OID == 10));
      }

      void show(IEnumerable<EMS.SLCore.TreeViewItemData<EMS.SLCore.SVC.Section>> rs) {
       var ss = rs.Where(s => s.InnerEntity.OID == 10).FirstOrDefault();

       MessageBox.Show(ss.Children == null ? "null" : "N :" + ss.InnerEntity.OID.ToString());
      }

    ss.Children = t;肯定是有值的,因为在Test方法中,messagebox提示为"Y :1",有一个chidlren.
    但是在show方法中,messagebox显示就是"null"
    若在show方法中,把ss.children改为 ss,也就是只检查ss,是有值的
     

    2009年9月8日 1:42
  • 为什么啊?

    2009年9月8日 5:40
  • 找到了
     ss.Children 没有赋值
    上面有赋值  下面没有是null的
    注意ss是两个不同变量 不是同一个根 你声明了两次ss

    2009年9月8日 6:19
  • ss对应的是同一个对象,EMS.SLCore.TreeViewItemData<>, 这是没有疑问的,只有一个对象的OID==10,按理说,同一个对象的属性当然是不变的,上面赋值了,下面当然应该可以取到

    2009年9月8日 6:25
  • 怎么我问的问题一个都没有解决到???是没人搞silverlight还是根本就不是个问题
    2009年9月8日 7:00
  • ss对应的是同一个对象,EMS.SLCore.TreeViewItemData<>, 这是没有疑问的,只有一个对象的OID==10,按理说,同一个对象的属性当然是不变的,上面赋值了,下面当然应该可以取到


    那么我真不明白你为什么不传ss 要传rs啊?
    2009年9月8日 7:34
  • 这里只是为了看清楚这个问题才这样做的,在实际代码中都是整个rs进行操作的,先给rs中的每个Children进行赋值,再bind到treeview中
    2009年9月8日 7:42
  • 只有一个可能了
    你用了where这个操作了 它是延迟操作符
    你确实引用了同一个对象 不过没有存储对象里面  ss不是rs对象了 是IEnumerable序列化对象
    2009年9月8日 8:22