Modification par programme En Mode lecture seule sur DataGridView Lignes
Sans expliquer le contexte, mon problème est essentiellement ceci:
J'ai un datagridview sur un Formulaire Windows, qui est lié à une Entité Cadre DbSet: dbSet<TEntity>.Local.ToBindingList()
.
Si j'ai mis le datagridview est ReadOnly
true à la propriété (en mode création), puis ont cette déclaration dans mon code:
myDataGridView.Rows[rowIndex].ReadOnly = false;
Il suit à droite à travers sans modification de la valeur! (Et non, ma source de données est pas en lecture seule.)
En boucle à travers les cellules de la ligne et la définition de chaque cellule de la propriété ReadOnly individuellement ne fonctionne pas non plus:
foreach (DataGridViewCell cell in myDataGridView.Rows[rowIndex].Cells)
{
cell.ReadOnly = false;
}
.ReadOnly - Gets or sets a value indicating whether the user can edit the cells of the DataGridView control.
Mais il agit comme il ne peut pas ensemble pour une raison quelconque.
Est-il une raison que cela arriverait? Je pensais que peut-être le datagridview est ReadOnly
bien ne perdiez tous les changements apportés à des lignes spécifiques/cellules (ie. le ensemble de la forme doit être en lecture seule ou non), mais apparemment cette travaillé pour quelqu'un...
Il y a d'autres façons d'accomplir mon objectif final, mais je voudrais savoir pourquoi je ne peux pas modifier cette propriété, ce qui serait la solution la plus simple pour ma situation.
EDIT:
Je vais essayer de préciser ma question:
Encore une fois, je suis conscient qu'il existe d'autres façons d'accomplir mon objectif final, mais voudrais une réponse à cette question:
Désolé pour la primitive exemple, mais facilement reproduire le problème, créez une application WinForm, jeter un datagridview sur elle, et passé ce code dans votre projet:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ReadOnly = true;
string[] row1 = new string[] { "test", "test1" };
string[] row2 = new string[] { "test2", "test3" };
string[] row3 = new string[] { "test4", "test5" };
dataGridView1.Columns.Add("1", "1");
dataGridView1.Columns.Add("2", "2");
dataGridView1.Rows.Add(row1);
dataGridView1.Rows.Add(row2);
dataGridView1.Rows.Add(row3);
dataGridView1.Rows[1].ReadOnly = false;
}
}
Si vous mettez un point d'arrêt sur la dernière ligne, et pas à travers elle, vous verrez que la propriété En lecture seule NE change PAS! Pourquoi??
- Lorsque votre code est-derrière le code en cours d'exécution, et quand vous le réglage de la GridView propriété ReadOnly de vrai. Êtes-vous sûr qu'ils sont qui se passe dans le bon ordre?
- J'ai mis le GridView propriété ReadOnly à vrai du point de vue design (pas en cours d'exécution). Et le code est en cours d'exécution sur un événement buttonClick.
- Si l'événement buttonClick est à l'origine d'une publication, droit? Peut-être que si vous définissez le contrôle GridView propriété ReadOnly de vrai dans le PageLoad()?
- Je m'excuse, j'aurais du précisé que je suis en train de travailler avec les WinForms. L'événement buttonClick est l'ajout d'un nouvel élément à la source de données que le contrôle gridview est lié à (pour l'essentiel, par programme de l'ajout d'une ligne). J'ai essayé le réglage de la propriété ReadOnly sur le FormLoad événement, mais il ne semble pas faire une différence soit.
- OK, donc votre liaison de données qui se passe avant ou après vous tentez de définir la propriété sur la cellule?
- Je me dois de préciser que je voulais dire "j'ai essayé de réglage de la propriété ReadOnly
of the datagridview to "true"
sur le FormLoad événement." (puis, plus tard, essayez de définir une ligne à "false") de La liaison de données qui se passe sur le formulaire de création, bien avant que je tente de définir la propriété ReadOnly sur la ligne/cellule - voir ce lien : stackoverflow.com/questions/9268763/...
- Oui, mais vous avez dit que l'événement buttonClick est l'ajout d'un nouvel élément à la source de données, de sorte que la liaison de données est à nouveau en cours, à droite? Ou pas?
- merci pour le lien, on dirait que quelqu'un d'autre a couru dans le même problème.
.BeginEdit
va être mon prochain choix si je ne peux pas obtenir une réponse ici... Il serait viable (mais plus compliqué) de la solution, mais je voudrais vraiment voudrais savoir pourquoi je ne peut pas définir leReadOnly
de la propriété. - J'ai peut être tort, mais comme je suis en utilisant un
[BindingSource](http://msdn.microsoft.com/en-us/library/xxxf124e.aspx)
, je suis sûr que la liaison de données ne permet pas de "se reproduire" quand je ajouter quelque chose à la source de données. Quelqu'un me corrige si je me trompe? - Vous pourriez bien être à droite, James. Je n'ai aucune expérience avec Entity Framework. C'est juste lorsque je regarde en premier. Assurez-vous que votre ajout des données n'est pas la cause de votre ReadOnly réglage sur la cellule pour être remplacé en raison de la ReadOnly réglage sur la grille. Bonne chance!
- bonjour @JamesEkema si vous n'avez pas l'esprit. où avez-vous obtenu ce code
dbSet<TEntity>.Local.ToBindingList()
? parce qu'en fait, par défaut, leDataGridView
les propriétés de la colonne est définie sur false. Pouvez-vous partager vos codes au format réel? 🙂 - ok, j'ai trouvé que vous êtes en utilisant Entity Framework par
DbContext
je suis de droite? - Bonjour, vous avez raison, je suis en utilisant EF avec
DbContext
... désolé si je n'ai pas été bien clair... je ne pense pas que EF a rien à voir avec mon problème tho, j'essayais juste de donner un peu de contexte... ou peut-être il fait? Aussi, je ne suis pas tout à fait sûr de ce que vous entendez parby default the DataGridView column properties is set to false
? - désolé pour ça, je veux dire la
DataGridView Column
par défautreadonly = false
, de toute façon en ce qui concerne votre problème, pouvez-vous partager comment avez-vous l'utiliser?dbSet<TEntity>.Local.ToBindingList()
ou l'ensemble des codes.? - Veuillez voir mon edit: EF n'a rien à voir avec mon problème... (Cependant, pour répondre à votre question,
dbSet<TEntity>.Local.ToBindingList()
est lié à un BindingSource, qui est ensuite lié à mon DataGridView)
Vous devez vous connecter pour publier un commentaire.
J'ai donc trouvé une solution pour ma question, bien que je suis toujours pas sûr de les raisons pour lesquelles...
Apparemment, si vous souhaitez modifier la propriété ReadOnly d'un DataGridView, ligne par ligne, vous ne peut pas définir la principal DataGridView.Propriété en lecture seule, car évidemment, tout cela remplace toutes les modifications ultérieures.
De réutiliser mon exemple précédent, la solution consisterait à boucle sur les lignes et définir chaque LIGNE propriété En lecture seule (par opposition à la définition de la datagridview est propriété ReadOnly), vous pouvez modifier chaque ligne de la propriété ReadOnly individuellement:
C'est génial de travailler pour moi, mais tout de comprendre pourquoi le code dans ma question initiale ne fonctionne pas correctement serait appréciée!