Вызов кода C# из JavaScript

👁 262 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

При разработке JavaScript — приложений на платформе .NET очень часто, даже не очень, а требуется использовать JavaScript — функции вызова кода C#. Так как JavaScript не умеет пользоваться файловой системой не может работать с БД, то нам необходим код C#, который подгрузит данные из файла, запишет в файл, почитает и перезапишет данные в БД, обработает методами .NET данные и т.д.
Есть 2 похода того, как это сделать:

  • использовать специальный метод JS window.external, который будет содержать метод, определяемый в классе COM — объекта;
  • использовать ASP.NET страницы или любого другого серверного языка и подгрузить их через Ajax — запросы.

В данном посте рассмотрим первый вариант. Ниже представлен класс, который мы определяем , как видимый COM — объект

 

namespace MyApp
{
    [ComVisible(true)] //Устанавливаем как видимый COM
    public class ScriptClass
    {
        public ScriptClass()
        {
        }
        //Данный метод будем вызывать из JS
        public void readFile()
        {
            MessageBox.Show("File Reading!");
        }
    }
}

Далее нужно установить параметры для браузера, который мы используем в проекте

WebBrowser webBrowser = new WebBrowser(); 
webBrowser.ObjectForScripting = new ScriptClass(); 
webBrowser.Navigate("http://websofter.ru/");

Теперь, чтобы запустить данный код из JS, нам надо написать в обработчике такой код

window.external.readFile();

Использование JavaScript в WebBrowser .NET/C#

👁 681 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 4,00 из 5)
Загрузка...

При использовании JavaScript в .NET объекте WebBrowser нужно учитывать некоторые ньюансы, связанные с загрузкой страницы. Для того, чтобы выполнить какой-то JavaScript — код необходимо проверить загрузку страницы. Простое решение — это использование в C# специального слушателя события — WebBrowser.DocumentCompleted, который вызывается, когда страница полностью загружена.

Пример вызовава JavaScript — кода из C#

Ниже дан пример его использования. Пусть у нас есть HTML сраница index.html со следующим JavaScript — методом, который определен в head

<script>
	function runScript(){
		alert("Hello World!");
	}
</script>

Тогда вызов данного метода через C# будет выглядеть вот так

public MyForm()
{
//...
//Сначала определяем новое событие для браузера и передаем имя обработчика
            string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            webBrowser.Url = new Uri(Path.Combine(appDir, @"pages\index.html"));
  webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(runWebScripts);
}

//Далее, в классе определяем новый обработчик
void runWebScripts(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   webBrowser.Document.InvokeScript("runScript", new object[] { });
}

 Пример создания JavaScript — кода и его запуска из C#

Теперь посмотрим как создать новый элемент в DOM через C# и создать в нем код JavaScript

public MyForm()
{
//...
//Сначала определяем новое событие для браузера и передаем имя обработчика
            string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            webBrowser.Url = new Uri(Path.Combine(appDir, @"pages\index.html"));
  webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(runWebScripts);
}

//Далее, в классе определяем новый обработчик
void runWebScripts(object sender, WebBrowserDocumentCompletedEventArgs e)
{

            HtmlDocument doc = webBrowser.Document;
            HtmlElement head = doc.GetElementsByTagName("head")[0];
            HtmlElement s = doc.CreateElement("script");
            s.SetAttribute("text", "function sayHello() { alert('hello'); }");
            head.AppendChild(s);
            webBrowser.Document.InvokeScript("sayHello");

}

Мы добаляем в тег head новый элемент script и устанавливаем в качестве его атрибута text JavaScript — код и далее вызываем этот код с помощью метода InvokeScript

Подключение jQuery в WebBrowser через C# в виде гиперссылки

Давайте посмотрим, как использовать библиотеку jQuery в своем проекте на C#. Для этого нам необходимо создать новый элемент script и передать в атрибут src значение ссылки, для примера подключим библиотеку из стандартной ссылки Google

public MyForm()
{
//...
//Сначала определяем новое событие для браузера и передаем имя обработчика
            string appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            webBrowser.Url = new Uri(Path.Combine(appDir, @"pages\index.html"));
  webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(runWebScripts);
}
//Далее, в классе определяем новый обработчик
void runWebScripts(object sender, WebBrowserDocumentCompletedEventArgs e)
{
            //Получаем доступ к тегу head
            HtmlDocument doc = webBrowser.Document;
            HtmlElement head = doc.GetElementsByTagName("head")[0];

            //Подключаем библиотеку
            HtmlElement jQuery = doc.CreateElement("script");
            jQuery.SetAttribute("src", "http://code.jquery.com/jquery-latest.min.js");
            head.AppendChild(jQuery);
            
            //Далее запускаем код, содержащий jQuery
            HtmlElement script = doc.CreateElement("script");
            script.SetAttribute("text", "function setRedColor() { $('body').css({ 'background-color': 'red' }); }");
            head.AppendChild(script);

            //Вызываем метод, содержащий код jQuery
            webBrowser.Document.InvokeScript("setRedColor");

}

Подобным образом можно подключить не только jQuery библиотеку, но и любой удаленный JavaScript файл.

Подключение jQuery в WebBrowser через C# из локального хранилища

Если нам необходимо подгрузить jQuery или любой JavaScript — файл локально, то тут необходимо учитывать некоторые особенности, связанные с jQuery, так как при локальном подключении у вас может выскочить ошибка такого рода: Object doesn’t support property or method ‘defineProperty’, который означает: Объект не поддерживает свойство или метод ‘defineProperty’. Что непонятно, так это то, что при подключении через удаленную гиперссылку эта ошибка не выводиться и браузер работает нормально. Данная ошибка актуальная для версий IE 10 — 11 и выше, возможно. В IE он поддерживается, а в IE 8 — ограниченно. Решением данной проблемы является использование тегов для переключения браузера в режимы совместимости с ранними версиями. Подробно про это написано в официальной статье Microsoft «Specifying legacy document modes»

Из данной статьи следует, что для совместимости нужно использовать мета — тег

<meta http-equiv="x-ua-compatible" content="IE=edge" />

Запись атрибута content дает указание на то, с какой версией IE следует иметь совместимость. В нашем случае, данная запись эквивалентна использованию типа документа HTML5 и совместимости с другими браузерами. Это заставит Internet Explorer работать в режиме последней поддерживаемой спецификации документа. Значение «IE=edge» является наиболее полезным для регулярного поддерживания веб-сайтов, которые отрабатываются на совместимость между несколькими браузерами, в том числе Internet Explorer.
Данный тег совместимости необходимо в начале тега head в документе.

Итак, теперь, собственно сам код подключения. HTML документ будет таким

 

...
<head>
    <meta http-equiv="x-ua-compatible" content="IE=edge" />
</head>
...

C# — код будет таким

HtmlDocument doc = wbTestEditor.Document;
HtmlElement head = doc.GetElementsByTagName("head")[0];
HtmlElement s = doc.CreateElement("script");
s.SetAttribute("src", Environment.CurrentDirectory + @"\pages\js\jquery-2.1.3.min.js");
head.AppendChild(s);

Свойство Environment.CurrentDirectory содержит корневую папку запускаемой программы, а @ нужен для обработки слэшей в нормальном виде, чтобы не писать как \\. Environment.CurrentDirectory — это тоже самое, если бы мы писали как Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase), но в коротком виде.

Переменные в C#. Способы объявления массивов

👁 430 просмотров
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

В C# имеется богатый набор способов объявления этих массивов и иногда путаешься, когда разные языки программирования мелькают перед глазами через промежутки времени, ведь нет же такого, чтобы современный программист работал только с одним языком, а разные языки — это разная философия и методология, хоть и есть одинаковые понятия, подходы и схожесть синтаксиса. Разработчики всегда ищут облегчение процесса и за все время существования C# таких облегчений накопилось столько, что один и тот же вариант можно сделать несколькими способами.

Вступление

Данная статься будет организована попунктно — сначала рассмотрим обобщенно про массивы, а далее перейдем к многомерностям. Данная статья не последняя, могут быть продолжения по схожим тематикам, а C# есть много механизмов, относящихся к структурам(structure), спискам(List), словарям(Dictionary), хэш-таблицы(хэш-таблицы), потокобезопасные коллекции(Concurrent), строго типизированные коллекции(Generic), коллекциям объектной модели(ObjectModel), специализированные коллекции(Specialized). Ну в общем, тема большая и без грамотного составления структуры обучения будет очень сложно все это понять.

Способы объявления и инициализации одномерных массивов в C#

Давайте сразу скажем, что в C# имеются 5 способов объявления и инициализации массивов:

  1. Инициализировать при объявлении без спецификация ранга. При данном подходе индекс во второй части опускается и он берется автоматом при подсчете значений инициализации:
    int[] myArray = new int[] { 1, 3, 5, 7, 9};

     

  2. Инициализация без указания повтора типа переменных после равенства. При данном походе размер массива также, как и в первом случае, рассчитывается автоматом, исходя из количества значений, участвующих в инициализации переменных внутри массива:
    string[] myArray = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

     

  3. Можно объявить переменную массива без инициализации, но при присвоении массива этой переменной нужно использовать оператор new:
    int[] myArray;
    myArray = new int[] { 1, 3, 5, 7, 9 };

     

  4. В C# массивом может быть не только любой базовый тип, но и класс. В понимании C# типом считается и класс, в том числе:
    class MyType{
        public string mField;
    }
    MyType[] myArray = new MyType[10];
    MyType myTypeVar0 = new MyType();
    myTypeVar0.mField = "Text 0";
    MyType myTypeVar1 = new MyType();
    myTypeVar1.mField = "Text 1";
    ...
    myArray[0]=myTypeVar0;
    myArray[1]=myTypeVar1;
    ...
  5. В C# массив может принимать любой тип данных, если при инициализации указать тип object. Данный тип является родоначальником всех типов и поэтому может принимать любой тип:
    object[] myArray = new object[]{1, "text", 1.2, 'A'};

Способы объявления и инициализации многомерных массивов в C#

На самом деле, тут не будет какой-то новый подход инициализации многомерных массивов, потому что нет отличий от одномерных. Создавая многомерный массив мы должны понимать, что создаем те же одномерные массивы, но в комплексе одной переменной.

  1. Многомерный массив в C# может иметь много измерений до бесконечности, но больше 2-х на практике редко используются:
    int[] myArray1 = new int[4];//Массив 1-го измерения
    int[,] myArray2 = new int[4, 5];//Массив 2-го измерения
    int[,,] myArray3 = new int[4, 5, 7];//Массив 3-го измерения
    int[,,,] myArray4 = new int[4, 5, 7, 9];//Массив 4-го измерения
    ...

     

  2. Массив можно инициализировать при объявлении, как показано в следующем примере:
    int[,] myArray2 = new int[2, 2]{{1, 5}, {6, 8}};//Массив 2-го измерения

     

  3. Можно опустить указание размерности:
    int[,] myArray2 = new int[ , ]{{1, 5}, {6, 8}};//Массив 2-го измерения

     

  4. Если нужно создать переменную массива без инициализации, то необходимо использовать оператор new:
    int[,] myArray2;
     myArray2 = new int[ , ]{{1, 5}, {6, 8}};//Массив 2-го измерения

     

  5. Следующий пример присваивает значение конкретному элементу массива:
    int[,] myArray2 = new int[2 , 2];//Массив 2-го измерения
    myArray2[1, 2] = 10;//Инициализируем отдельный элемент в массиве

     

Способы объявления и инициализации массивы массивов в C#

Массив массивов — это массив, элементы которого сами являются массивами. Элементы массива массивов могут иметь различные размеры и измерения. Массивы массивов иногда также называются «невыровненными массивами». В следующих примерах показано, как выполняется объявление, инициализация и доступ к массивам массивов.

  1. Ниже показано объявление одномерного массива, включающего три элемента, каждый из которых является одномерным массивом целых чисел:
    int[][] myArray = new int[3][];

     

  2. Перед использованием jaggedArray его элементы нужно инициализировать. Сделать это можно следующим образом:
    myArray[0] = new int[5];
    myArray[1] = new int[4];
    myArray[2] = new int[2];

     

  3. Для заполнения элементов массива значениями можно также использовать инициализаторы, при этом размер массива знать не требуется:
    myArray[0] = new int[] { 1, 3, 5, 7, 9 };
    myArray[1] = new int[] { 0, 2, 4, 6 };
    myArray[2] = new int[] { 11, 22 };

     

  4. Также массив можно инициализировать путем объявления:
     int[][] myArray = new int[][] 
    {
        new int[] {1,3,5,7,9},
        new int[] {0,2,4,6},
        new int[] {11,22}
    };

     

  5. Также можно использовать сокращенную форму. Обратите внимание, что при инициализации элементов оператор new опускать нельзя, так как инициализации по умолчанию для этих элементов не существует:
      int[][] myArray = 
    {
        new int[] {1,3,5,7,9},
        new int[] {0,2,4,6},
        new int[] {11,22}
    };

     

  6. Разреженный массив является массивом массивов и поэтому его элементы являются ссылочными типами и инициализируются значением null:
    myArray[0][1] = 77;
    myArray[2][1] = 88;

     

  7. Массивы массивов можно смешивать с многомерными массивами. Ниже показано объявление и инициализация одномерного массива массивов, состоящего из трех двумерных элементов различного размера:
    int[][,] myArray = new int[3][,] 
    {
        new int[,] { {1,3}, {5,7} },
        new int[,] { {0,2}, {4,6}, {8,10} },
        new int[,] { {11,22}, {99,88}, {0,9} } 
    };

     

  8. Доступ к отдельным элементам выполняется как показано в примере ниже, где отображено значение элемента [1,0] первого массива (значение 5):
    System.Console.Write("{0}", myArray[0][1, 0]);

     

  9. Метод Length возвращает число массивов, содержащихся в массиве массивов. Например, если объявить предыдущий массив, мы получим следующее:
    System.Console.WriteLine(myArray.Length);