Porady: dostosowywanie komórek i kolumn w formancie DataGridView (Formularze systemu Windows) przez rozszerzanie ich zachowania i wyglądu
Kontrolka DataGridView udostępnia wiele sposobów dostosowywania wyglądu i zachowania przy użyciu właściwości, zdarzeń i klas towarzyszących. Czasami mogą istnieć wymagania dotyczące komórek, które wykraczają poza możliwości tych funkcji. Możesz utworzyć własną klasę niestandardową DataGridViewCell , aby zapewnić rozszerzone funkcje.
Klasę niestandardową DataGridViewCell można utworzyć, wyprowadzając z klasy bazowej DataGridViewCell lub jednej z jej klas pochodnych. Mimo że można wyświetlić dowolny typ komórki w dowolnej kolumnie, zazwyczaj tworzy się również klasę niestandardową DataGridViewColumn wyspecjalizowaną do wyświetlania typu komórki. Klasy kolumn pochodzą z DataGridViewColumn lub jednego z jego typów pochodnych.
W poniższym przykładzie kodu utworzysz niestandardową klasę komórek o nazwie , DataGridViewRolloverCell
która wykrywa, kiedy mysz wchodzi i opuszcza granice komórek. Gdy mysz znajduje się w granicach komórki, narysowany jest prostokąt zestawu. Ten nowy typ pochodzi z DataGridViewTextBoxCell klasy bazowej i zachowuje się pod innymi względami. Klasa kolumny towarzyszącej nosi nazwę DataGridViewRolloverColumn
.
Aby użyć tych klas, utwórz formularz zawierający kontrolkęDataGridView, dodaj do Columns kolekcji co najmniej jeden DataGridViewRolloverColumn
obiekt i wypełnij kontrolkę wierszami zawierającymi wartości.
Uwaga
Ten przykład nie będzie działać poprawnie, jeśli dodasz puste wiersze. Puste wiersze są tworzone, na przykład podczas dodawania wierszy do kontrolki przez ustawienie RowCount właściwości . Jest to spowodowane tym, że wiersze dodane w tym przypadku są automatycznie udostępniane, co oznacza, że obiekty nie są tworzone do momentu kliknięcia poszczególnych komórek, co powoduje, że DataGridViewRolloverCell
skojarzone wiersze staną się nieudostępnione.
Ponieważ ten typ dostosowywania komórek wymaga nieudostępnianych wierszy, nie jest odpowiedni do użycia z dużymi zestawami danych. Aby uzyskać więcej informacji na temat udostępniania wierszy, zobacz Best Practices for Scaling the Windows Forms DataGridView Control (Najlepsze rozwiązania dotyczące skalowania kontrolki DataGridView formularzy systemu Windows).
Uwaga
Po utworzeniu metody DataGridViewCell lub DataGridViewColumn i dodaniu nowych właściwości do klasy pochodnej pamiętaj, aby zastąpić metodę Clone
, aby skopiować nowe właściwości podczas operacji klonowania. Należy również wywołać metodę klasy Clone
bazowej, aby właściwości klasy bazowej zostały skopiowane do nowej komórki lub kolumny.
Aby dostosować komórki i kolumny w kontrolce DataGridView
Utwórz nową klasę komórek o nazwie
DataGridViewRolloverCell
, z DataGridViewTextBoxCell typu .public class DataGridViewRolloverCell : DataGridViewTextBoxCell {
Public Class DataGridViewRolloverCell Inherits DataGridViewTextBoxCell
}
End Class
Zastąpi metodę Paint
DataGridViewRolloverCell
w klasie . W zastąpieniu najpierw wywołaj implementację klasy bazowej, która obsługuje funkcję hostowanego pola tekstowego. Następnie użyj metody kontrolki PointToClient , aby przekształcić położenie kursora (we współrzędnych ekranu) na DataGridView współrzędne obszaru klienta. Jeśli współrzędne myszy mieszczą się w granicach komórki, narysuj prostokąt zestawu.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
Zastąpij OnMouseEnter metody i OnMouseLeave w
DataGridViewRolloverCell
klasie, aby wymusić przemalowania komórek, gdy wskaźnik myszy przechodzi lub pozostawia 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
Utwórz nową klasę o nazwie
DataGridViewRolloverCellColumn
, z DataGridViewColumn typu . W konstruktorze przypisz nowyDataGridViewRolloverCell
obiekt do jego CellTemplate właściwości.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
Przykład
Kompletny przykład kodu zawiera małą postać testową, która demonstruje zachowanie niestandardowego typu komórki.
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
Kompilowanie kodu
Ten przykład wymaga:
- Odwołania do zestawów System, System.Windows.Forms i System.Drawing.
Zobacz też
- DataGridView
- DataGridViewCell
- DataGridViewColumn
- Dostosowywanie kontrolki DataGridView formularzy Windows Forms
- DataGridView, kontrolka — architektura
- Typy kolumn w kontrolce DataGridView formularzy Windows Forms
- Najlepsze praktyki dotyczące skalowania kontrolki DataGridView formularzy Windows Forms
.NET Desktop feedback
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla