Ich möchte meine DataGridView
nur verwenden, um Dinge anzuzeigen, und ich möchte, dass der Benutzer keine Zeile, Felder oder Elemente aus der DataGridView
auswählen kann.
Wie kann ich das machen?
Ich würde damit gehen:
private void myDataGridView_SelectionChanged(Object sender, EventArgs e)
{
dgvSomeDataGridView.ClearSelection();
}
Ich stimme der weit verbreiteten Behauptung nicht zu, dass keine DataGridView
nicht auswählbar sein sollte. Einige Benutzeroberflächen sind für Werkzeuge oder Touchscreens konzipiert. Wenn Sie eine Auswahl treffen, kann der Benutzer davon ausgehen, dass die Auswahl sie tatsächlich irgendwo bringt.
Die Einstellung von ReadOnly = true
im Steuerelement hat keinen Einfluss darauf, ob eine Zelle oder Zeile ausgewählt werden kann. Und es gibt visuelle und funktionale Nachteile bei der Einstellung von Enabled = false
.
Eine andere Option besteht darin, die ausgewählten Steuerfarben so einzustellen, dass sie genau den nicht ausgewählten Farben entsprechen. Wenn Sie jedoch die Hintergrundfarbe der Zelle manipulieren, führt diese Methode ebenfalls zu unangenehmen Ergebnissen.
Sie können eine transparente Hintergrundfarbe für die ausgewählten Zellen wie folgt festlegen:
DataGridView.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.Transparent;
Enabled
-Eigenschaft zu false
oder
this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;
Ich habe dies behoben, indem ich die Enabled
-Eigenschaft auf false
gesetzt habe.
Ich fand, dass alle AllowUser...
-Eigenschaften auf false
, ReadOnly
auf true
, RowHeadersVisible
auf false
, ScollBars
auf None
gesetzt wurden, dann fälschte die Auswahlverhinderung am besten für mich. Wenn Sie Enabled
nicht auf false
setzen, können Sie die Daten trotzdem aus dem Raster kopieren.
Mit dem folgenden Code wird auch das Aussehen bereinigt, wenn Sie ein einfaches Anzeigegitter wünschen (vorausgesetzt, Zeilen haben dieselbe Höhe):
int width = 0;
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
width += dataGridView1.Columns[i].Width;
}
dataGridView1.Width = width;
dataGridView1.Height = dataGridView1.Rows[0].Height*(dataGridView1.Rows.Count+1);
Das hat für mich wie ein Zauber funktioniert:
row.DataGridView.Enabled = false;
row.DefaultCellStyle.BackColor = Color.LightGray;
row.DefaultCellStyle.ForeColor = Color.DarkGray;
(wobei row = DataGridView.NewRow (entsprechende Überladungen);)
Ich mochte die Antwort von user4101525 in der Theorie am besten, aber sie funktioniert nicht wirklich. Die Auswahl ist keine Überlagerung. Sie sehen also, was immer unter Kontrolle ist
Ramgy Borjas Antwort befasst sich nicht mit der Tatsache, dass der Standardstil eigentlich keine Farbe ist. Dies hilft nicht .. .. Dies behandelt den Standardstil und funktioniert, wenn Sie Ihre eigenen Farben anwenden als böse Ergebnisse)
dgv.RowsDefaultCellStyle.SelectionBackColor = dgv.RowsDefaultCellStyle.BackColor.IsEmpty ? System.Drawing.Color.White : dgv.RowsDefaultCellStyle.BackColor;
dgv.RowsDefaultCellStyle.SelectionForeColor = dgv.RowsDefaultCellStyle.ForeColor.IsEmpty ? System.Drawing.Color.Black : dgv.RowsDefaultCellStyle.ForeColor;
Verwenden Sie die DataGridView.ReadOnly
-Eigenschaft
Der Code im MSDN-Beispiel veranschaulicht die Verwendung dieser Eigenschaft in einem DataGridView
-Steuerelement , das hauptsächlich für die Anzeige gedacht ist. In diesem Beispiel wird das visuelle Erscheinungsbild des Steuerelements auf verschiedene Weise angepasst, und das Steuerelement ist für begrenzte Interaktivität konfiguriert.
Beachten Sie diese Einstellungen im Beispielcode:
// Set property values appropriate for read-only
// display and limited interactivity
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AllowUserToOrderColumns = true;
dataGridView1.ReadOnly = true;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridView1.AllowUserToResizeColumns = false;
dataGridView1.ColumnHeadersHeightSizeMode =
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.RowHeadersWidthSizeMode =
DataGridViewRowHeadersWidthSizeMode.DisableResizing;
sie müssen eine benutzerdefinierte DataGridView erstellen
`
namespace System.Windows.Forms
{
class MyDataGridView : DataGridView
{
public bool PreventUserClick = false;
public MyDataGridView()
{
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (PreventUserClick) return;
base.OnMouseDown(e);
}
}
}
` Beachten Sie, dass Sie das Programm zuerst einmal mit der hinzugefügten Klasse kompilieren müssen, bevor Sie das neue Steuerelement verwenden können.
gehen Sie dann zu The .Designer.cs und ändern Sie die alte DataGridView in die neue, ohne dass Sie den vorherigen Code durcheinander bringen müssen.
private System.Windows.Forms.DataGridView dgv; // found close to the bottom
…
private void InitializeComponent() {
...
this.dgv = new System.Windows.Forms.DataGridView();
...
}
zu (jeweils)
private System.Windows.Forms.MyDataGridView dgv;
this.dgv = new System.Windows.Forms.MyDataGridView();