РAЗДЕЛ 5. WEB-ПРОГРАММИРОВАНИЕ В NET(Расширенные возможности)
ЛЕКЦИЯ 8. СОЗДАНИЕ ASP.NET-СЦЕНАРИЕВ
предыдущий_раздел следующий_раздел следующая_лекция
предыдущая лекция
Список лекций
Создадим заготовку приложения WEB ASP (см.рис.8.1)
Рис.8.1
Вручную напишем следующий код Web-страницы:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="web2._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body bgcolor=#aabbcc>
<center>
<h2>
<font color=red>
LESSON 1</font>
<hr width=800 />
</h2>
</center>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
Этот код набираем в окне Source (Рис.8.2)
Рис.8.2
Откроем этот документ в броузере через Run – Run Without debugging
Броузер отобразит созданное окно на рис 8.3.
Рис.8.3
Теперь добавим в сайт пользовательский элемент управления, вызвав контекстное меню щелчком правой кнопкт мыши на элементе web2 (название проекта) и выбра пункт Add- New Item- Web user control:
Рис.8.4
В поле Name введем myuserctrl1.
Система отобразит следующее окно
с текстом
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="myctrl1.ascx.cs" Inherits="web2.myctrl1" %>
Расширим этот текст следующим образом:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="myctrl1.ascx.cs" Inherits="web2.myctrl1" %>
<table cellspacing="4">
<tr valign=middle>
<td>
<asp:Image runat="server" ID="suitPic" ImageUrl="e:\work\toad1.bmp" />
</td>
<td>
<asp:Label runat="server" ID="suitLabel">
To do something
</asp:Label></td>
</tr>
</table>
После этого с помощью мыши перетащим данный элемент на форму (рис.8.5):
Рис.8.5
Система создаст следующий код в основном документе – default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="web2._Default" %>
<%@ Register src="myctrl1.ascx" tagname="myctrl1" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body bgcolor=#aabbcc>
<form id="form1" runat="server">
<center>
<h2>
<font color=red>
LESSON 1</font>
<hr width="800" />
</h2>
</center>
<div>
<uc1:myctrl1 ID="myctrl11" runat="server" />
</div>
</form>
</body>
</html>
Оттестируем приложение:
Рис.8.6
Теперь надо придать нашему элементу некоторую функциональность. Сначала добавим список радиокнопок:
Исходный текст документа претерпит следующие изменения:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="web2._Default" %>
<%@ Register src="myctrl1.ascx" tagname="myctrl1" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body bgcolor=#aabbcc>
<form id="form1" runat="server">
<center>
<h2>
<font color=red>
LESSON 1</font>
<hr width="800" />
</h2>
</center>
<div>
<uc1:myctrl1 ID="myctrl11" runat="server" />
<asp:RadioButtonList runat="server" ID="suitList" AutoPostBack="true">
<asp:ListItem Value="e:\work\toad1.bmp" Selected="True">TOAD1</asp:ListItem>
<asp:ListItem Value="e:\work\toad2.bmp" >TOAD2</asp:ListItem>
</asp:RadioButtonList>
</div>
</form>
</body>
</html>
Для написания кода реакции на радиокнопку щелкним по радиокнопке дважды. Откроется следующий редактор
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace web2
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void suitList_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}
Нас интересует событие SelectedIndexChanged. Чтобы это событие обработать, мы расширяем определение класса нашего элемента myCtrl:
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace web2
{
public partial class myctrl1 : System.Web.UI.UserControl
{
protected string currentpic = @"e:\work\toad1.bmp";
public string Suit
{
get
{
return currentpic;
}
set
{
currentpic = value;
suitLabel.Text = value;
suitPic.ImageUrl = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
Теперь нетрудно запрограммировать и сам обработчик события web2.default.aspx.cs:
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace web2
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void suitList_SelectedIndexChanged(object sender, EventArgs e)
{
myctrl11.Suit = (string) suitList.SelectedItem.Value.ToString();
}
}
}
Тем самым мы добавили в сайт собственный элемент и запрограммировали его обработку.
ЛЕКЦИЯ 9. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ AJAX В ASP.NET
предыдущий_раздел следующий_раздел следующая_лекция
предыдущая лекция
Список лекций
Создадим Web-проект, как описано в предыдущей лекции и вставим в него элементы управления AJAX. Текст оазрабатываемой нами страницы сделаем таким:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PCSAjaxWebApp1._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<h1>
LESSON OF ASP.NET AJAX
</h1>
<br />
Maximum:
<asp:TextBox runat="server" ID="MaxValue" Text="2500" />
<br />
Result:
<asp:UpdatePanel runat="server" ID="ResultPanel">
<ContentTemplate>
<asp:Button runat="server" ID="GoButton" Text="Calculate" />
<br />
<asp:Label runat="server" ID="ResultrLabel"/>
<br />
<small>
Panel render Time=<%=DateTime.Now.ToString() %>
</small>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress runat="server" ID="UpdateProgress1">
<ProgressTemplate>
<div style="position:absolute;left:100px;top:200px;padding:40px 60px 40px 60px;background-color:lightyellow;
font-size:larger;filter:alpha(opacity=80);">
Updating ....
</div>
</ProgressTemplate>
</asp:UpdateProgress>
<small>Page render Time2=<% =DateTime.Now.ToString() %></small>
</div>
</form>
</body>
</html>
Запустим это приложение и получим следующий скриншот (рис.9.1)
Рис. 9.1
Обратим предварительно внимание на то, что две строки времени дают одинаковое значение. Напишем обработчик кнопки Calculate:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace PCSAjaxWebApp1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void GoButton_Click(object sender, EventArgs e)
{
int maxValue = 0;
System.Text.StringBuilder resultText = new System.Text.StringBuilder();
if (int.TryParse(MaxValue.Text, out maxValue))
{
for (int trial = 2; trial < maxValue; trial++)
{
bool isPrime = true;
for (int divisor = 2; divisor <= Math.Sqrt(trial); divisor++)
{
if (trial % divisor == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
resultText.AppendFormat("{0}, ", trial);
}
}
}
else
{
resultText.Append("Unable to parse maximum value");
}
ResultrLabel.Text=resultText.ToString();
}
}
}
Теперь результат работы прораммы будет таким (рис 9.2)
Рис.9.2
Мы видим, что времена в двух нижних строках не совпадают. Теперь об AJAX. Мы добавляем функциональность AJAX с помощью тега
<asp:ScriptManager ID="ScriptManager1" runat="server" />.
Кроме того, мы включаем динамические элементы управления AJAX вроде
<asp:UpdatePanel runat="server" ID="ResultPanel">
или
<asp:UpdateProgress runat="server" ID="UpdateProgress1">.
При взаимодействии WEB-клиента и WEB-сервера страница WEB клиента может быть динамически изменена после передачи соответствующего запроса на сервер и получения ответа.
AJAX позволяет обновлять содержимое части страницы (клиента) динамически .
Элемент
<asp:UpdatePanel runat="server" ID="ResultPanel">
и определяет динамически обновляемую часть WEB-страницы. Эта часть обычно вставляется в тег <div>, следующий после <ContentTemplate>.
Можно вставить собственные элементы управления Ajax в проект С#. для этого следует скачать из интернета соответствующую библиотеку. Вот как это сделать.
Скачайте AJAX Toolkit .NET 4 “Apr 12 2010” по ссылке: http://ajaxcontroltoolkit.codeplex.com/releases/view/43475#DownloadId=116534, Once downloaded,
Распакуйте архивный файл AjaxControlToolkit.Binary.NET4 , а также архивную папку AjaxControlToolkitSampleSite на какую-нибудь вашу папку.
В среде Visual Studio откройте окно ToolBox, нажмите правой кнопокй мыши на свободном месте и выберите
Add Tab. Назовите новый таб типа ajaxControls.
Нажмите правой кнопкой мыши внизу созданного таба и выберите Choose Items:
Выберите папку NET и нажмите кнопку Browse. Найдите каталог с распакованными вами файлами и нажмите Add:
Теперь вы можете работать с элементами управления Ajax. Вставьте в окно элемент ComboBox и задайте его содержимое
Программа создаст следующий код:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AJAX2WEB._Default" %>
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="asp" %>
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit.HTMLEditor" tagprefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<h1>
LESSON 2 OF ASP.NET AJAX
</h1>
<br />
<span style="display:inline; padding:2px;">
My favorite color is:
</span>
<br />
<asp:Panel runat="server" ID="ResultPanel" Height="16px" Width="146px">
<asp:ComboBox ID="ComboBox1" runat="server">
<asp:ListItem Selected="True">red</asp:ListItem>
<asp:ListItem>green</asp:ListItem>
</asp:ComboBox>
</asp:Panel>
</div>
</form>
Запустите его на выполнение:
Напишем простой обработчик события изменения содержимого комбосписка.
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
namespace AJAX2WEB
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Color red,yellow;
red=Color.Coral;
yellow=Color.Yellow;
if (ComboBox1.Items[ComboBox1.SelectedIndex].Value.ToString() == "red")
ComboBox1.BackColor = red;
else
ComboBox1.BackColor = yellow;
}
}
}
Теперь при выборе из списка цвет комбобокса изменяется согласно выбранному элементу.
ЛЕКЦИЯ 10. WEB-СЕРВИСЫ
предыдущий_раздел следующий_раздел следующая_лекция
предыдущая лекция
Список лекций
Отличие WEB-сервисов от ASP.NET-приложений состоит в том, что WEB-сервисы используют компоненты COM, а не скрипты. Таким образом, можно включить в приложение класс, объявленный в компоненте COM, и использовать его методы. Создание WEB-сервиса производится на основе конфигурационных файлов XML. Рассмотрим простой пример. Предполагается, что сервер IIS запущен.
1. Выберем File-> New Project -> ASP.NET Web Service
2. Выберем закладку, соответствующую файлу .cs. Из меню выберем View Code по щелчку правой кнопкой мыши. При этом откроется окно редактора кода:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace WebService2
{
/// <summary>
/// Summary description for Service1.
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
//CODEGEN: This call is required by the ASP.NET Web Services Designer
InitializeComponent();
}
#region Component Designer generated code
//Required by the Web Services Designer
private IContainer components = null;
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
// WEB SERVICE EXAMPLE
// The HelloWorld() example service returns the string Hello World
// To build, uncomment the following lines then save and build the project
// To test this web service, press F5
// [WebMethod]
// public string HelloWorld()
// {
// return "Hello World";
// }
}
}
Откроем комментарии (//), начиная со строки [WebMethod].
3.Запустим этот Web-сервис на выполнение (<CTRL>+F5). Откроется окно, показанное на рис.10.1
Рис.10.1
4.Перейдем по гиперссылке HelloWorld.
5.В окне 10.2 увидим результат. При нажатии на кнопку Invoke получим результат в форме XML-документа.
Рис.10.2
Реализуем более сложный вариант сервиса. Именно, пусть web-сервис возвращает строку, переданную клиентом. Изменим несколько текст нашего сервиса
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace WebService2
{
/// <summary>
/// Summary description for Service1.
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
//CODEGEN: This call is required by the ASP.NET Web Services Designer
InitializeComponent();
}
#region Component Designer generated code
//Required by the Web Services Designer
private IContainer components = null;
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
// WEB SERVICE EXAMPLE
// The HelloWorld() example service returns the string Hello World
// To build, uncomment the following lines then save and build the //project
// To test this web service, press F5
[WebMethod]
public string HelloWorld(String s)
{
return ("Received "+s);
}
}
}
Видим, что в метод HelloWorld передается в качестве параметра текстовая строка. Эта строка возвращается методом. Скомпилируем сервис с помощью комбинации клавиш <Ctrl>+F5. Теперь создадим обычное приложение на основе формы (Рис.10.3).
Рис.10.3
На этом рисунке показан результат обращения к сервису по нажатию на кнопку. Наше Windows-приложение имеет следующий вид.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using WindowsAppWithService.localhost;
namespace WindowsAppWithService
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.BackColor = System.Drawing.Color.FromArgb(((System.Byte)(255)), ((System.Byte)(192)), ((System.Byte)(192)));
this.button1.Location = new System.Drawing.Point(312, 32);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(136, 24);
this.button1.TabIndex = 0;
this.button1.Text = "CallService";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.BackColor = System.Drawing.Color.FromArgb(((System.Byte)(192)), ((System.Byte)(255)), ((System.Byte)(192)));
this.ClientSize = new System.Drawing.Size(480, 373);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
Service1 ser=new localhost.Service1();
String s=ser.HelloWorld("Spring Now!!!");
MessageBox.Show(s);
}
}
}
В это приложение необходимо добавить ссылку (reference) на метод HelloWorld построенного сервиса. Для добавления ссылки в окне Solution Explorer активизируем контекстное меню на элементе References и выберем п. Add Web Reference. Затем в новом окне выберем пункт Web Services On Local Machine. Затем появится новое окно (Рис.10.4), в котором выберем имя нашего сервиса и нажмем кнопку Add Referernce. После этого правомочно адресоваться к классу Service1 в программе обработки события от кнопки:
private void button1_Click(object sender, System.EventArgs e)
{
Service1 ser=new localhost.Service1();
String s=ser.HelloWorld("Spring Now!!!");
MessageBox.Show(s);
}
}
Рис.10.4
ЛЕКЦИЯ 11. РАЗРАБОТКА ОФИСНЫХ БИЗНЕС-ПРИЛОЖЕНИЙ
предыдущий_раздел следующий_раздел следующая_лекция
предыдущая лекция
Список лекций
Вызов Word и Excel из C#
Для работы с пакетом MS OFFICE нужно подключить соответствующие классы. Начнем рассмотрение с работы с EXCEL. Создадим приложение на основе шаблона Windows Application и добавим ссылку на объект ExcelObjectLibrary. Для этого в окне Solution Explorer выберем п.Add Reference из контекстного меню, затем выберем закладку COM и в списке найдем элемент MicroSoft Excel Object Library. Разместим на форме пять кнопок и текстовое поле.
Запрограммируем первую кнопку таким образом.
private void button1_Click(object sender, System.EventArgs e)
{
Excel._Application obEx;
this.Activate();
obEx=(Excel._Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
MessageBox.Show(obEx.ActiveWorkbook.Name);
obEx=null;
}
Обеспечим, чтобы при запуске программы предварительно было развернуто приложение EXCEL (иначе возникает исключение). Приведенный код просто выводит имя активной книги Excel.
Вторую кнопку запрограммируем следующим образом:
private void button2_Click(object sender, System.EventArgs e)
{
Excel.Worksheet xlsheet;
Excel.Workbook xlwrkbook;
xlwrkbook = (Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(textBox1.Text);
xlsheet=(Excel.Worksheet)xlwrkbook.ActiveSheet;
string sFile=textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\")+1);
xlwrkbook.Application.Windows[sFile].Visible=true;
xlwrkbook.Application.Visible=true;
xlsheet.Cells[1,1]=100;
}
}
}
Снова предполагается, что при запуске приложения открыт Excel. Теперь в текстовом поле следует ввести имя Excel-файла. Это имя в программе извлекается в переменную sFile:
sFile=textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\")+1);
Затем открывается данный документ и в ячейку Cells[1,1] записывается число 100.
Третью кнопку запрограммируем для вызова документа Word.
private void button3_Click(object sender, System.EventArgs e)
{
Word.Application wd;
this.Activate();
MessageBox.Show("Launching Word");
wd=(Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
MessageBox.Show(wd.Name);
wd=null;
}
Третью кнопку программируем аналогично первой. Однако теперь нужно подключить в список ссылок библиотеку Word. Добавим ссылку на объект WordObjectLibrary. Для этого в окне Solution Explorer выберем п.Add Reference из контекстного меню, затем выберем закладку COM и в списке найдем элемент MicroSoft Word Object Library.
Предполагается, что Word запущен перед тем, как нажата кнопка 3. Однако, Word можно запустить и программно, для чего перепрограммируем кнопку 3 следующим образом:
private void button3_Click(object sender, System.EventArgs e)
{
System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office\WinWord.Exe");
Word.Application wd;
this.Activate();
MessageBox.Show("Launching Word");
wd=(Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
MessageBox.Show(wd.Name);
wd=null;
}
}
Попутно заметим, что можно выполнить исполняемый файл с помощью команды
System.Diagnostics.Process.Start(путькфайлу);
Четвертая кнопка позволит выбрать из файлового диалога файл с документом Word и открыть его. При этом не требуется, чтобы Word был предварительно запущен. Документ Word, подлежащий открытию, выбирается из окна файлового диалога в строке:
Word.Document wdoc=wd.Documents.Open(ref filename,…
В открытом документе можно производить любые изменения.
private void button4_Click(object sender, System.EventArgs e)
{
if(this.openFileDialog1.ShowDialog()==DialogResult.OK)
{
object filename=openFileDialog1.FileName;
object readOnly=false;
object isVisible=true;
object missing=System.Reflection.Missing.Value;
Word.ApplicationClass wd=
new Word.ApplicationClass();
wd.Visible=true;
Word.Document wdoc=wd.Documents.Open(ref filename,
ref missing,ref missing, ref missing,
ref missing,ref missing,
ref missing, ref missing,
ref missing,
ref readOnly,ref missing,
ref isVisible);
wdoc.Activate();
}
}
ЛЕКЦИЯ 12. ОСНОВЫ WINDOWS PRESENTATION FOUNDATION.
предыдущая лекция
Список лекций
Windows Presentation Foundation (WPF) – новая технологгия для создания приложений на основе графического интерфейса. Код приложения параллельно создается в файле XAML (eXtended Application Markup Languge). Этот язык используется также в SilverLight, WFC. Чтобы быстро войти в курс этой технологии, создадим простое приложение [11]. Создадим новый проект в NET 2008(2010) – Windows – WPF Application – (имя проекта). Система создаст следующую заготовку (рис.12.1)
Рис.12.1
В нижнем окне мы видим код XAML. Он такой:
<Window x:Class="my1wpf.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
</Grid>
</Window>
Этот кодж представляет заготовку. Он напоминает язык xml. Тэги описывают элементы, размещаемые в окне. Первоначально мы разместим в окне панель (DockPanel), а на ней элементы меню. Текст XAML такой
<Window x:Class="my1wpf.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<DockPanel Name="dp1" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto">
<MenuItem Header="_Cut"/>
<MenuItem Header="_Paste"/>
<MenuItem Header="_Exit" />
</Menu>
</DockPanel>
</Window>
Теперь окно принимает следующий вид:
Рис.12.2
Напомним, что запуск программы можно реализовать через меню Debug -> Start Debugging.
Далее добавим текстовое поле:
<Window x:Class="my1wpf.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<DockPanel Name="dp1" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto">
<MenuItem Header="_Cut"/>
<MenuItem Header="_Paste"/>
<MenuItem Header="_Exit" />
</Menu>
<TextBox AcceptsReturn="True" SpellCheck.IsEnabled="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Name="txt1"
/>
</DockPanel>
</Window>
Теперь мы уже можем набирать текст в текстовом поле (рис.12.3)
Рис.12.3
Последнее, что мы сделаем по части отображения визуальных элементов – добавим кнопку:
<Window x:Class="wpf2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<DockPanel Name="dp1" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto" Name="menu1" Width="Auto">
<MenuItem Header="_Cut" Command="Cut"/>
<MenuItem Header="_Paste" Command="Paste"/>
</Menu>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<Button Name="btn" Content="Exit" Background="Coral" Click="myClick">
</Button>
</ToolBar>
</ToolBarTray>
<TextBox AcceptsReturn="True"
SpellCheck.IsEnabled="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Name="txt1">
</TextBox>
</DockPanel>
</Window>
Окно приложения примет такой вид
Рис.12.4
Нам следует запрограммировать реакцию на элементы меню и кнопку. Реакция может описываться стандартными действия и нестандартными (действиями, предложенными пользователями). Действия для элементов меню задаются в параметрах Command:
<MenuItem Header="_Paste" Command="Paste"/>
Для кнопки действие задается в параметре Click:
<Button Name="btn" Content="Exit" Background="Coral"
Click="myClick">
Стандартные действия программировать не надо. Чтобы запрограммировать событие от кнопки просто щелкнем на ней дважды в режиме редактирования и введем код на языке C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace wpf2
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
btn.Click+=new RoutedEventHandler(myClick);
}
private void myClick(object sender, RoutedEventArgs e)
{
Application.Current.Shutdown();
}
}
}
Здесь в качестве обработчика события для кнопки закреплент метод myClick. Аналогичным образом поступаем и для меню. В результате получим следующий окончательный вариант:
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
if (sender.Equals(mit3))
Application.Current.Shutdown();
}
}
}
<Window x:Class="wpf2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<DockPanel Name="dp1" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto" Name="menu1" Width="Auto">
<MenuItem Name="mit1" Header="_Cut" Command="Cut"/>
<MenuItem Name="mit2" Header="_Paste" Command="Paste"/>
<MenuItem Name="mit3" Header="_Exit" Click="MenuItem_Click" />
</Menu>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<Button Name="btn" Content="Exit" Background="Coral" Click="myClick">
</Button>
</ToolBar>
</ToolBarTray>
<TextBox AcceptsReturn="True"
SpellCheck.IsEnabled="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Name="txt1">
</TextBox>
</DockPanel>
</Window>
Можно несколько изменить свойства элементов, например кнопки, сделав ее представление следующим
Рис.12.5
Это представление достигается следующим текстом:
<Window x:Class="wpf2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<DockPanel Name="dp1" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Menu DockPanel.Dock="Top" Height="Auto" Name="menu1" Width="Auto">
<MenuItem Name="mit1" Header="_Cut" Command="Cut"/>
<MenuItem Name="mit2" Header="_Paste" Command="Paste"/>
<MenuItem Name="mit3" Header="_Exit" Click="MenuItem_Click" />
</Menu>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<Border BorderBrush="Blue" Width="250">
<Button Name="btn" Content="Exit" Background="Coral"
Foreground="Brown"
FontSize="12"
FontWeight="Bold"
Click="myClick">
</Button>
</Border>
</ToolBar>
</ToolBarTray>
<TextBox AcceptsReturn="True"
SpellCheck.IsEnabled="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Name="txt1">
</TextBox>
</DockPanel>
</Window>
Более подробные сведения по работе с WPF и XAML можно найти в [11].
В начало
ЛИТЕРАТУРА
ОСНОВНАЯ
- Герман, О. Программирование на JAVA и C#./ Герман О.В., Герман Ю.О. - C-кт Петербург, “БХВ”, 2005- 510c.
- Лабор, В.Си Шарп. Создание приложений для Windows./ Лабор В.В. – Мн., Харвест, 2003, - 382с.
- Гиббонз П. Платформа NET для Java программистов. Спб., Питер, 2001- 326с.
- Прайс, Дж. Visual C#.NET .Полное руководство./ Прайс Дж., Гандэрлой - Киев, Век, 2004, -958с.
- Нейгел К., С# 4 и платформа NET 4.0 для профессионалов./ Нейгел К.,Ивьен Б., Глин Дж., Уотсон К. – М., Изд.-во Вильямс, 2011, -1440 стр.
- Архангельский, Поиск устойчивых ошибок в программах. / Архангельский Б.В., Черняховский В.В. - М., Радио и связь, 1989.
- Шапошников, И. ASP.NET. /Шапошников И.В. – БХВ, С-кт. Петербург, 2002, - 358с.
- Кровчик Э., Кумар В., Логари Н и др. .NET Сетевое программирование для профессионалов. Изд.-во Лори, - М., 2005, - 417с.
ДОПОЛНИТЕЛЬНАЯ
- Пауэрс Л., Снелл М. MicroSoft Visual Studio 2008. C-кт Петербург. БХВ, 2009.- 1100с.
- Андерсон Р. Доказательство правильности программ. – М, Мир.1982
- Ватсон Б. С# 4.0 на примерах / Ватсон Б. - C-кт Петербург. БХВ, 2011.- 608с.
Общие указания.
Работы выполнять в среде Visual Studion Net 2005 (2008, 2010).
ПРАКТИЧЕСКИЙ РАЗДЕЛ.