DataGridViewCell と Column をサブクラス化してDataGridViewLabelCell
、DataGridViewLabelColumn
セル内に表示するラベルを追加できるようにしました。アイデアは、ラベルを互いに積み重ねたり、異なる色を使用したり、個々のラベルのクリック イベントを処理したりできるということです。にはDataGridViewLabelCell
、ラベルを追加する次のコードがあります。
public void AddLabel(string LabelText, Color BackColor, int Opacity, float ScalePosition, object Tag)
{
Label label = new Label();
label.Visible = false;
label.Text = LabelText;
label.AutoSize = true;
label.BorderStyle = BorderStyle.Fixed3D;
label.BackColor = Color.FromArgb(Opacity, BackColor);
this.DataGridView.Controls.Add(label);
LabelScalePostion labelScale = new LabelScalePostion();
labelScale.Label = label;
labelScale.ScalePosition = ScalePosition;
label.DoubleClick += new EventHandler(DataGridViewCellLabel_DoubleClick);
_labels.Add(labelScale);
}
private void DataGridViewCellLabel_DoubleClick(object sender, EventArgs e)
{
Label label = (Label)sender;
MessageBox.Show("ID = " + label.Tag.ToString());
}
また、ラベルを配置するためにDataGridViewLabelCell
'sイベントをオーバーライドしました。Paint
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{
// Call the base class method to paint the default cell appearance.
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
value, formattedValue, errorText, cellStyle,
advancedBorderStyle, paintParts);
foreach (LabelScalePostion labelScale in _labels)
{
Label label = labelScale.Label;
label.Visible = true;
Point location = cellBounds.Location;
location.Offset(40, (int)(cellBounds.Height * labelScale.ScalePosition));
label.Location = location;
}
}
これは、ラベルを含むセルがスクロールして表示されるまでラベルが表示されないという意味で機能しますが、スクロールして表示されなくなると、ラベルは DGV の上部に留まります。したがって、セルが表示されなくなったときにイベントを発生させる方法が必要ですが、そのようなイベントは見つかりません。
私は現在Scroll
、次のように所有する DataGridView のイベントでこれを処理しています。
private void dgvItemView_Scroll(object sender, ScrollEventArgs e)
{
switch (_formType)
{
case FormType.DayView:
foreach (DataGridViewRow row in this.dgvItemView.Rows)
{
DataGridViewLabelCell cell = (DataGridViewLabelCell)row.Cells[0];
foreach (DataGridViewLabelCell.LabelScalePostion labelScale in cell.Labels)
labelScale.Label.Visible = false;
}
break;
}
}
ただし、これは正しくないと思われます。その証拠に、スクロールするとちらつきが見られます。他のすべて (外観、イベントなど) は正常に動作し、ちらつきは許容できますが、これを達成するためのより良い方法があるはずです。