[C#] DataGridView ComboboxColumn dla istniejącego obiektu


(Marcin Obala) #1

Witam

Mam taki problem i mam nadzieje, że ktoś pomoże rozwiązać mi go.

Wczytuje tabelę z bazy stworzonej w SQlite (select * from tabela). Używam DataAdapter. Następnie przy pomocy funkcji fill (dataAdapter.Fill()) wypełniam DataSet (który zawiera jedną tabelę). Następnie do DataTable wczytuje pierwszą(zerową) tabelę z DataSetu (bo przecież i tak jest tylko jedna). Następnie DataTable ustawiam jako DataSource dla DataGridView

SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(CommandText, con);

dataAdapter.Fill(dataset);

DataTable dt = dataset.Tables[0];

dataGridView1.DataSource = dt;

I tutaj pojawia się problem. Chciałbym żeby np. 5 kolumna była kolumną ComboBox. Nie wiem jak w dataGridView "podmienić" jedną kolumnę typu DataGridViewColumn na DataGridViewComboBoxColumn. Przy tworzeniu ręcznym dataGridView można wybrać typ kolumny. Próbowałem zwyczajnie

dataGridView1.Columns[0] = new DataGridViewComboBoxColumn();

Niestety nie działa a o dziwo działa z komórkami czyli

dataGridView1.Rows[0].Cells[0] = new DataGridViewComboBoxCell();

Jednak cała kolumna jest tylko do odczytu.

Próbowałem robić tak że zastąpię wszystkie komórki w danej kolumnie i super działa. Jednak gdy tworze nowy rekord w dataGridView jest on zwykłą komórką bez ComboBox...

Ma ktoś jakiś pomysł?

Mi jedyne co przychodzi do głowy to stworzyć nową kolumnę jako zmienną, nazwać ją tak samo jak pierwotną, wartości z kolejnych wierszy rows_.Cells["Nazwa_Kolumny"] zapisać gdzieś. Zapamiętać pozycję kolumny, usunąć ją, następnie insertem wstawić nową kolumnę z comboboxem w miejsce starej, ustawić dla całej kolumny DataSource na jakąś tablicę którą chcę, i na koniec odtworzyć stan wartości (Value) w poszczególnych wierszach._


(Tomek Matz) #2

Najlepiej w Twoim przypadku będzie jak zapoznasz się z kontrolką BindingSource. Wrzuć ją na formę, a następnie ustaw właściwości tej kontrolki:

  1. DataSource -> Add Project Data Source... -> Database -> DataSet -> i dalej rób co Ci każe kreator ... W ten sposób do projektu dodasz DataSet dla tej swojej bazy danych i jednocześnie ustawisz go jako źródło danych kontrolki BindingSource.

  2. DataMember -> Wybierz z listy nazwę tabeli, którą będziesz wyświetlać w DataGridView (te nazwy tabel są automagicznie odczytane z DataSet-a, którego ustawiłeś jako DataSource tej kontrolki BindingSource)

Następnie wrzuć na formę kontrolkę DataGridView i ustaw właściwość DataSource na nazwę zmiennej typu BindingSource (tej zmiennej, którą przed chwilą utworzyłeś). Użyj do tego celu okna właściwości (menu View -> Properties Window). Po tej czynności zauważysz, że na kontrolce DataGridView pojawiły się nazwy kolumn tabeli. W tym momencie możesz przejść do właściwości Columns kontrolki DataGridView i otworzyć okienko służące do edycji tych kolumn. W tym okienku zaznacz kolumnę, którą chcesz uczynić ComboBox-em i ustaw dla niej następujące właściwości:

ColumnType - wybierz DataGridViewComboBoxColumn

I teraz musisz wybrać, czy chcesz, aby elementy ComboBox-a były wczytywane z bazy danych, czy też były zapisane w programie na sztywno. Jeśli chcesz, aby były zapisane w programie na sztywno, to musisz ustawić właściwość Items i wstawić tam ręcznie wszystkie wartości jakie mogą pojawić się w tej kolumnie (należy je oddzielać za pomocą entera). Jeśli chcesz, aby były wczytywane z bazy danych, to musisz skonfigurować trzy poniższe właściwości:

DataSource - ustaw na ten DataSet utworzony przy okazji ustawiania DataSource dla kontrolki BindingSource

DisplayMember

ValueMember

Aby móc ustawić DisplayMember i ValueMember, to wpierw musisz utworzyć tabelę, która będzie pełnić rolę słownika. Tą tabelę musisz powiązać relacją z tabelą, która wyświetlana jest w DataGridView. Jak to zrobisz to musisz odświeżyć utworzony wcześniej DataSet. W tym celu otwórz okienko Data Sources (z menu Visual Studio wybierz Data -> Show Data Sources), a następnie kliknij prawym przyciskiem myszy na nazwie DataSet-a, który będzie widoczny w tym okienku i wybierz Configure Data Source with Wizard, aby dodać tą nowoutworzoną tabelę do tego DataSet-a.

Jak zrobisz to wszystko opisane powyżej, to w kodzie musisz wczytać do DataSet-a zawartość tabeli, która wyświetlana będzie w DataGridView i tej, która będzie służyć jako DataSource dla ComboBox-a (jeśli takiej tabeli nie ustawiłeś, bo użyłeś właściwości Items, to oczywiście nie musisz jej wczytywać) i to tyle.