При работе с таблицей, в которой хранятся картинки вам поможет синхронизатор, способный ослеживать связи между тремя таблицами. С его помощью довольно просто управлять процессом отображения текущей картинки. В сценарии следующего задания отслеживание позиции производится с учетом двух связей между тремя таблицами (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 Reference►COM►Windows 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 ();
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.