ADO.NET. Управление базами данных. Связь по схеме OLE DB провайдера. Коррекция стилей DataGridView, страница 52

При работе с таблицей, в которой хранятся картинки вам поможет синхронизатор, способный ослеживать связи между тремя таблицами. С его помощью довольно просто управлять процессом отображения текущей картинки. В сценарии следующего задания отслеживание позиции производится с учетом двух связей между тремя таблицами (Clients®ClientsToProjects®Projects®ProjectsToTasks®Tasks).

·  Clients—имя первой (главной) таблицы,

·  Projects—имя второй (связанной с первой) таблицы,

·  Tasks—имя третьей (связанной со второй) таблицы,

·  ClientsToProjects—имя первой связи,

·  ProjectsToTasks—имя второй связи.

В этом сценарии для слежения за позицией (текущей строкой) третьей таблицы целесообразно использовать такой синхронизатор:

 CurrencyManager cmTasks; // Объявляем в классе формы

string relation = "Clients.ClientsToProjects.ProjectsToTasks"; // Здесь секрет таланта синхронизатора

cmTasks = gridTask.BindingContext[ds, relation] as CurrencyManager; // Инициализируем синхронизатор

Синхронизатор cmTasks (не вновь созданный с помощью операции new, а добытый из недр .NET Framework — контекста связей gridTask) следит за позицией текущей строки в третьей (связанной со второй) таблице Tasks. Важно то, что он автоматически следит за перемещениями во всех трех DataGridView.

Вариант решения

Приведу еще один вариант решения этого задания (Он предложен и выполнен одним из наших студентов: Константином Никуленковым). На рисунке вы видите несколько другую (мою) версию его решения. Она пользуется другой базой данных (с джазовой, а не Hard Rock музыкой) и другой версией компонента типа MediaPlayer.

В правом нижнем углу вы видите компонент типа AxWindowsMediaPlayer. Его декларация имеет такой вид:

AxWMPLib.AxWindowsMediaPlayer player;

В данный момент он проигрывает композицию Wednesday_Night_Prayer_Meeting, связанную с диском Blues & Roots, связанным с исполнителем: Charles Mingus.

ИсполнительДискКомпозиция — это имена связанных между собой таблиц базы данных. Последняя таблица может непосредственно содержать двоичные данные (копию файла .mp3). В другом подходе она может содержать лишь строковую ссылку на файл типа .mp3 (сам же файл с музыкой расположен где-то на вашем жестком диске). Я выбрал второй способ, так как база с .mp3-content'ом получается слишком объемной. Для тех, кто захочет создать нечто подобное, дам подсказки, которые помогут пользоваться компонентом AxWindowsMediaPlayer.

·  Найдите сам компонент. Он должен быть в папке WINDOWS\system32 и называться wmp.dll.

·  Добавьте в вашем проекте ссылку на этот компонент: Add ReferenceCOMWindows Media Player.

В моей системе эта ссылка опирается на компонент, зарегистрированный в реестре по адресу (ключу):

   (HKEY_CLASSES_ROOT\CLSID\{6BF52A52-394A-11d3-B153-00C04F79FAA6})

Имя (свойство Name) ссылки образовалось автоматически: AxInterop.WMPLib

·  Добавьте этот компонент на Toolbox (команда менюChoose Items→COM→Windows Media Player).

·  Перетащите компонент на форму. Замените имя (заданное по умолчанию) на player.

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

string playerPath;

AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler playHandler;

playHandler =

  new AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler (player_PlayStateChange);

player.URL = path + @"\Media\Windows XP Startup.wav"; // Цель: показать, что он живой

player.Ctlcontrols.play ();

if (playerPath == null)

  FindAudioFile ();            // Этот метод надо разработать

player.URL = playerPath;  // Играть то, что мы хотим

player.PlayStateChange -= playHandler; // Otherwise we will get infinite recursion:

player.URL = playerPath;

player.PlayStateChange -= playHandler; // We need only 1 delegate

player.PlayStateChange += playHandler; // Start watching events

if (player.playState == WMPLib.WMPPlayState.wmppsPlaying) // Остановить

  player.Ctlcontrols.pause ();