При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Xna.Framework.Graphics;
namespace Application1 { public partial class MainForm : Form { // Объявим поле графического устройства для видимости в методах GraphicsDevice device;
public MainForm() { InitializeComponent();
// Подпишемся на событие Load формы this.Load += new EventHandler(MainForm_Load);
// Попишемся на событие FormClosed формы this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed); }
void MainForm_FormClosed(object sender, FormClosedEventArgs e) { // Удаляем (освобождаем) устройство device.Dispose(); // На всякий случай присваиваем ссылке на устройство значение null device = null; }
void MainForm_Load(object sender, EventArgs e) { // Создаем объект представления для настройки графического устройства PresentationParameters presentParams = new PresentationParameters(); // Настраиваем объект представления через его свойства presentParams.IsFullScreen = false; // Включаем оконный режим presentParams.BackBufferCount = 1; // Включаем задний буфер // для двойной буферизации // Переключение переднего и заднего буферов // должно осуществляться с максимальной эффективностью presentParams.SwapEffect = SwapEffect.Discard; // Устанавливаем размеры заднего буфера по клиентской области окна формы presentParams.BackBufferWidth = this.ClientSize.Width; presentParams.BackBufferHeight = this.ClientSize.Height;
// Создадим графическое устройство с заданными настройками device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.Handle, presentParams); }
protected override void OnPaint(PaintEventArgs e) { device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
base.OnPaint(e); } } } Выбрасывается исключение: Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Работа с файлами и каталогами
Упражнение 6. Простой просмотрщик файлов
Построим диалоговое приложение, позволяющее перемещаться по файловой системе и просматривать характеристики файлов. С оформлением пользовательского интерфейса сильно стараться не будем, а уделим больше внимания функциональности.
- Добавьте к решению командой File/Add/New Project новый проект оконного приложения Windows Forms с именем App6 и назначьте его стартовым
-
В режиме Design выделите форму и установите для нее в панели Properties значения свойств
- Text='Простой просмотрщик файлов', Size/Width=700, Size/Height=300
-
В режиме Design выделите форму и поместите из панели Toolbox дочерний компонент Panel (двойным щелчком на нем, или перетащите курсором). Установите для него в панели Properties значения свойств
- Dock=Top, Size/Height=40
-
Опять выделите саму форму, щелкнув на ее заголовке (или свободном месте клиентской области), поместите еще один дочерний элемент Panel и установите для него свойство
- Dock=Fill
-
Через выпадающий список панели Properties выделите объект panel1, поместите на него дочерний компонент Button и настройте свойства так:
- (Name)=btnUp, Location/X=13, Location/Y=9, Text='Вверх'
-
Снова выделите на форме объект panel1 и добавьте на него текстовую метку Label со свойствами:
- (Name)=lblCurrentDir, AutoSize=True, Location/X=103, Location/Y=12, Text='Текущий каталог: '
- Выделите объект panel2, поместите на него дочерний компонент SplitContainer и сместите у него разделитель влево, чтобы ширина его левой панели ( Panel1 ) была меньше ширины правой ( Panel2 ) и составляла от нее примерно одну четверть
-
Выделите левую панель ( Panel1 ) объекта splitContainer1 и поместите в нее компонент ListBox со свойствами:
- (Name)=listDir, Dock=Fill
-
Выделите правую панель ( Panel2 ) объекта splitContainer1 и поместите в нее компонент DataGridView со свойствами:
- (Name)=gridFile, Dock=Fill, ColumnHeadersHeightSizeMode=AutoSize
На этом разработка пользовательского интерфейса закончена. Остальное, если возникнет необходимость, мы донастроим в процедурном коде, а пока форма будет выглядеть примерно так
- Щелкните правой кнопкой мыши в любом месте на форме и выполните команду контекстного меню View Code, чтобы открыть кодовую часть - файл Form1.cs
- Заполните файл Form1.cs следующим кодом
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace App6 { public partial class Form1 : Form { Panel fileDetails;// Поле, инициализируется неявно нулевым адресом: null public Form1() { InitializeComponent(); // Программные донастройки gridFile.ReadOnly = true; // Только для просмотра gridFile.SelectionMode = DataGridViewSelectionMode.FullRowSelect;// Выделять всю строку // Начальная информация currentPath = Directory.GetCurrentDirectory(); ShowDirectoryContents(currentPath); fileDetails = splitContainer1.Panel2; fileDetails.AutoScroll = true; } String currentPath;// Поле, инициализируется неявно пустой строкой void ShowDirectoryContents(String path) { // Получить объект справки текущего каталога DirectoryInfo curDir = new DirectoryInfo(path); // Получить для текущего каталога // объекты справки файлов и подкаталогов FileInfo[] files = curDir.GetFiles(); DirectoryInfo[] dirs = curDir.GetDirectories(); lblCurrentDir.Text = "Текущий каталог: " + path; // Привязываем к элементам отображения listDir.DataSource = dirs; listDir.DisplayMember = "Name"; // Отображаемый вектор listDir.ValueMember = "Name"; // Скрытый вектор gridFile.DataSource = files; // Показываем все } private void btnUp_Click(object sender, EventArgs e) { // Уже "Мой компьютер" и выше некуда if (currentPath == String.Empty) return; // Хотим подняться выше текущего корня, // поэтому выводим доступные устройства else if (currentPath == Path.GetPathRoot(currentPath)) { System.Collections.ArrayList array = new System.Collections.ArrayList(); DriveInfo[] drives = DriveInfo.GetDrives(); // Фильтруем готовые устройства foreach (DriveInfo drive in drives) { if (drive.IsReady) { String name = drive.Name; name = name.Split('\\')[0];// Убираем слэш array.Add(name); } } listDir.DataSource = array; // Привязываем список доступных устройств gridFile.DataSource = null; // Нет файлов currentPath = String.Empty; // Пути нет lblCurrentDir.Text = "Мой компьютер"; // Меняем заголовок метки return; } // Находимся ниже корня текущего устройства // и есть куда подниматься else { String path = Path.Combine(currentPath, ".."); currentPath = Path.GetFullPath(path); // Этажом выше без '..' ShowDirectoryContents(currentPath); } } private void listDir_DoubleClick(object sender, EventArgs e) { String dir = listDir.SelectedValue.ToString();// Извлекаем из списка currentPath = Path.Combine(currentPath, dir); if (currentPath.IndexOf('\\') == -1) currentPath += "\\"; // Если только что спустились в корень ShowDirectoryContents(currentPath); } private void gridFile_Click(object sender, EventArgs e) { if (gridFile.Rows.Count == 0) return; // Нечего выделять // Локальные переменные инициализировать обязательно, а поля нет int selectIndex = gridFile.CurrentCell.RowIndex; DataGridViewRow row = gridFile.Rows[selectIndex]; DataGridViewCellCollection cells = gridFile.Rows[selectIndex].Cells; String message = ""; // Извлекаем информацию из текущей строки for (int i = 0; i < gridFile.Columns.Count; i++) { String columnName = gridFile.Columns[i].Name; String columnValue = row.Cells[i].Value.ToString(); message += columnName + ": " + columnValue + "\n"; } // Создаем окно и выводим информацию Form frm = new Form(); frm.Width = 500; frm.Height = 320; frm.Text = "Подробности"; // Заголовок окна frm.MinimizeBox = false; // Убираем системные кнопки frm.MaximizeBox = false; // Убираем системные кнопки frm.ShowInTaskbar = false; // Не отображать в панели задач frm.StartPosition = FormStartPosition.CenterParent;// По центру родителя // Промежуточная панель - для скролирования Panel panel = new Panel(); panel.BackColor = System.Drawing.Color.White; panel.Dock = DockStyle.Fill; panel.AutoScroll = true; frm.Controls.Add(panel);// Отдаем окну // Отображающая текстовая метка Label lbl = new Label(); lbl.AutoSize = true; lbl.Parent = panel; // Отдаем панели // panel.Controls.Add(lbl);// Вариант - отдаем панели lbl.Text = message; // Заряжаем дополнительные окна вывода раньше диалога Console.Clear(); Console.Write(message); // !!!!!!!!!!!!!!!!!!!! System.Diagnostics.Debug.Write(message + Environment.NewLine); frm.ShowDialog(); // Показываем окно в модальном режиме } } }
- Запустите приложение - пока оно не реагирует на действия пользователя, поскольку интерфейсные элементы не присоединены к своим обработчикам
- В режиме Design выделите кнопку btnUp, зайдите в панель Properties, щелкните на пиктограмме Events, раскройте список поля для события Click и выберите обработчик btnUp_Click
- Подобным же образом присоедините к событию DoubleClick объекта списка listDir обработчик listDir_DoubleClick, и к событию Click объекта сетки gridFile - обработчик gridFile_Click
- Запустите приложение - при щелчке на строке сетки выбрасывается исключение
Причина в том, что в коде обработчика gridFile_Click делается попытка вывода информации в консольное окно, которое не создано. Если мы не хотим использовать консольное окно, то следует закомментировать или удалить строку
Console.Clear(); Console.Write(message); // !!!!!!!!!!!!!!!!!!!!
Но мы добавим к приложению консольное окно, чтобы вспомнить, как это делается.
- В панели Solution Explorer для узла App6 вызовите контекстное меню и выполните команду Properies
Другой способ - в панели Solution Explorer выделить узел проекта App6 (или любой член проекта App6 ) и выполнить команду главного меню оболочки Project/App6 Properties.
- На вкладке Application окна настроек проекта в выпадающем списке Output type установите значение Console Application
- Запустите и испытайте разработанное приложение
Один из рабочих моментов может выглядеть так
Еще один канал вывода подробностей, предусмотренный нами, - панель Output оболочки.
- Разберитесь с кодом