2016-09-19 125 views
1

我试图在主/细节模式下使用GridView从MongoDb服务器获取数据。迭代行结果错误

而且照片显示,我从用户集合中获得Id和名称,然后迭代父行以获取Id,然后在第二个产品集合中获取以获取每个用户的详细信息。

在服务器中,第一个用户只有一个产品,但在图片中显示它3次与2个表。

那么如何得到正确的结果,以及如何与主/ GridView的

namespace TelerikGridView 
{ 
    public partial class Form2 : Form 
    { 
     List<WatchTblCls> wts; 
     List<UserCls> user; 
     List<SymboleCls> symb; 
     public Form2() 
     { 
      InitializeComponent(); 
      wts = new List<WatchTblCls>(); 
      user = new List<UserCls>(); 
      symb = new List<SymboleCls>(); 
     } 

     private async void button1_Click(object sender, EventArgs e) 
     { 
      // add user into datagridview from MongoDB Colelction Watchtbl 
      var client = new MongoClient("mongodb://servername:27017"); 

      var database = client.GetDatabase("WatchTblDB"); 
      var collectionWatchtbl = database.GetCollection<BsonDocument>("Watchtbl"); 
      var collectionUser = database.GetCollection<BsonDocument>("Users"); 

      //wts = await collectionWatchtbl.Find(x => true).ToListAsync(); 

      //Get User Data 
      var filter = new BsonDocument(); 
      using (var cursor = await collectionUser.FindAsync(filter)) 
      { 
       while (await cursor.MoveNextAsync()) 
       { 
        var batch = cursor.Current; 
        foreach (var document in batch) 
        { 
         user.Add(new UserCls() 
         { 
          Id = ObjectId.Parse(document["_id"].ToString()), 
          Name = document["Name"].ToString() 
         }); 
        } 
       } 
      } 

      //Get WatchTbl Data 
      using (var cursor = await collectionWatchtbl.FindAsync(filter)) 
      { 
       while (await cursor.MoveNextAsync()) 
       { 
        var batch = cursor.Current; 
        foreach (var document in batch) 
        { 
         wts.Add(new WatchTblCls() 
         { 
          Id = ObjectId.Parse(document["_id"].ToString()), 
          UserId = document["userId"].ToString(), 
          WID = document["wid"].ToString(), 
          Name = document["name"].ToString() 
          //Symbole 
         }); 
        } 
       } 
      } 

      this.radGridView1.DataSource = user; 
      this.radGridView1.Columns["fbId"].IsVisible = false; 
      this.radGridView1.Columns["Pass"].IsVisible = false; 
     } 

     GridViewTemplate childTemplate; 
     private GridViewTemplate CreateChildTemplate() 
     { 
      childTemplate = new GridViewTemplate(); 
      this.radGridView1.Templates.Add(childTemplate); 
      GridViewTextBoxColumn column = new GridViewTextBoxColumn("wid"); 
      childTemplate.Columns.Add(column); 

      column = new GridViewTextBoxColumn("name"); 
      childTemplate.Columns.Add(column); 

      childTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; 
      return childTemplate; 
     } 

     private void Form2_Load(object sender, EventArgs e) 
     { 
      GridViewTemplate childTemplate = CreateChildTemplate(); 
      this.radGridView1.Templates.Add(childTemplate); 
      childTemplate.HierarchyDataProvider = new GridViewEventDataProvider(childTemplate); 

     } 

     private void radGridView1_RowSourceNeeded(object sender, GridViewRowSourceNeededEventArgs e) 
     { 
      foreach (GridViewRowInfo item in radGridView1.Rows) 
      { 
       var itll = item.Cells["id"].Value.ToString(); 
       foreach (var itemWts in wts) 
       { 
        if (itll == itemWts.UserId.ToString()) 
        { 
         GridViewRowInfo row = e.Template.Rows.NewRow(); 
         row.Cells["wid"].Value = itemWts.WID.ToString(); 
         row.Cells["name"].Value = itemWts.Name.ToString(); 
         //symbole 
         e.SourceCollection.Add(row); 
        } 
       } 
      } 
     } 
    } 

    public class UserWatchTblCls 
{ 
    [BsonId] 
    [BsonElement("_id")] 
    public ObjectId Id { get; set; } 
    [BsonElement("fbId")] 
    public string fbId { get; set; } 
    [BsonElement("Name")] 
    public string Name { get; set; } 
    [BsonElement("pass")] 
    public string Pass { get; set; } 
    [BsonElement("Watchtbl")] 
    public List<WatchTblCls> WatchTbls { get; set; } 
} 

public class WatchTblCls 
{ 
    [BsonElement("wid")] 
    public string WID { get; set; } 
    [BsonElement("name")] 
    public string Name { get; set; } 
    [BsonElement("Symboles")] 
    public List<SymboleCls> Symbols { get; set; } 
} 

public class SymboleCls 
{ 
    [BsonElement("Name")] 
    public string Name { get; set; } 
} 
} 

enter image description here

+0

这是否仍然相关? – ntohl

+0

相关,意思是什么? – Juste3alfaz

+0

在我看来,你现在有不同的“得到正确的结果”,我不知道这个问题是否已经得到解答/更新。 – ntohl

回答

1

工作,你可以用绑定做到这一点。

private GridViewTemplate CreateChildTemplate() 
{ 
    GridViewTemplate childTemplate = new GridViewTemplate(); 
    GridViewTextBoxColumn column = new GridViewTextBoxColumn("WID"); 
    childTemplate.Columns.Add(column); 

    column = new GridViewTextBoxColumn("Name"); 
    childTemplate.Columns.Add(column); 

    childTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; 
    return childTemplate; 
} 

private GridViewTemplate CreateGrandChildTemplate() 
{ 
    GridViewTemplate grandChildTemplate = new GridViewTemplate(); 
    GridViewTextBoxColumn column = new GridViewTextBoxColumn("Name"); 
    grandChildTemplate .Columns.Add(column); 

    grandChildTemplate .AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; 
    return grandChildTemplate ; 
} 

private void RadForm1_Load(object sender, EventArgs e) 
{ 
    var client = new MongoClient("mongodb://localhost:27017"); 

    var database = client.GetDatabase("test"); 
    var collectionWatchtbl = database.GetCollection<BsonDocument>("UserWatchtbl"); 

    var filter = new BsonDocument(); 

    var user = new List<UserWatchTblCls>(); 
    var cursor = collectionWatchtbl.FindAsync(filter).Result; 
    cursor.ForEachAsync(batch => 
    { 
     user.Add(BsonSerializer.Deserialize<UserWatchTblCls>(batch)); 
    }); 

    this.radGridView1.DataSource = user; 
    this.radGridView1.Columns["fbId"].IsVisible = false; 
    this.radGridView1.Columns["Pass"].IsVisible = false; 
    GridViewTemplate childTemplate = CreateChildTemplate(); 
    childTemplate.DataSource = new BindingSource(user, "WatchTbls"); 
    GridViewTemplate grandChildTemplate = CreateGrandChildTemplate(); 
    grandChildTemplate.DataSource = new BindingSource(childTemplate.DataSource, "Symbols"); 
    this.radGridView1.Templates.Add(childTemplate); 
    childTemplate.Templates.Add(grandChildTemplate); 
    var gridViewRelation1 = new GridViewRelation(radGridView1.MasterTemplate, childTemplate); 
    this.radGridView1.Relations.Add(gridViewRelation1); 
    var gridViewRelation2 = new GridViewRelation(childTemplate, grandChildTemplate); 
    this.radGridView1.Relations.Add(gridViewRelation2); 
} 

public class UserWatchTblCls 
{ 
    [BsonId] 
    [BsonElement("_id")] 
    public ObjectId Id { get; set; } 

    public string fbId { get; set; } 
    public string Name { get; set; } 

    [BsonElement("pass")] 
    public string Pass { get; set; } 

    [BsonElement("Watchtbl")] 
    public List<WatchTblCls> WatchTbls { get; set; } 
} 

public class WatchTblCls 
{ 
    [BsonElement("wid")] 
    public string WID { get; set; } 

    [BsonElement("name")] 
    public string Name { get; set; } 

    [BsonElement("Symboles")] 
    public List<SymboleCls> Symbols { get; set; } 
} 

public class SymboleCls 
{ 
    public string Name { get; set; } 
} 

这是比覆盖所需的行源更好的解决方案。

+0

thnx ..它的工作原理 – Juste3alfaz