webentwicklung-frage-antwort-db.com.de

Wie kann ich die Auswahlmöglichkeit in einer DataGridView deaktivieren?

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?

46

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.

107
edhubbell

Sie können eine transparente Hintergrundfarbe für die ausgewählten Zellen wie folgt festlegen:

DataGridView.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.Transparent;
12
user4101525

Enabled-Eigenschaft zu false

oder

this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;
6
Ramgy Borja

Ich habe dies behoben, indem ich die Enabled-Eigenschaft auf false gesetzt habe.

2
Rick

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);
1
SharpC

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);)

1
Paddy

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;
0
Bengineer

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;
0

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();
0
Jannik Svensson