【发布时间】:2016-09-19 10:35:09
【问题描述】:
我尝试在 Master/Details 模式下使用 GridView 从 MongoDb 服务器获取数据。
如图所示,我从用户集合中获取 Id 和名称,然后迭代父行以获取 Id,并在第二个产品集合中获取每个用户的详细信息。
在服务器中,第一个用户只有 1 个产品,但在图片中显示了 3 次,有 2 个表格。
那么如何获得正确的结果以及如何使用 Master/Detail 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; }
}
}
【问题讨论】:
-
这仍然相关吗?
-
相关,是什么意思?
-
在我看来,你现在有不同的“得到正确的结果”,我不知道问题是否已经回答/更新了。
-
没有人给出解决方案
-
请您使用 [BsonElement] 更新 WatchTblCls、UserCls、SymboleCls 类。请更新问题。
标签: c# mongodb gridview telerik