wtorek, 25 grudnia 2012

70-511 Rozdział 8 - Bindowanie w Windows Forms

Windows Forms także umożliwia bindowanie danych do kontrolek. Mechanizm ten nie jest tak bardzo rozwinięty jak w przypadku WPF, jednak umożliwia obsłużenie najczęstszych scenariuszy.
Omówione zostaną także kontrolki DataGridView (Windows Forms) umożliwiająca wyświetlanie danych tabelarycznych.


Bindowanie proste
Bindowanie to polega na przypisaniu pojedynczemu elementowi wartości z danej kolumny tabeli.
Przykładowe przypisanie
Przykładowe przypisanie wartości kolumny FirstName do kontrolki Label:

Code:
            var customers = new DataService().GetSampleDataTable();
            label1.DataBindings.Add("Text", customers, "FirstName");


Bindowanie złożone
Występuje gdy więcej niż jedna kolumna (np. obiektu DataTable) jest bindowana do więcej niż jednej właściwości kontrolki. Przykładami mogą być tutaj DataGridView wyświetlający całą tabelę, bądź kontrolka List wyświetlająca więcej niż jedną kolumnę. Przykład bindowania do DataGridView w dwóch wersjach: za pomocą BindingSource oraz DataSet:

Code:
            var dataSet = new DataService().GetSampleDataSet();
            //1. Bindowanie do BindingSource
            var bindingSource = new BindingSource(dataSet, "Customers");
            dataGridView1.DataSource = bindingSource;

            //2. Bindowanie do DataSet
            dataGridView1.DataSource = dataSet;
            dataGridView1.DataMember = "Customers";



Nawigacja między rekordami
Dzięki kontrolce BindingNavigator można szybko stworzyć prostą nawigację po rekordach. Wystarczy przeciągnąć tę kontrolkę na formatkę i przypisać źródło danych do właściwości BindingSource:

Code:
bindingNavigator1.BindingSource = customersBindingSource;

Efekt:




DataGridView - Windows Forms
Kontrolka służąca do wyświetlania danych tabelarycznych pobranych najczęściej z bazy danych. Wyżej zostało przedstawione w jaki sposób bindować do niej dane.
DataGridView (w skrócie będę pisać DGV) posiada sześć wbudowanych typów kolumn:
  •  DataGridViewTextBoxColumn - typ wykorzystywany do wyświetlania danych łańcuchowych i numerycznych
  • DataGridViewCheckBoxColumn - wyświetlanie danych logicznych
  • DataGridViewImageColumn - wyświetlanie grafiki
  • DataGridViewButtonColumn - komórka, której zawartością jest przycisk
  • DataGridViewComboBoxColumn - zawiera kontrolkę ListBox 
  • DataGridViewLinkColumn - tworzy linki, np. do innych danych
  • Custom - jeżeli wbudowane typy kolumn nam nie wystarczają, możemy stworzyć naszą poprzez dziedziczenie z klasy DataGridViewColumn
 Podstawowymi operacjami wykonywanymi na kontrolce DGV są: dodawanie kolumn, usuwanie kolumn, pobieranie wartości aktualnie zaznaczonej komórki.
Przykłady tych operacji w C#

Code:
            //1. Dodawanie kolumny
            var firstNameDataColumn = new DataGridViewTextBoxColumn();
            firstNameDataColumn.Name = "FirstName";
            firstNameDataColumn.HeaderText = "Imię";
            firstNameDataColumn.ValueType = typeof (string);
            dataGridView2.Columns.Add(firstNameDataColumn);

            //2. Usuwanie kolumny
            dataGridView2.Columns.Remove("FirstName");

            //3. Informacja o aktualnie wybranej komórce
            var currentSelectedCell = dataGridView2.CurrentCell;
            var dataGridViewColumn = currentSelectedCell.OwningColumn; //Kolumna
            var dataGridViewRow = currentSelectedCell.OwningRow; //Wiersz
            var value = currentSelectedCell.Value; //wartość wybranej komórki

Komórki DGV mogą być edytowane przez użytkownika. Ważna jest więc walidacja danych wprowadzanych przez użytkownika. Walidację przeprowadzamy przez podpięcie się do zdarzenia CellValidating:

Code:
            dataGridView2.CellValidating += (sender, e) =>
                                                {
                                                    //Jeżeli kolumna byłaby zbindowana z źródłem danych wtedy zamaist właściwości Name, sprawdzamy DataPropertyName
                                                    if (dataGridView2.Columns[e.ColumnIndex].Name == "FirstName")
                                                    {
                                                        if (string.IsNullOrWhiteSpace(e.FormattedValue.ToString()))
                                                        {
                                                            dataGridView2.Rows[e.RowIndex].ErrorText =
                                                                "Pole imię musi być uzupełnione";
                                                            e.Cancel = true;
                                                        }
                                                        else
                                                        {
                                                            dataGridView2.Rows[e.RowIndex].ErrorText = null;
                                                        }
                                                    }
                                                };

Ważne jest tutaj, że  w przypadku gdy kolumna była tworzona przez nas (ma podaną nazwę) - używamy właściwości Name, a gdy DGV jest bindowany z obiektem typu DataSet należy skorzystać z właściwości DataPropertyName.


Komórki w których użytkownik błędnie wprowadził dane, zostaną oznaczone czerwoną ikoną wykrzyknika, a dodatkowo jeżeli na niego najedziemy otrzymamy zawartość pola ErrorText. 

Ciekawą opcją jest możliwość nadawania wyglądu poszczególnym komórką. Obsługa polega na przypięciu się do zdarzenia CellPainting i napisaniu odpowiedniej logiki. Przykład:

Code:
            dataGridView1.CellPainting += (sender, e) =>
                                              {
                                                  if (e.Value != null && e.Value.ToString() == "Liu")
                                                  {
                                                      e.Graphics.FillRectangle(Brushes.Aqua ,e.CellBounds);
                                                      e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font, Brushes.Black, e.CellBounds.X, e.CellBounds.Y);
                                                      e.Handled = true;
                                                  }
                                              };




Kod: http://sdrv.ms/UHd8Wi

Brak komentarzy:

Prześlij komentarz