Postupy: Přizpůsobení buněk a sloupců v ovládacím prvku Windows Forms DataGridView rozšířením jeho chování a vzhledu
Ovládací DataGridView prvek poskytuje řadu způsobů, jak přizpůsobit jeho vzhled a chování pomocí vlastností, událostí a doprovodných tříd. V některých případech můžete mít požadavky na buňky, které překračují rámec toho, co tyto funkce můžou poskytovat. Můžete vytvořit vlastní DataGridViewCell třídu, která poskytuje rozšířené funkce.
Vlastní třídu vytvoříte DataGridViewCell odvozením ze DataGridViewCell základní třídy nebo jedné z jejích odvozených tříd. I když můžete v libovolném typu sloupce zobrazit libovolný typ buňky, obvykle vytvoříte také vlastní DataGridViewColumn třídu specializovanou pro zobrazení typu buňky. Třídy sloupců jsou odvozeny z DataGridViewColumn nebo z jednoho z jeho odvozených typů.
V následujícím příkladu kódu vytvoříte vlastní třídu buněk s názvem DataGridViewRolloverCell
, která zjistí, kdy myš vstoupí a opustí hranice buňky. I když je myš v mezích buňky, je nakreslený obdélník sady. Tento nový typ je odvozen od DataGridViewTextBoxCell a chová se ve všech ostatních ohledech jako její základní třída. Doprovodná třída sloupce je volána DataGridViewRolloverColumn
.
Chcete-li tyto třídy použít, vytvořte formulář obsahující DataGridView ovládací prvek, přidejte do kolekce jeden nebo více DataGridViewRolloverColumn
objektů Columns a naplňte ovládací prvek řádky obsahujícími hodnoty.
Poznámka:
Tento příklad nebude fungovat správně, pokud přidáte prázdné řádky. Prázdné řádky se vytvoří například při přidání řádků do ovládacího prvku nastavením RowCount vlastnosti. Důvodem je to, že řádky přidané v tomto případě jsou automaticky sdíleny, což znamená, že DataGridViewRolloverCell
objekty nejsou vytvořena instance, dokud neklepnete na jednotlivé buňky, což způsobí zrušení sdílení přidružených řádků.
Vzhledem k tomu, že tento typ přizpůsobení buňky vyžaduje nesdílené řádky, není vhodný pro použití s velkými datovými sadami. Další informace o sdílení řádků najdete v tématu Osvědčené postupy pro škálování ovládacího prvku model Windows Forms DataGridView.
Poznámka:
Pokud odvozujete DataGridViewCell nebo DataGridViewColumn přidáte nové vlastnosti do odvozené třídy, nezapomeňte přepsat metodu Clone
kopírování nových vlastností během operací klonování. Měli byste také volat metodu základní třídy Clone
tak, aby vlastnosti základní třídy byly zkopírovány do nové buňky nebo sloupce.
Přizpůsobení buněk a sloupců v ovládacím prvku DataGridView
Odvodit novou třídu buňky volanou
DataGridViewRolloverCell
DataGridViewTextBoxCell z typu.public class DataGridViewRolloverCell : DataGridViewTextBoxCell {
Public Class DataGridViewRolloverCell Inherits DataGridViewTextBoxCell
}
End Class
Přepište metodu Paint
DataGridViewRolloverCell
ve třídě. V přepsání nejprve zavolejte implementaci základní třídy, která zpracovává hostované funkce textového pole. Pak pomocí metody ovládacího prvku PointToClient transformujte pozici kurzoru (v souřadnicích obrazovky) na DataGridView souřadnice klientské oblasti. Pokud souřadnice myši spadají do hranic buňky, nakreslete obdélník sady.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); // Retrieve the client location of the mouse pointer. Point cursorPosition = this.DataGridView.PointToClient(Cursor.Position); // If the mouse pointer is over the current cell, draw a custom border. if (cellBounds.Contains(cursorPosition)) { Rectangle newRect = new Rectangle(cellBounds.X + 1, cellBounds.Y + 1, cellBounds.Width - 4, cellBounds.Height - 4); graphics.DrawRectangle(Pens.Red, newRect); } }
Protected Overrides Sub Paint( _ ByVal graphics As Graphics, _ ByVal clipBounds As Rectangle, _ ByVal cellBounds As Rectangle, _ ByVal rowIndex As Integer, _ ByVal elementState As DataGridViewElementStates, _ ByVal value As Object, _ ByVal formattedValue As Object, _ ByVal errorText As String, _ ByVal cellStyle As DataGridViewCellStyle, _ ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _ ByVal paintParts As DataGridViewPaintParts) ' Call the base class method to paint the default cell appearance. MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, _ value, formattedValue, errorText, cellStyle, _ advancedBorderStyle, paintParts) ' Retrieve the client location of the mouse pointer. Dim cursorPosition As Point = _ Me.DataGridView.PointToClient(Cursor.Position) ' If the mouse pointer is over the current cell, draw a custom border. If cellBounds.Contains(cursorPosition) Then Dim newRect As New Rectangle(cellBounds.X + 1, _ cellBounds.Y + 1, cellBounds.Width - 4, _ cellBounds.Height - 4) graphics.DrawRectangle(Pens.Red, newRect) End If End Sub
OnMouseEnter Přepsat a OnMouseLeave metody ve
DataGridViewRolloverCell
třídě vynutit, aby se buňky překreslily při vstupu ukazatele myši nebo opouští je.// Force the cell to repaint itself when the mouse pointer enters it. protected override void OnMouseEnter(int rowIndex) { this.DataGridView.InvalidateCell(this); } // Force the cell to repaint itself when the mouse pointer leaves it. protected override void OnMouseLeave(int rowIndex) { this.DataGridView.InvalidateCell(this); }
' Force the cell to repaint itself when the mouse pointer enters it. Protected Overrides Sub OnMouseEnter(ByVal rowIndex As Integer) Me.DataGridView.InvalidateCell(Me) End Sub ' Force the cell to repaint itself when the mouse pointer leaves it. Protected Overrides Sub OnMouseLeave(ByVal rowIndex As Integer) Me.DataGridView.InvalidateCell(Me) End Sub
Odvodit novou třídu, volanou
DataGridViewRolloverCellColumn
DataGridViewColumn , z typu. V konstruktoru přiřaďte novémuDataGridViewRolloverCell
objektu jeho CellTemplate vlastnost.public class DataGridViewRolloverCellColumn : DataGridViewColumn { public DataGridViewRolloverCellColumn() { this.CellTemplate = new DataGridViewRolloverCell(); } }
Public Class DataGridViewRolloverCellColumn Inherits DataGridViewColumn Public Sub New() Me.CellTemplate = New DataGridViewRolloverCell() End Sub End Class
Příklad
Kompletní příklad kódu obsahuje malý testovací formulář, který ukazuje chování vlastního typu buňky.
using System;
using System.Drawing;
using System.Windows.Forms;
class Form1 : Form
{
[STAThreadAttribute()]
public static void Main()
{
Application.Run(new Form1());
}
public Form1()
{
DataGridView dataGridView1 = new DataGridView();
DataGridViewRolloverCellColumn col =
new DataGridViewRolloverCellColumn();
dataGridView1.Columns.Add(col);
dataGridView1.Rows.Add(new string[] { "" });
dataGridView1.Rows.Add(new string[] { "" });
dataGridView1.Rows.Add(new string[] { "" });
dataGridView1.Rows.Add(new string[] { "" });
this.Controls.Add(dataGridView1);
this.Text = "DataGridView rollover-cell demo";
}
}
public class DataGridViewRolloverCell : DataGridViewTextBoxCell
{
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);
// Retrieve the client location of the mouse pointer.
Point cursorPosition =
this.DataGridView.PointToClient(Cursor.Position);
// If the mouse pointer is over the current cell, draw a custom border.
if (cellBounds.Contains(cursorPosition))
{
Rectangle newRect = new Rectangle(cellBounds.X + 1,
cellBounds.Y + 1, cellBounds.Width - 4,
cellBounds.Height - 4);
graphics.DrawRectangle(Pens.Red, newRect);
}
}
// Force the cell to repaint itself when the mouse pointer enters it.
protected override void OnMouseEnter(int rowIndex)
{
this.DataGridView.InvalidateCell(this);
}
// Force the cell to repaint itself when the mouse pointer leaves it.
protected override void OnMouseLeave(int rowIndex)
{
this.DataGridView.InvalidateCell(this);
}
}
public class DataGridViewRolloverCellColumn : DataGridViewColumn
{
public DataGridViewRolloverCellColumn()
{
this.CellTemplate = new DataGridViewRolloverCell();
}
}
Imports System.Drawing
Imports System.Windows.Forms
Class Form1
Inherits Form
<STAThreadAttribute()> _
Public Shared Sub Main()
Application.Run(New Form1())
End Sub
Public Sub New()
Dim dataGridView1 As New DataGridView()
Dim col As New DataGridViewRolloverCellColumn()
dataGridView1.Columns.Add(col)
dataGridView1.Rows.Add(New String() {""})
dataGridView1.Rows.Add(New String() {""})
dataGridView1.Rows.Add(New String() {""})
dataGridView1.Rows.Add(New String() {""})
Me.Controls.Add(dataGridView1)
Me.Text = "DataGridView rollover-cell demo"
End Sub
End Class
Public Class DataGridViewRolloverCell
Inherits DataGridViewTextBoxCell
Protected Overrides Sub Paint( _
ByVal graphics As Graphics, _
ByVal clipBounds As Rectangle, _
ByVal cellBounds As Rectangle, _
ByVal rowIndex As Integer, _
ByVal elementState As DataGridViewElementStates, _
ByVal value As Object, _
ByVal formattedValue As Object, _
ByVal errorText As String, _
ByVal cellStyle As DataGridViewCellStyle, _
ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _
ByVal paintParts As DataGridViewPaintParts)
' Call the base class method to paint the default cell appearance.
MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, _
value, formattedValue, errorText, cellStyle, _
advancedBorderStyle, paintParts)
' Retrieve the client location of the mouse pointer.
Dim cursorPosition As Point = _
Me.DataGridView.PointToClient(Cursor.Position)
' If the mouse pointer is over the current cell, draw a custom border.
If cellBounds.Contains(cursorPosition) Then
Dim newRect As New Rectangle(cellBounds.X + 1, _
cellBounds.Y + 1, cellBounds.Width - 4, _
cellBounds.Height - 4)
graphics.DrawRectangle(Pens.Red, newRect)
End If
End Sub
' Force the cell to repaint itself when the mouse pointer enters it.
Protected Overrides Sub OnMouseEnter(ByVal rowIndex As Integer)
Me.DataGridView.InvalidateCell(Me)
End Sub
' Force the cell to repaint itself when the mouse pointer leaves it.
Protected Overrides Sub OnMouseLeave(ByVal rowIndex As Integer)
Me.DataGridView.InvalidateCell(Me)
End Sub
End Class
Public Class DataGridViewRolloverCellColumn
Inherits DataGridViewColumn
Public Sub New()
Me.CellTemplate = New DataGridViewRolloverCell()
End Sub
End Class
Probíhá kompilace kódu
Tento příklad vyžaduje:
- Odkazy na sestavení System, System.Windows.Forms a System.Drawing.
Viz také
.NET Desktop feedback
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro