2009-05-27 10 views
7

Mam DataGridView, który nie jest ustawiony na ReadOnly. Żadna z jej kolumn nie jest ustawiona na wartość Tylko do odczytu, a obiekt, do którego jest przypisana, nie jest ustawiony na wartość Tylko do odczytu. Jednak nie mogę edytować elementów DataGridView? Właściwość .DataSource DataGridView jest ustawiona na ReadOnlyCollection <>, ale mogę programowo zmieniać elementy, ale nie z interfejsu użytkownika. Co się dzieje?Dlaczego nie mogę edytować wartości w moim DataGridView, mimo że nie jest ustawiony na ReadOnly?

+0

Jak próbujesz edytować elementy? Jakie zachowania uważasz, że powinieneś zobaczyć, czego nie widzisz? – David

Odpowiedz

9

Okazuje się, że jeśli DataGridView jest powiązany z ReadOnlyCollection, nawet jeśli można programowo edytować dowolny element w kolekcji, DataGridView będzie ograniczać możliwość zmiany wartości. Nie jestem pewien, czy to zachowanie jest zamierzone, ale jest czymś, na co trzeba uważać.

+0

Nie można odtworzyć ... zobacz poniżej. Z ReadOnlyCollection <> żadna nie jest edytowalna ... –

+1

Moja zła, okazuje się, że "jedna kolumna, którą można zmienić" faktycznie nie była poprawnie powiązana ze źródłem danych przez cały czas. – GWLlosa

+1

+1 Żałuję, że nie szukałem SO rano. To zajęło mi godziny uderzania głową o ścianę, zanim się zorientowałem. – Rytmis

3

To jest tylko rozszerzony komentarz (stąd wiki) w przeciwieństwie do "DataGridView ograniczy się do zmiany niektórych wartości (ciągi znaków), ale nie innych wartości (boole)" punkt; ani nie można edytować; sprawiają, że List<T> i oba są edytowalne ...:

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

Whoops. Okazuje się, że "jedna edytowalna kolumna" była właściwie literówką w kodzie powiązania danych, tak więc była to "jedyna edytowalna kolumna, która przez cały czas nie była związana ze źródłem danych.". – GWLlosa

2

Jak ty wiążący do DataGridView? Jedna rzecz polega na tym, że jeśli używasz listy Linq jako źródła danych przeszukiwanego z bazy danych i nie masz kompletnego obiektu, to właściwości są tylko do odczytu, chyba że wybierzesz "z nowym" w funkcji wyboru. W Twoim poście nie ma zbyt wielu informacji. Mam nadzieję, że to pomoże.

2

I zainstalowane VS 2013 wczoraj, najnowszy build (update 5) i błąd nadal powoduje, że zachowanie, które opisują.

W skrócie do obejścia błędu, najpierw upewnij się, że datagridview jest ustawiony do edycji GUI. Obejmuje to w szczególności małą strzałkę w projektancie formularzy w prawym górnym rogu formantu. W menu rozwijanym ze strzałką znajduje się opcja "włącz edycję", upewnij się, że jest włączona. Teraz w projektancie formularzy edytuj kolumny w jakiś poważny sposób (np. Dodaj lub usuń kolumnę). To wszystko, kiedy uruchamiasz program, powinieneś znaleźć edycję GUI.

Aby odtworzyć ten błąd, w projektancie formularzy użyj małej strzałki w prawym górnym rogu kontrolki datagridview, aby ustawić opcję "Włącz edycję" na wartość false. Teraz wprowadź istotną zmianę w kolumnach (np. Dodaj lub usuń kolumnę). Skompiluj i uruchom program. Teraz wróć do małej strzałki i ponownie zaznacz pole "włącz edycję". Ponownie uruchom program. W tym momencie błąd przejawia się, a przekonasz się, że datagridview nie jest edytowalny GUI, mimo że w VS skonfigurowano inaczej.

Powiązane problemy