2009-05-27 5 views
7

J'ai un DataGridView, qui n'est pas défini sur ReadOnly. Aucune de ses colonnes n'est définie sur ReadOnly et l'objet auquel elle est liée n'est pas défini sur ReadOnly. Pourtant, je ne peux pas éditer les éléments DataGridView? La propriété .DataSource de DataGridView est définie sur une ReadOnlyCollection <>, mais je peux modifier par programmation les éléments, mais pas à partir de l'interface utilisateur. Que se passe-t-il?Pourquoi ne puis-je pas modifier les valeurs dans mon DataGridView, même s'il n'est pas défini sur ReadOnly?

+0

Comment essayez-vous d'éditer les éléments? Quels sont les comportements que vous pensez que vous devriez voir que vous ne voyez pas? – David

Répondre

9

Il s'avère que si DataGridView est lié à une ReadOnlyCollection, alors même si vous pouvez modifier par programme n'importe quel élément de la collection, DataGridView vous empêchera de modifier les valeurs. Je ne suis pas sûr si ce comportement est intentionnel, mais c'est quelque chose à surveiller.

+0

Impossible de reproduire ... voir ci-dessous. Avec ReadOnlyCollection <> aucun n'est modifiable ... –

+1

Mon mauvais, il s'avère que "la colonne qui peut être changée" n'était pas liée correctement à la source de données tout le long. – GWLlosa

+1

+1 Je regrette de ne pas avoir cherché le matin. Celui-ci m'a pris des heures à me cogner la tête contre le mur avant que je m'en aperçoive. – Rytmis

3

Ceci est juste un commentaire étendu (par conséquent wiki) en opposition à "le DataGridView vous empêchera de changer certaines valeurs (chaînes) mais pas d'autres valeurs (bools)" point; aucun n'est éditable; faire un List<T> et les deux sont modifiables ...:

using System; 
using System.Collections.ObjectModel; 
using System.Windows.Forms; 
class Test 
{ 
    public string Foo { get; set; } 
    public bool Bar { get; set; } 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     var data = new ReadOnlyCollection<Test>(
      new[] { 
       new Test {Foo="abc", Bar=true}, 
       new Test {Foo="def", Bar=false}, 
       new Test {Foo="ghi", Bar=true}, 
       new Test {Foo="jkl", Bar=false}, 
      }); 
     Application.Run(
      new Form { 
       Text = "ReadOnlyCollection test", 
       Controls = { 
        new DataGridView { 
         Dock = DockStyle.Fill, 
         DataSource = data, 
         ReadOnly = false 
        } 
       } 
      }); 
    } 
} 
+0

Oups. Il s'avère que la "colonne modifiable" était en fait une faute de frappe dans le code de liaison de données, il s'agissait donc "de la seule colonne modifiable qui n'était pas liée à la source de données tout le temps". – GWLlosa

2

Comment liez-vous à votre DataGridView? Une chose est que si vous utilisez une liste Linq comme source de données interrogée à partir d'une base de données et que vous n'avez pas l'objet complet, alors les propriétés sont readonly sauf si vous spécifiez "with new" dans la fonction select. Il n'y a pas beaucoup d'informations dans votre message. J'espère que ça aide.

2

J'ai installé VS 2013 plus tard qu'hier, dernière version (mise à jour 5) et un bogue reste qui cause le comportement que vous décrivez.

En bref, pour contourner le bogue, assurez-vous d'abord que la vue datagridview est paramétrable par l'interface graphique. Cela inclut en particulier la petite flèche dans le concepteur de formulaire en haut à droite du contrôle. Dans la flèche déroulante est une option "activer l'édition", assurez-vous qu'il est activé. Maintenant, dans le concepteur de formulaire, modifiez les colonnes de manière importante (par exemple, ajoutez ou supprimez une colonne). Voilà, lorsque vous exécutez le programme, vous devriez trouver que la modification de l'interface graphique fonctionne maintenant.

Pour reproduire ce bogue, dans le concepteur de formulaires, utilisez la petite flèche en haut à droite du contrôle datagridview pour définir "enable editing" sur false. Apportez maintenant une modification majeure aux colonnes (comme ajouter ou supprimer une colonne). Compile et éxecute le programe. Revenez maintenant à la petite flèche et réactivez la case "Activer l'édition". Encore une fois lancer le programme. À ce stade, le bogue se manifeste, et vous constaterez que le datagridview n'est pas modifiable par l'interface graphique, même si vous avez configuré autrement dans le VS.

Questions connexes