C# 将数据绑定到Datagridview-实体框架的特定列

C# 将数据绑定到Datagridview-实体框架的特定列,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我不知道是应该获取所有数据还是只获取我需要的数据: 我是第一次这样做。 我想将此数据绑定到特定列 参见选择 var SQLquery = (from artikel in db.DHH_Lagerverwaltung_Artikel join hersteller in db.DHH_Lagerverwaltung_Hersteller on artikel.ID_Hersteller equals hersteller.ID_Hersteller join kategorie in db.DH

我不知道是应该获取所有数据还是只获取我需要的数据: 我是第一次这样做。 我想将此数据绑定到特定列

参见选择

var SQLquery = (from artikel in db.DHH_Lagerverwaltung_Artikel
join hersteller in db.DHH_Lagerverwaltung_Hersteller on artikel.ID_Hersteller equals hersteller.ID_Hersteller
join kategorie in db.DHH_Lagerverwaltung_Kategorie on artikel.ID_Kategorie equals kategorie.ID_Kategorie
join bestand in db.DHH_Lagerverwaltung_Bestand on artikel.ID_Artikelnummer equals bestand.ID_Artikelnummer
join fach in db.DHH_Lagerverwaltung_Fach on bestand.ID_Fach equals fach.ID_Fach
join stellplatz in db.DHH_Lagerverwaltung_Stellplatz on fach.ID_Stellplatz equals stellplatz.ID_Stellplatz
join ebene in db.DHH_Lagerverwaltung_Ebene on stellplatz.ID_Ebene equals ebene.ID_Ebene
join regal in db.DHH_Lagerverwaltung_Regal on ebene.ID_Regal equals regal.ID_Regal
join lager in db.DHH_Lagerverwaltung_Lager on regal.ID_Lager equals lager.ID_Lager
//where lager.Raum == ""
select new {
 ArtikelBezeichnung = artikel.Bezeichnung,
  ArtikelEAN = artikel.EAN,
  BestandsMenge = bestand.Menge,
  MinMenge = bestand.Menge,
  Lagerort = lager.Raum + regal.RegalNr + ebene.Ebene + stellplatz.Stellplatz + fach.Fach,
  Hersteller = hersteller.Name,
  Kategorie = kategorie.Name
});

在查询下面执行以下一行代码:

dataGridViewX.DataSource = new BindingSource(SQLquery.ToList(), null);
BindingSource可以使用该列表

相反,如果您在自己的代码中使类成为完全定义的类,那么您有:

collection.Select(c => new Whatever(){ Id = c.Id, Name = c.Name });
但您可以更好地使用它:

var x = myBindingSource.Current as Whatever;

如果你使用匿名类型,无论你做什么样的强制转换都不容易,你最终会被myBindingsource卡住。Current是一个对象,需要一些动态的解决方法,当这是一个设计时已知的类类型时,这不是最佳的,或者需要一点技巧,在其中声明另一个具有相同顺序和参数类型的匿名类型,并依靠编译器在创建匿名类型时使它们成为相同的东西。嗨,我创建了一个小的演示代码。你只需要重新编写你的代码,它应该可以工作。希望它能帮助你

private class Data
    {
        public int? Id { get; set; }
        public DateTime? DateTimeShipped { get;set;}
        public DateTime? DontNeed1 { get; set; }
        public DateTime? DontNeed2 { get; set; }
        public bool? Ok { get; set; }

        public Data()
        {

        }
        public Data(int? id, DateTime? dateTime, bool? Ok, DateTime? DontNeed1, DateTime? DontNeed2)
        {
            this.Id = id;
            this.DateTimeShipped = dateTime;
            this.Ok = Ok;
            this.DontNeed1 = DontNeed1;
            this.DontNeed2 = DontNeed2;
        }
    }
类数据保存来自linq select的值。 还有一个字典,它包含了所需列的列表,包括它们的类型。此字典用于创建应位于DataGridView中的列

Dictionary<string, Type> desiredCols = new Dictionary<string, Type>
{
     {"Id", typeof(int)},
     {"DateTimeShipped", typeof(DateTime)},
     { "Ok", typeof(bool)}
};

IEnumerable<Data> sqlList = (from data in dbContext.SomeTable
                  select new Data
                  {
                      Id = data.Id,
                      DateTimeShipped = data.DatumSuggestFrom,
                      Ok = data.Ok,
                      DontNeed1 = data.DatumSuggestFrom,
                      DontNeed2 = data.DatumSuggestTo
                  }).ToList();

var bindingList = new BindingList<Data>(sqlList.ToList());
foreach(var c in desiredCols)
{
    DataGridViewColumn col = new DataGridViewTextBoxColumn();
    col.Name = c.Key;
    col.HeaderText = c.Key;
    col.ValueType = c.Value;
    dataGridView1.Columns.Add(col);
 };

 foreach(var col in bindingList)
 {
     dataGridView1.Rows.Add(col.Id, col.DateTimeShipped, col.Ok);
 }

到目前为止看起来不错,虽然加入的人很多。问题是什么?现在我想将数据绑定到datagrid中的列,但我不知道怎么做您是在向导中手动创建列还是在代码中添加列?@Thomas如果我是您,我会创建一个存储过程并加载结果。我想绑定的列应该更容易。我个人认为datagridview更容易与datatable一起使用,使用datatable最简单的方法是遍历EF而不是遍历EF。好的,谢谢。关于BindingList的一个问题:我必须在参数中定义线程类型,我有几种方法可以做到这一点?不,sry,我指的是我必须定义的数据类型我不能100%确定你在问什么。您可以在Select?中添加更多内容@CaiusJard优质干净的解决方案。我将在未来的项目中使用它。谢谢。@CaiusJard我正在寻找确切的解决方案。两者都能完美地工作。由于这些优点,我将使用bindingsorce解决方案。非常感谢,非常感谢。非常有趣。
private class Data
    {
        public int? Id { get; set; }
        public DateTime? DateTimeShipped { get;set;}
        public DateTime? DontNeed1 { get; set; }
        public DateTime? DontNeed2 { get; set; }
        public bool? Ok { get; set; }

        public Data()
        {

        }
        public Data(int? id, DateTime? dateTime, bool? Ok, DateTime? DontNeed1, DateTime? DontNeed2)
        {
            this.Id = id;
            this.DateTimeShipped = dateTime;
            this.Ok = Ok;
            this.DontNeed1 = DontNeed1;
            this.DontNeed2 = DontNeed2;
        }
    }
Dictionary<string, Type> desiredCols = new Dictionary<string, Type>
{
     {"Id", typeof(int)},
     {"DateTimeShipped", typeof(DateTime)},
     { "Ok", typeof(bool)}
};

IEnumerable<Data> sqlList = (from data in dbContext.SomeTable
                  select new Data
                  {
                      Id = data.Id,
                      DateTimeShipped = data.DatumSuggestFrom,
                      Ok = data.Ok,
                      DontNeed1 = data.DatumSuggestFrom,
                      DontNeed2 = data.DatumSuggestTo
                  }).ToList();

var bindingList = new BindingList<Data>(sqlList.ToList());
foreach(var c in desiredCols)
{
    DataGridViewColumn col = new DataGridViewTextBoxColumn();
    col.Name = c.Key;
    col.HeaderText = c.Key;
    col.ValueType = c.Value;
    dataGridView1.Columns.Add(col);
 };

 foreach(var col in bindingList)
 {
     dataGridView1.Rows.Add(col.Id, col.DateTimeShipped, col.Ok);
 }