Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 8:

Просмотр данных средствами ADO.NET с привязкой на этапе выполнения

Отбор и сортировка записей с помощью объекта DataView

После загрузки данных в таблицу данных часто возникает необходимость просматривать данные, отбирая их по различным критериям и способу сортировки. Для этой цели может служить объект DataView.

В данном упражнении предусмотрено использовать ряд кнопок, обозначенных всеми буквами латинского алфавита, а также одна кнопка, которая относится ко всем записям. Адаптер данных, таблица данных и представление данных объявлены в коде и срабатывают только на этапе выполнения. Код начальной загрузки данных из базы помещен в обработчик события Load формы.

Вначале мы создадим адаптер данных, который загрузит данные в таблицу данных DataTable. С помощью объекта DataColumn мы заполним раскрывающийся список ComboBox именами всех полей таблицы. После щелчка на любой из алфавитных кнопок будет создаваться объект DataView, его свойству RowFilter будет присвоено соответствующее значение, затем ссылка на выборку данных будет присвоена свойству DataSource элемента DataGrid.

  • Через меню Project/Add Windows Form вызовите мастер добавления формы с именем Form4


  • Поместите на форму элемент управления GroupBox и присвойте его свойству Text значение
Щелкните на любой кнопке
  • Поместите внутрь элемента GroupBox 27 кнопок друг на дружку посредине элемента. Обведите все кнопки курсором и одновременно задайте их общее свойство Size=23, 23. Разместите кнопки внутри клиентской области элемента GroupBox, как показано на снимке


  • Выделите форму и выполните команду Format/Lock Controls, чтобы замкнуть элементы от случайного перемещения.
  • Выделяйте поочереди кнопки и устанавливайте значения их свойств в соответствии с таблицей
Значения свойств алфавитных кнопок
№ п/п Name Text
1 btnA A
2 btnB B
3 btnC C
4 btnD D
5 btnE E
6 btnF F
7 btnG G
8 btnH H
9 btnI I
10 btnJ J
11 btnK K
12 btnL L
13 btnM M
14 btnN N
15 btnO O
16 btnP P
17 btnQ Q
18 btnR R
19 btnS S
20 btnT T
21 btnU U
22 btnV V
23 btnW W
24 btnX X
25 btnY Y
26 btnZ Z
27 btnAll All
  • Введите в форму элементы управления DataGrid, Label, ComboBox со значениями свойств, приведенными в таблице
Значения свойств остальных компонентов
Объект Свойство Значение
DataGrid Name dgCustomers
Label Text Сортировать по столбцу:
ComboBox Name cboSortColumns

Итоговый интерфейс пользователя формы должен выглядеть примерно так


  • В модуле класса для формы введите переменные-члены, которые должны быть видны во всех функциях-членах класса (их удобнее расположить сразу после блока Windows Form Designer generated code )
//..........................................
//Windows Form Designer generated code
private System.Data.OleDb.OleDbDataAdapter odaCust;
private System.Data.DataTable dtCust = new System.Data.DataTable();
private System.Data.DataView dvCust = new System.Data.DataView();
bool flag = false;// Признак, что данные загружены
Листинг 8.11. Переменные-члены класса Form4

Обратите внимание, что мы опять, как и в Form3, предусмотрели булев флаг, чтобы избежать конфликта, когда при загрузке формы автоматически срабатывает событие списка, а данные еще не готовы.

  • Создайте для формы Form4 обработчик события Load, для этого перейдите в режим Design и в панели Properties выполните двойной щелчок на значении поля соответствующего события


  • Заполните обработчик события Load следующим кодом
private void Form4_Load(object sender, System.EventArgs e)
{
  // Сброс надписи проектирования в ComboBox
  cboSortColumns.Text = "";
  
  // Выполнение в защищенном режиме с перехватом исключений
  try
  {
    // Создать адаптер данных
    odaCust = new System.Data.OleDb.OleDbDataAdapter(
      "SELECT * FROM Customers",
      Form1.BuildCnnStr("localhost", "Northwind"));
  
    // Заполнить таблицу данных из адаптера данных
    odaCust.Fill(dtCust);
  
    // Ввести имена полей таблицы в ComboBox,
    // выбрав их из коллекции столбцов,
    // чтобы обеспечить дальнейшую сортировку
    foreach(System.Data.DataColumn dcCurr in dtCust.Columns)
      cboSortColumns.Items.Add(dcCurr.ColumnName);
  
    // Установить начальным поле вывода
    cboSortColumns.SelectedIndex = 0;
  
    // Установить фильтр на начальное отображение данных 
    // по первой кнопке для начального поля вывода
    // A - латинская !!!!!!!!!
    SetDataViewFilter("A"); // Наша функция! - расположена ниже...
  
    flag = true; // Данные загружены!!!  
  }
  catch(System.Data.OleDb.OleDbException oextData)
  {
    // Обработать возникшее исключение
    MessageBox.Show(oextData.Message);
  }
}
    
private void SetDataViewFilter(string strFilterLetter)
{
  // Устанавливает фильтр на отображение данных
  // в элементе управления DataView, начинающихся 
  // с установленного нажитием кнопки символа
  dvCust = dtCust.DefaultView;
  dvCust.RowFilter = "CompanyName LIKE '"
    + strFilterLetter + "%'"; 
  // Здесь % - подстановочный символ, как * в имени групповой операции файлов
  dgCustomers.DataSource = dvCust;
}
Листинг 8.12. Обработчик события Load класса Form4
  • Двойным щелчком на каждой символьной кнопке создайте обработчики, которые заполните таким кодом
private void btnA_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("A"); // A - латинское!!!
}
  
private void btnB_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("B"); // B - латинское!!!    
}
  
private void btnC_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("C"); // C - латинское!!!    
}
  
private void btnD_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("D"); // D - латинское!!!    
}
  
private void btnE_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("E"); // E - латинское!!!    
}
  
private void btnF_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("F"); // F - латинское!!!    
}
  
private void btnG_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("G"); // G - латинское!!!    
}
  
private void btnH_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("H"); // H - латинское!!!    
}
  
private void btnI_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("I"); // I - латинское!!!    
}
  
private void btnJ_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("J"); // J - латинское!!!    
}
  
private void btnK_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("K"); // K - латинское!!!    
}
  
private void btnL_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("L"); // L - латинское!!!    
}
  
private void btnM_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("M"); // M - латинское!!!    
}
  
private void btnN_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("N"); // N - латинское!!!    
}
  
private void btnO_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("O"); // O - латинское!!!    
}
  
private void btnP_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("P"); // P - латинское!!!    
}
  
private void btnQ_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("Q"); // Q - латинское!!!    
}
  
private void btnR_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("R"); // R - латинское!!!    
}
  
private void btnS_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("S"); // S - латинское!!!    
}
  
private void btnT_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("T"); // T - латинское!!!    
}
  
private void btnU_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("U"); // U - латинское!!!    
}
  
private void btnV_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("V"); // V - латинское!!!    
}
  
private void btnW_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("W"); // W - латинское!!!    
}
  
private void btnX_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("X"); // X - латинское!!!    
}
  
private void btnY_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("Y"); // Y - латинское!!!        
}
  
private void btnZ_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter("Z"); // Z - латинское!!!        
}
  
private void btnAll_Click(object sender, System.EventArgs e)
{
  SetDataViewFilter(""); // Пустая строка - выводить все!!!    
}
Листинг 8.13. Обработчики для каждой символьной кнопки формы Form4
  • Установите для выпадающего списка ComboBox способность изменения направления сортировки текущего столбца. Для этого создайте обработчик события SelectedIndexChanged и заполните его следующим кодом


private void cboSortColumns_SelectedIndexChanged(object sender, System.EventArgs e)
{
  if(!flag) return; // Данные еще на подходе!!!
  
  // Проверить, если отмеченный столбец уже сортировался
  // по возрастанию (в том числе по умолчанию), 
  // то отсортировать его по убыванию,
  // иначе отсортировать опять по возрастанию
  if(dvCust.Sort == cboSortColumns.Text)
    dvCust.Sort = cboSortColumns.Text + " DESC";
  else
    dvCust.Sort = cboSortColumns.Text;
}
Листинг 8.14. Код обработчика изменения направления сортировки текущего столбца

Обратите внимание, что при изменении направления сортировки в заголовке каждого столбца элемент DataView выводит маленький треугольник рядом с именем столбца, показывающий своим утолщением направление сортировки. Видать и здесь наши ребята, внедренные к Большому Биллу, приложили свои руки!!! - не могли же они, загнивающие, до такого сами додуматься (у них и коровы в свинарниках по вымя в жиже стоят с голым торсом).

  • Поместите в форму Form0 текстовую метку и кнопку. Текстовую метку в свойстве Text заполните так
Выборка данных с использованием объекта DataView
  • Подстройте параметр Font и TextAlign текстовой метки так, чтобы было красиво.
  • Создайте в форме Form0 обработчик для новой кнопки и заполните его так
private void button4_Click(object sender, System.EventArgs e)
{
  Form4 frm = new Form4();
  frm.Show();
Листинг 8.15. Обработчик для кнопки открытия формы Form4
  • Постройте приложение. Результат для класса Form4 внешне должен выглядеть примерно так

  • Разберитесь в коде и окончательно проверьте функциональность всех форм, заложенную в них нами (продуйте, покрасьте, помойте!)