2010-10-29 1 views
1

Я использую код в this article для создания DataGridViewProgressCell, который принимает целое число от 0 до 100 и отображает значение в процентах вместе с изображением, которое выглядит как индикатор выполнения в ячейке DataGridView.Изменение типа ячейки в привязке данных DataGridView к пользовательскому типу DataGridViewCell

Это прекрасно работает, когда я не использую DataGridView с привязкой к данным, но когда я привязываюсь к списку объектов с целочисленным свойством, я не могу понять, как сообщить DataGridView, что конкретный столбец следует рассматривать как новый тип DataGridViewProgressCell.

В приведенном ниже коде Percent является целочисленным свойством объекта Car. Ошибка я получаю время запуска ошибки:

Value provided for CellTemplate must be of type System.Windows.Forms.DataGridViewTextBoxCell or derive from it. 

Вот код:

namespace GridViewSample 
{ 
    public partial class Form1 : Form 
    { 
     private SortableBindingList<Car> carlist = new SortableBindingList<Car>(); 

     public Form1() 
     { 
      InitializeComponent(); 

      // databind the datagridview to the car list 
      dataGridView1.DataSource = carlist; 

      DataGridViewCell cell = new DataGridViewProgressCell(); 

      // run time error occurs on this line 
      dataGridView1.Columns["Percent"].CellTemplate = new DataGridViewProgressCell(); 
     } 
    } 
} 

ответ

2

По умолчанию DGV населяет столбцы автоматически. Если вы хотите использовать собственные столбцы, вам нужно заполнить столбцы вручную. Сначала установите DataGridView.AutoGenerateColumns = false, затем добавьте нужные столбцы, вместо того, чтобы пытаться изменить шаблон существующего (автоматически заполненного) столбца.

+0

Итак, установите AutoGenerateColumns в false, вручную определите столбцы, а затем установите DataSource в список привязки, правильно? В этой последовательности? – Dave

+0

Единственный порядок, который имеет значение, заключается в том, что AutoGenerateColumns должен быть ложным до того, как вы установите свойство DataSource, хотя кажется логичным добавлять столбцы перед добавлением данных. – Tergiver

2

Если я правильно понимаю ваш вопрос, вот мой ответ. У меня есть datetimepickercolumn, и я ставлю его как CellTemplate и хорошо.

Я придумал, как храм, мой datetimepickercolumn при добавлении столбцов.

private void dgvFechas_ColumnAdded(object sender, DataGridViewColumnEventArgs e) { 
try { 
    //Evalua si el tipo de dato es DateTime. 
    if(e.Column.ValueType == typeof(DateTime)) { 
     e.Column.CellTemplate = new CalendarCell(); 
    } 
} 
catch(Exception ex) { } 
} 

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

+0

Спасибо, человек! я потратил 2 часа на поиск этого решения – Flux

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