Проблема с привязкой данных в пользовательском столбце таблицы данных - PullRequest
3 голосов
/ 29 мая 2011

У меня проблема с привязкой данных к пользовательскому столбцу DataGridView. Я создал столбец, который показывает рейтинг по звездам-изображениям в соответствии со значением int, которое он получает из базы данных.
Когда я проверяю это, добавляя строки вручную, это работает отлично. Но когда я привязываю к нему данные, значение всегда равно null.

Вот код класса RatingColumn:

class RatingColumn : DataGridViewImageColumn
{
    public RatingColumn()
    {
        this.CellTemplate = new RatingCell();
        this.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        this.ValueType = typeof(int);
        this.Name = "Rating";
        this.ImageLayout = DataGridViewImageCellLayout.Stretch;
    }
}

public class RatingCell : DataGridViewImageCell
{
    static Image[] starImages;

    static RatingCell()
    {
        starImages = new Image[11];

        for (int i = 0; i < 11; i++)
            starImages[i] = (Image)Properties.Resources.ResourceManager.
                GetObject("rating_" + i.ToString());
    }

    public RatingCell()
    {
        this.ValueType = typeof(int);
    }

    protected override object GetFormattedValue
         (object value, int rowIndex, ref DataGridViewCellStyle cellStyle, 
          TypeConverter valueTypeConverter, 
          TypeConverter formattedValueTypeConverter, 
          DataGridViewDataErrorContexts context)
    {
        //Here the value is always null
        return value == null ? starImages[0] : starImages[(int)value];
    }

    protected override void Paint
        (Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, 
         int rowIndex, DataGridViewElementStates elementState, object value, 
         object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
         DataGridViewAdvancedBorderStyle advancedBorderStyle, 
         DataGridViewPaintParts paintParts)
    {
        Image cellImage = (Image)formattedValue;
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, 
          value, cellImage, errorText, cellStyle, advancedBorderStyle, 
          (paintParts & ~DataGridViewPaintParts.SelectionBackground));
    }
}

Я связываю данные, используя DataProperyName

RatingColumn col = new RatingColumn();
        col.DataPropertyName = "Rating";

Когда я связываю те же данные с DataGridViewTextBoxColumn, он отлично работает.

1 Ответ

1 голос
/ 10 июня 2011
        protected override object GetFormattedValue
         (object value , int rowIndex , ref DataGridViewCellStyle cellStyle ,
          TypeConverter valueTypeConverter ,
          TypeConverter formattedValueTypeConverter ,
          DataGridViewDataErrorContexts context) {

              int v = 0;
              if ( value == null || Convert.IsDBNull ( value ) )
                  return starImages[0];

              v = Convert.ToInt32 ( value ) - 1;

              v = v < 0 ? 0 : ( v >= 3 ? 2 : v );

              return starImages[v];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...