2009-08-19 4 views
1

У меня есть пользовательский контроль ComboBox, который я хочу использовать в DataGridViewCell. Я сначала унаследовал DataGridViewCell и пытаюсь переопределить метод Paint() для рисования ComboBox в ячейке.Как я могу создать пользовательский ComboBox внутри DataGridViewCell?

Моя проблема в том, что после наследования DataGridViewColumn и установки свойства CellTemplate в новый экземпляр моего класса CustomDataGridViewCell, ячейка серая без содержимого.

В объекте ctor создается экземпляр переменной cBox.

protected override void Paint(Graphics graphics, Rectangle clipBounds, 
    Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
    object value, object formattedValue, string errorText, 
    DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle borderStyle, 
    DataGridViewPaintParts paintParts) 
{ 
   // Call MyBase.Paint() without passing object for formattedValue param 
   base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
     "", errorText, cellStyle, borderStyle, paintParts); 
    
   // Set ComboBox properties 
   this.cBox.CheckOnClick = true; 
   this.cBox.DrawMode = System.Windows.Forms.DrawMode.Normal; 
   this.cBox.DropDownHeight = 1; 
   this.cBox.IntegralHeight = false; 
   this.cBox.Location = new System.Drawing.Point(cellBounds.X, cellBounds.Y); 
   this.cBox.Size = new System.Drawing.Size(cellBounds.Width, cellBounds.Height); 
   this.cBox.ValueSeparator = ", "; 
   this.cBox.Visible = true; 
   this.cBox.Show(); 
} 

Как правильно красить ComboBox в клетке?

ответ

1

Я сделал довольно простое изменение, которое исправляет мою проблему.

Я должен был исправить координаты, чтобы быть относительно окна вместо DataGridView, вызовите Controls.Add() для владеющей формы, и изменить положение элемента управления в передней части DataGridView:

protected override void Paint(Graphics graphics, Rectangle clipBounds, 
    Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
    object value, object formattedValue, string errorText, 
    DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle borderStyle, 
    DataGridViewPaintParts paintParts) 
{ 
   // Just paint the border (because it shows outside the ComboBox bounds) 
  this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, borderStyle); 

    int cellX = this.DataGridView.Location.X + cellBounds.X; 
    int cellY = this.DataGridView.Location.Y + cellBounds.Y; 

   // Create ComboBox and set properties 
   this.cBox = new CheckedComboBox(); 
   this.cBox.DropDownHeight = 1; 
   this.cBox.IntegralHeight = false; 
   this.cBox.Location = new Point(cellX, cellY); 
   this.cBox.Size = new Size(cellBounds.Width, cellBounds.Height); 
   this.cBox.ValueSeparator = ", "; 
    
   // Add to form and position in front of DataGridView 
   this.DataGridView.FindForm.Controls.Add(this.cBox); 
   this.cBox.BringToFront(); 
} 
+1

Hi.Could вы предоставить файлов, чтобы иметь CheckedCombBox внутри DataGridView? – San