2016-09-19 3 views
1

GridView를 마스터/세부 모드로 사용하여 MongoDb 서버에서 데이터를 가져 오려고했습니다.잘못된 결과가있는 행을 반복하십시오.

그림이 보여 주듯이 사용자 컬렉션에서 ID와 이름을 얻은 다음 부모 행을 반복하여 ID를 가져오고 두 번째 제품 컬렉션에서 각 사용자의 세부 정보를 가져옵니다.

서버에서 첫 번째 사용자는 1 개의 제품 만 있지만 그림에서는 2 개의 테이블로 3 번 보여줍니다.

그래서 올바른 결과를 얻을하는 방법 및 마스터/세부 정보의 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

관련 문제