2009-08-19 4 views
1

Ich habe eine benutzerdefinierte ComboBox Kontrolle, die ich in einem DataGridViewCell verwenden möchte. Ich erbte zuerst DataGridViewCell und versuche, die Paint() Methode zu überschreiben, um die ComboBox in der Zelle zu malen.Wie kann ich eine benutzerdefinierte ComboBox in einer DataGridViewCell zeichnen?

Mein Problem ist, dass nach der Vererbung DataGridViewColumn und Festlegen der CellTemplate Eigenschaft auf eine neue Instanz meiner CustomDataGridViewCell Klasse, die Zelle ist grau mit keinen Inhalten.

Die Klassenvariable cBox wird im Objekt ctor instanziiert.

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(); 
} 

Wie kann ich die ComboBox in der Zelle richtig malen?

Antwort

1

Ich machte ziemlich einfache Änderung, die mein Problem behebt.

Ich hatte die Koordinaten zu korrigieren anstelle des DataGridView zum Fenster relativ zu sein, Controls.Add() für den Besitz Formular aufrufen und die Kontrolle vor dem DataGridView neu positionieren:

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 Sie das schaffen, Dateien, um eine CheckedCombBox in DataGridView zu haben? – San