2009-07-09 10 views
2

J'ai un WinGroup DataGridView que lorsque je le peupler avec des données, le premier élément est sélectionné par défaut. Je ne veux pas que cela se produise quand un élément est sélectionné lorsqu'un événement se déclenche et que du code est exécuté. Les solutions que j'ai pour cela consistent à unhook-bind-rehook l'événement ou avoir un drapeau qui est changé la première fois que l'événement se déclenche après un nouveau databind. Cependant je me demandais s'il y a quelque chose d'un peu plus élégant.Empêcher un DataGridView de sélectionner le premier élément

Répondre

2

Je n'ai pas une application winforms ouverte à tester, mais je suis curieux de savoir si vous avez une BindingSource intermédiaire entre vos données et le datagridview? Si oui, si vous définissez

List<Data> data = GetMyData(); 
BindingSource myBindingSource = new BindingSource(); 
myBindingSource.DataSource = data; 
myBindingSource.position = -1; 
myGrid.DataSource = myBindingSource; 

Je trouve souvent utile d'intervenir un objet BindingSource entre les données et l'interface utilisateur. Il semble aider à résoudre beaucoup de problèmes aléatoires, bien que je sois plus habitué à utiliser des objets DataTable comme des données plutôt que des objets List <>.

+0

Ma source de liaison est une liste générique <> – jwarzech

+0

Droite, mais vous pouvez toujours intervenir un objet BindingSource - donnez-moi une seconde et je vais mettre à jour la réponse avec ce que je veux dire – Clyde

+0

Cela ne fonctionne pas. Définition de myBindingSource.Position = -1; 'et le relire immédiatement montre 0, pas -1; – styfle

0

Utilisez quelque chose comme l'exemple suivant:

 dataGridView.Columns[0].Selected = false; 
     dataGridView.Rows[0].Selected = false; 
     dataGridView.Rows[0].Cells[0].Selected = false; 

Bien sûr, vérifier s'il y a des lignes, des colonnes, et ainsi de suite. C'est juste un exemple.

2

Qu'en est-(désolé, VB.NET mais je suis sûr que vous pouvez convertir):

myGrid.ClearSelection() 
2

J'ai eu un problème similaire (mais je ne suis pas utiliser l'événement SelectionChanged), et cela fonctionne pour moi:

Dans le constructeur, après la liaison est définie, ajoutez un gestionnaire à l'événement DataBindingComplete:

dgvCommandos.DataSource = systeemCommandos; // = my List<> of objects 
dgvCommandos.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dgvCommandos_DataBindingComplete); 

le gestionnaire:

void dgvCommandos_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    dgvCommandos.ClearSelection(); 
} 

Si vous avez l'intention de sélectionner une ligne (par ex. après l'ajout/l'insertion d'un nouvel objet), il suffit de définir:

dgvCommandos.Rows[insertPos].Selected = true; 

En utilisant comme base, je pense qu'il est possible de gérer d'autres événements pour réagir lors de la sélection de l'utilisateur. J'espère que cela t'aides.

0

assez tard, mais la seule façon que je l'ai eu, je travaille pour moi (beaucoup de TextBoxes, ComboBoxes, etc. lié à mon DataGridView via BindingSource):

Après l'initialisation DataBindings à mes commandes et le chargement des données en DataGridView je devais suspendre la liaison

bindingSource.SuspendBinding(); 

Dans mon événement RowHeaderMouseClick j'ai vérifié si la liaison est suspendue. Si oui, juste reprendre:

if(bindingSource.IsBindingSuspended) 
    bindingSource.ResumeBinding(); 

De cette façon, je peux compléter le chargement et la liaison des données (dans mon cas un BindingList triables), afficher les données à l'utilisateur, mais sans enregistrement sélectionné.

Espérons que cela aide au moins n'importe qui!

Questions connexes