Ошибка FormattedType с пользовательским столбцом / ячейкой DGV - PullRequest
2 голосов
/ 15 мая 2011

Я создал пользовательские ячейку и столбец DataGridView, в которых отображаются анимированные изображения. Это действительно просто и отлично работает, за исключением того, что он вызывает событие «DataError» из DGV: «Отформатированное значение ячейки имеет неправильный тип»

Я удалил весь код из двух своих пользовательских классов и все еще получаю эту ошибку. Я проверил, что унаследованная ячейка DGV извлекает правильный FormatedValueType из своего базового DataGridViewImageCell.

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

Я собрал крошечный (<100 строк) пример, который иллюстрирует ошибку. Я надеюсь, что кто-то может пролить свет на это для меня. Ранее я создавал другие пользовательские типы ячеек / столбцов, но они всегда основывались на System.String, и у меня никогда не было этой конкретной ошибки. </p>

Вот код:

using System;
using System.Windows.Forms;

namespace TestBench
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new BestFormEver());
        }
    }

    public class BestFormEver : Form
    {
        public BestFormEver()
        {
            InitializeComponent();
            dataGridView1.Rows.Add(2);
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.dataGridView1 = new System.Windows.Forms.DataGridView();
            this.Column1 = new PMD.Library.WinFormControls.Controls.DataGridView.ImageColumn.PMDDataGridViewImageColumn();
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
            this.SuspendLayout();
            this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.Column1});
            this.dataGridView1.Location = new System.Drawing.Point(25, 24);
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.Size = new System.Drawing.Size(454, 206);
            this.dataGridView1.TabIndex = 0;
            this.Column1.HeaderText = "Column1";
            this.Column1.Name = "Column1";
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(508, 259);
            this.Controls.Add(this.dataGridView1);
            this.Name = "BestFormEver";
            this.Text = "BestFormEver";
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
            this.ResumeLayout(false);

        }

        private System.Windows.Forms.DataGridView dataGridView1;
        private PMD.Library.WinFormControls.Controls.DataGridView.ImageColumn.PMDDataGridViewImageColumn Column1;
    }

    public class PMDDataGridViewImageColumn : DataGridViewColumn
    {
        public PMDDataGridViewImageColumn() : base(new PMDDataGridViewImageCell())
        {
        }
    }

    class PMDDataGridViewImageCell : DataGridViewImageCell
    {
        public PMDDataGridViewImageCell()
        {
        }
    }
}

1 Ответ

2 голосов
/ 16 мая 2011

Вам необходимо переопределить метод GetFormattedValue () в вашем классе PMDDataGridViewImageCell и заставить его возвращать значение (любое значение будет иметь значение, даже нулевое).

Используя ваш пример, я добавил переопределение, которое возвращает SystemIcons.Question - исключение теперь прошло, и значок правильно отображается в сетке.

Надеюсь, это поможет.

...