web-dev-qa-db-fra.com

Comment désactiver la possibilité de sélectionner dans un DataGridView?

Je souhaite utiliser ma DataGridView uniquement pour afficher des éléments, et je veux que l'utilisateur ne puisse sélectionner aucune ligne, champ ou autre élément de la DataGridView.

Comment puis-je faire ceci?

46
Mahdi Tahsildari

J'irais avec ceci:

private void myDataGridView_SelectionChanged(Object sender, EventArgs e)
{
    dgvSomeDataGridView.ClearSelection();  
}

Je ne suis pas d'accord avec l'affirmation générale selon laquelle aucune DataGridView ne devrait être indélébile. Certaines interfaces utilisateur sont conçues pour des outils ou des écrans tactiles et permettent à une sélection d'induire l'utilisateur en erreur en lui faisant croire que la sélection les acheminera effectivement quelque part. 

La définition de ReadOnly = true sur le contrôle n'a pas d'incidence sur le choix d'une cellule ou d'une ligne. Et il y a des inconvénients visuels et fonctionnels au réglage de Enabled = false.

Une autre option consiste à définir les couleurs sélectionnées par le contrôle pour qu'elles correspondent exactement aux couleurs non sélectionnées. Toutefois, si vous manipulez la couleur de fond de la cellule, cette méthode produit également des résultats désagréables.

107
edhubbell

Vous pouvez définir une couleur d'arrière-plan transparente pour les cellules sélectionnées comme suit:

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

Enabled propriété à false

ou

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

J'ai résolu ce problème en définissant la propriété Enabled sur false.

2
Rick

J'ai trouvé que définir toutes les propriétés AllowUser... sur false, ReadOnly sur true, RowHeadersVisible sur false, ScollBars sur None, puis simuler la prévention de la sélection fonctionnait mieux pour moi. Ne pas définir Enabled sur false permet toujours à l'utilisateur de copier les données de la grille.

Le code suivant nettoie également l'apparence lorsque vous souhaitez une grille d'affichage simple (en supposant que les lignes ont la même hauteur):

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

Cela a fonctionné pour moi comme un charme:

row.DataGridView.Enabled = false;

row.DefaultCellStyle.BackColor = Color.LightGray;

row.DefaultCellStyle.ForeColor = Color.DarkGray;

(où row = DataGridView.NewRow (surcharges appropriées);)

1
Paddy

La réponse de user4101525 était la meilleure en théorie, mais elle ne fonctionne pas réellement. La sélection n’est pas une superposition et vous permet de voir tout ce qui est sous le contrôle.

La réponse de Ramgy Borja ne traite pas du fait que le style par défaut n'est pas du tout une couleur, donc son application n'aide pas ... .. Cela gère le style par défaut et fonctionne si vous appliquez vos propres couleurs (ce qui peut être ce à quoi edhubbell se réfère à des résultats aussi désagréables)

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

Utilisez la propriété DataGridView.ReadOnly

Le code de l'exemple MSDN illustre l'utilisation de cette propriété dans un contrôle DataGridView/ destiné principalement à display. Dans cet exemple, l'aspect visuel du contrôle est personnalisé de plusieurs manières et le contrôle est configuré pour une interactivité limitée.

Observez ces paramètres dans l'exemple de code:

// 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
Angshuman Agarwal

vous devez créer un DataGridView personnalisé

`

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

` Notez que vous devez d’abord compiler le programme une fois avec la classe ajoutée avant de pouvoir utiliser le nouveau contrôle.

ensuite, allez à .Designer.cs et remplacez l'ancien DataGridView par le nouveau sans avoir à vous tromper de code.

private System.Windows.Forms.DataGridView dgv; // found close to the bottom

private void InitializeComponent() {
    ...
    this.dgv = new System.Windows.Forms.DataGridView();
    ...
}

à (respectif)

private System.Windows.Forms.MyDataGridView dgv;

this.dgv = new System.Windows.Forms.MyDataGridView();
0
Jannik Svensson