Можно ли привязать свойства сложного типа к сетке данных?

Asked
Viewd22185

20

Как мне привязать следующий объект, Car, к сетке?

общественный класс Car
{
   длинный Id {получить; установлен;}
   Производитель Maker {получить; установлен;}
}

публичный класс Manufacturer
{
   длинный Id {получить; установлен;}
   Имя строки {get; установлен;}
}

Примитивные типы легко связываются, но я не нашел способа отобразить что-либо для Maker. Я бы хотел, чтобы на нем отображалось имя производителя. Это вообще возможно?

Как это сделать? Должен ли я сохранить ManufacturerId в Car, а затем настроить lookupEditRepository со списком производителей?

8 ответов

2

Просто используйте список и установите DataMember на строку «Maker.Name», и если вы хотите, чтобы DataKeyField использовал идентификатор автомобиля, просто установите для него значение «ID». .

 dataGrid.DataSource = carList;
dataGrid.DataMember = "Maker.Name";
dataGrid.DataKeyField = "ID";
dataGrid.DataBind();
 

Я знаю, что это работает в репитере, по крайней мере ...

12

Да, вы можете создать TypeDescriptionProvider для выполнения вложенной привязки. Вот подробный пример из блога MSDN:

http://blogs.msdn.com/msdnts/archive/2007/01/19/how-to-bind-a-datagridview-column-to- свойство-второго-уровня-данных-источника.aspx

5
     public class Manufacturer
    {
       long Id {get; set;}
       String Name {get; set;}

       public override string ToString()
       {
          return Name;
       }
    }
 

Заменить метод на строковый.

2

Если вы хотите предоставить определенные вложенные свойства в качестве целей привязки, тогда ответ Бена Хоффштейна ( http://blogs.msdn.com/msdnts/archive/2007 /01/19/how-to-bind-a-datagridview-column-to-a-second-level-property-of-a-data-source.aspx ) довольно хорошо. Ссылка в статье немного туповата, но работает.

Если вы просто хотите привязать столбец к сложному свойству (например, «Производитель») и переопределить логику отрисовки, то либо сделайте то, что рекомендовано ManiacXZ, либо просто создайте подкласс BoundField и предоставьте собственную реализацию FormatDataValue (). Это похоже на переопределение ToString (); вы получаете ссылку на объект и возвращаете строку, которую хотите отобразить в своей сетке.

Примерно так:

 public class ManufacturerField : BoundField
{
    protected override string FormatDataValue(object dataValue, bool encode)
    {
        var mfr = dataValue as Manufacturer;

        if (mfr != null)
        {
            return mfr.Name + " (ID " + mfr.Id + ")";
        }
        else
        {
            return base.FormatDataValue(dataValue, encode);
        }
    }
}
 

Просто добавьте поле ManufacturerField в свою сетку, указав «Производитель» в качестве поля данных, и все готово.

8

Я подошел к этому в недавнем приложении, создав мои собственные классы DataGridViewColumn и DataGridViewCell, унаследованные от одного из существующих, таких как DataGridViewTextBoxColumn и DataGridViewTextBoxCell.

В зависимости от типа ячейки, которую вы хотите, вы можете использовать другие, такие как Button, Checkbox, ComboBox и т. д. Просто взгляните на типы, доступные в System.Windows.Forms.

Ячейки имеют дело со своими значениями как с объектами, поэтому вы сможете передать свой класс Car в значение ячейки.

Переопределение SetValue и GetValue позволит вам иметь любую дополнительную логику, необходимую для обработки значения.

Например:

 public class CarCell : System.Windows.Forms.DataGridViewTextBoxCell
{
    protected override object GetValue(int rowIndex)
    {
        Car car = base.GetValue(rowIndex) as Car;
        if (car != null)
        {
            return car.Maker.Name;
        }
        else
        {
            return "";
        }
    }
}
 

В классе столбца главное, что вам нужно сделать, это установить CellTemplate на свой собственный класс ячеек.

 public class CarColumn : System.Windows.Forms.DataGridViewTextBoxColumn
{
    public CarColumn(): base()
    {
        CarCell c = new CarCell();
        base.CellTemplate = c;
    }
}
 

Использование этих настраиваемых столбцов / ячеек в DataGridView позволяет добавить в DataGridView множество дополнительных функций.

Я использовал их, чтобы изменить отображаемое форматирование, переопределив GetFormattedValue для применения настраиваемого форматирования к строковым значениям.

Я также переопределил Paint, чтобы можно было настраивать выделение ячеек в зависимости от условий значения, изменяя Style.BackColor ячеек на то, что я хотел, в зависимости от значения.