【问题标题】:Iterate Rows with wrong Results迭代错误结果的行
【发布时间】: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


【解决方案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; }
}

这比需要覆盖行源要好得多。

【讨论】:

    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多