|
При выполнении в лабораторной работе упражнения №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 оболочки.
-
Разберитесь с кодом





