6 votes

Changement du mode de lecture seule des lignes de DataGridView de manière programmée

Sans expliquer tout le contexte, mon problème est essentiellement le suivant:

J'ai un datagridview sur un formulaire Windows qui est lié à un DbSet Entity Framework: dbSet.Local.ToBindingList().

Si je définis la propriété ReadOnly du datagridview sur true (en mode design), et que j'ai ensuite cette instruction dans mon code:

  myDataGridView.Rows[rowIndex].ReadOnly = false;

Il passe directement sans changer la valeur! (Et non, ma source de données n'est pas en lecture seule.)

Parcourir les cellules de la ligne et définir la propriété ReadOnly de chaque cellule individuellement ne fonctionne pas non plus:

  foreach (DataGridViewCell cell in myDataGridView.Rows[rowIndex].Cells)
  {
      cell.ReadOnly = false;
  }

.ReadOnly - Obtient ou définit une valeur indiquant si l'utilisateur peut modifier les cellules du contrôle DataGridView. Mais on dirait qu'il ne peut pas définir pour une raison quelconque.

Y a-t-il une raison pour laquelle cela arriverait? Je pensais peut-être que la propriété ReadOnly du datagridview annulerait les modifications apportées à des lignes/cellules spécifiques (c'est-à-dire que tout le formulaire doit être en lecture seule ou non), mais apparemment cela a fonctionné pour quelqu'un...

Il y a d'autres moyens d'atteindre mon objectif final, mais j'aimerais savoir pourquoi je ne peux pas changer cette propriété, car cela serait la solution la plus simple pour ma situation.


ÉDIT:

Laissez-moi essayer de clarifier ma question:

Encore une fois, je suis conscient qu'il existe d'autres moyens d'atteindre mon objectif final, mais j'aimerais une réponse à ce problème:

Désolé pour l'exemple rudimentaire, mais pour reproduire facilement le problème, créez une application WinForm, ajoutez-y un datagridview, et collez 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 placez un point d'arrêt sur la dernière ligne, et que vous le suivez, vous verrez que la propriété ReadOnly NE CHANGE PAS! Pourquoi??

7voto

sǝɯɐſ Points 2341

J'ai trouvé une solution/une astuce à ma question, bien que je ne sois toujours pas sûr des raisons POURQUOI...

Apparemment, si vous voulez changer la propriété ReadOnly d'une ligne de DataGridView ligne par ligne, vous ne pouvez PAS définir la propriété ReadOnly principale du DataGridView, car cela annule évidemment toute modification ultérieure.

Pour réutiliser mon exemple précédent, la solution consiste à parcourir les lignes et définir la propriété ReadOnly de chaque LIGNE (au lieu de définir la propriété ReadOnly du datagridview), ENSUITE vous pouvez changer individuellement la propriété ReadOnly de chaque ligne :

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

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            row.ReadOnly = true;
        }

        dataGridView1.Rows[1].ReadOnly = false;
    }
}

Cela fonctionne très bien pour moi, cependant, toute explication sur pourquoi le code de ma question initiale ne fonctionne pas correctement serait appréciée!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X