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);
}