Привязать данные к столбцам Specifi c Datagridview - Entity Framework - PullRequest
0 голосов
/ 06 апреля 2020

Я не знаю, взять ли мне все данные или только те, которые мне нужны :) Я делаю это впервые. Я хочу привязать эти данные к столбцам Specifi c

См. Select

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

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Сделайте эту строку кода под запросом:

dataGridViewX.DataSource = new BindingSource(SQLquery.ToList(), null);

BindingSource может работать с List<anonymoustype>, запрос создаст


В качестве альтернативы, потому что вы ' Если вы работаете с анонимными типами, вы также можете создать метод расширения, который сгенерирует вам BindingList:

static class ListExtensions
{
    public static BindingList<T> ToBindingList<T>(this IList<T> source)
    {
        return new BindingList<T>(source);
    }
}

Вы можете привязать сетку данных к bindingList:

dataGridViewX.DataSource = SQLquery.ToList().ToBindingList();

Binding через BindingSource дает некоторые преимущества для фильтрации, сортировки, доступа к текущему элементу и т. д. c. Это также позволяет вам организовать иерархические структуры данных. Если вы собираетесь использовать BindingSource, возможно, вам следует НЕ использовать анонимные типы, поскольку они генерируют классы POCO, сгенерированные компилятором, к которым у вас нет надежного доступа к , если вы хотите копать объект .Current bindingSource. и приведите его к тому, с чем вы работаете .

Если вместо этого вы сделали свой класс полностью определенным в своем собственном коде, то у вас есть:

collection.Select(c => new Whatever(){ Id = c.Id, Name = c.Name });

Но вы можете лучше работайте с ним:

var x = myBindingSource.Current as Whatever;

Если вы используете анонимные типы, вы просто не сможете выполнить приведение as Whatever, и вы в конечном итоге застрянете с myBindingsource.Current как объектом, который требует либо какой-то dynamic обходной путь (который не является оптимальным, когда на самом деле это тип класса, известный во время разработки) или что-то вроде хака, когда вы объявляете другой анонимный тип с таким же порядком и типом параметров и полагаетесь на то, что компилятор делает их одинаковыми вещь, когда он создает анонимные типы

0 голосов
/ 06 апреля 2020

Привет, я создал небольшой демонстрационный код. Вам просто нужно переписать свой код, и он должен работать. Надеюсь, это поможет вам.

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