2009-12-03 1 views
1

Итак, у меня есть datagridview.Учебное пособие по C# - привязка DataGridView к коллекции, содержащей объект

Обычно я могу создать BindingList моего объекта, и он будет отображать все данные и colums правильно

Eg

BindingList<Customer> CustomerList = new BindingList<Customer>(); 
myDataGridView.DataSource = CustomerList; 

И он будет отображать столбец для каждого свойства Клиента, который имеет поглотитель , Он также отображает строку для каждого объекта.

Отличный результат.

Теперь в моем текущем сценарии, у меня есть эти объекты:

public class Reservedele 
{ 
    public int Rnr { get; private set;} 
    public string Navn { get; private set;} 
    public double Pris { get; private set;} 
    public string Type { get; private set;} 

    public Reservedele(int rnr, string navn, double pris, string type) 
    { 
     Rnr = rnr; 
     Navn = navn; 
     Pris = pris; 
     Type = type; 
    } 
} 
public class IndkøbsKurvReservedele 
{ 
    public Reservedele Reservedel { get; private set;} 
    public int Antal { get; private set; } 
    public double Pris { get; private set; } 

    public IndkøbsKurvReservedele(Reservedele reservedel, int antal, double pris) 
    { 
     Reservedel = reservedel; 
     Antal = antal; 
     Pris = pris; 
    } 
} 

Так что, если я это сделать:

BindingList<IndkøbsKurvReservedele> ReserveDeleListeIndKøbsKurv = new BindingList<IndkøbsKurvReservedele>(); 
myDataGridView.DataSource = ReserveDeleListeIndKøbsKurv; 

Он не будет работать :( ошибка в том, что DataGridView показывает :

  • сам объект
  • Antal
  • Pris

Пример: alt text http://i47.tinypic.com/34h9cnp.png

Как я могу поручить DataGridView, что я хочу его иметь свойства из Reservedel следуют свойства в IndkøbsKurvReservedele как заголовки ??

Для справки: «Запасные части» и «IndkøbsKurvReservedel» означают что-то вроде «ShoppingBasketOfSpareParts». Antal означает «количество», как и во сколько существует. Извините за именование имен переменных.

EDIT: У меня есть другой вопрос: как я могу сделать свойство Rnr не отображаться как столбец?

ответ

0

Это мое решение:

public class IndkøbsKurvReservedele 
{ 
    //public Reservedele Reservedel { get; private set;} 
    private int Rnr; 
    public string Navn { get; private set; } 
    public double Pris { get; private set; } 
    public string Type { get; private set; } 
    public int Antal { get; private set; } 
    public double SPris { get; private set; } 

    public IndkøbsKurvReservedele(Reservedele reservedel, int antal, double sPris) 
    { 
     Rnr = reservedel.Rnr; 
     Navn = reservedel.Navn; 
     Pris = reservedel.Pris; 
     Type = reservedel.Type; 
     Antal = antal; 
     SPris = sPris; 
    } 
    public int HenrReservedelsNummer() 
    { 
     return Rnr; 
    } 
} 

Если кто создает лучше. Вместо этого я приму их.

0

Вы не можете, если вы не наследуете этот класс или не переносите все эти данные в какой-то набор данных. Я не знаю отношений ваших классов или того, как они сочетаются. С текущей публикацией, которую вы нам дали, это невозможно.

Также как вы смеете создавать переменные как иностранные слова! :) просто шучу

+0

Не можете ли вы его вручную проинструктировать? – CasperT

2

Технически вы не можете, источник данных не связывает вложенные свойства.

Но вы всегда можете обходным путем, подвергая свойства вашего дочернего объекта родительскому.

+1

Не могли бы вы показать пример? – CasperT

1

Вы также можете переопределить метод ToString() класса Reservedele, чтобы отображать все, что вы хотите (по умолчанию DataGridView вызовет метод ToString() для получения содержимого ячейки).

+0

Действительно? Нанизывать()? Не имел представления. Но как он может отделить строку от Coloumns? Что он использует в качестве разделителя? – CasperT

+0

В открытой проблеме вы связываете столбцы с свойствами объекта. Эти свойства могут быть нативными типами (строка, int, double и т. Д.) Или объектами. Если свойство является объектом, метод ToString() вызывается для заполнения текста ячейки. Поэтому, если вы переопределяете этот метод для возврата ¨It Works¨, содержимое ячейки, привязанное к объекту, будет выглядеть как «It Works». Таким образом, вы не разделяете строки на столбцы, которые уже выполняются во время разработки ... У вас возникла идея? Я могу отправить вам пример, если хотите. –

+0

Пример пожалуйста :) – CasperT

1

Вы всегда можете использовать LINQ и сделать что-то вроде:

var bindMe = 
      from r in ReserveDeleListeIndKøbsKurv 
      select new 
      { 
       navn = r.Reservedel.Navn, 
     pris = r.Reservedel.Pris, 
     type = r.Reservedel.Type, 
     antal = r.Antal, 
     anotherPris = r.Pris 
      }; 

myDataGridView.DataSource = bindMe;

+0

Но это не будет иметь тот же эффект, что и список привязки, не так ли? datagrid должен обновляться, когда в списке происходят изменения. – CasperT

Смежные вопросы