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?
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.
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;
Enabled
propriété à false
ou
this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;
J'ai résolu ce problème en définissant la propriété Enabled
sur false
.
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);
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);)
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;
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;
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();