كيف يمكنني رسم غوصو مخصص داخل datagridviewcell؟
-
18-09-2019 - |
سؤال
لدي مخصص ComboBox
السيطرة على أنني أريد استخدامها في DataGridViewCell
. وبعد ورثت لأول مرة DataGridViewCell
وأنا أحاول تجاوز Paint()
طريقة لرسم ComboBox
في الخلية.
مشكلتي هي أنه بعد الوراء DataGridViewColumn
ووضع CellTemplate
الممتلكات إلى مثيل جديد من بلدي CustomDataGridViewCell
الطبقة، الخلية رمادية مع عدم وجود محتويات.
ال cBox
يتم إنشاء مثيل للمتغير من الدرجة في CODETS CTOR.
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
في الخلية؟
المحلول
لقد قمت بتغيير بسيط إلى حد ما إصلاح مشكلتي.
اضطررت إلى تصحيح الإحداثيات لتكون نسبة إلى النافذة بدلا من 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();
}
لا تنتمي إلى StackOverflow