Поиск по этому блогу

Показаны сообщения с ярлыком C#. Показать все сообщения
Показаны сообщения с ярлыком C#. Показать все сообщения

пятница, 18 марта 2016 г.

DocsVision 4.5 - Алгоритм поиска в каком подразделении находится сотрудник

Столкнулся с задачей, как определить, в каком подразделении числится сотрудник в DocsVision.
Поиски по форумам особого результата не дали. Немного полазил по DVExplorer и подумал. В итоге алгоритм не очень сложный. Но придется по ходу работы учитывать разные нюансы. Например пользователей может быть два с одинаковым полем данных. Тогда нужно осуществлять поиск по уникальному полю.


среда, 9 марта 2016 г.

DocsVision 4,5 - Изменяем значение в справочнике сотрудников

На этот раз задача посложнее.
Нужно в DocsVision изменить значение в справочнике сотрудников в секции сотрудник.
Менять буду по принципу, если значение не равно нужному мне, то меняем.
Меня интересует поле - Тип маршрутизации - RoutingType.
В DocsVision есть простой способ для подобных действий. Это механизм FindRows. Он принимает xml запрос, по которому ищет соответствия. Им и буду пользоваться.\
P.S.  Запрос можно усложнять, делая выборку по нескольким условиям.


DocsVision 4,5 - изменение фактической даты чего - либо

Давно не наполнял свой блог новыми знаниями. Было лень и было много работы.
В данный период моей жизни я работаю с DocsVision. Пишу скрипты для бизнес - процессов.
Данная запись - шпаргалка. Чтобы не забыть как делалось.
Суть такова - нужно изменить в основной части карточки бизнес - процесса поле "фактическая дата загрузки". Поле может называться и по другому. Главное чтобы оно находилось на вкладке Основное(Основная) в карточке.

воскресенье, 9 ноября 2014 г.

Шифрование строки и расшифровка

Шифруем строку по ключу. Нужно передать строку  и ключ(с помощью которого будем шифровать в метод EncryptText), чтобы зашифровать. Чтобы расшифровать - передаем зашифрованное сообщение и ключ в метод DecryptText.

public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
        {
            byte[] encryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                        cs.Close();
                    }
                    encryptedBytes = ms.ToArray();
                }
            }

            return encryptedBytes;
        }

        public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            byte[] decryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        cs.Close();
                    }
                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }

        public static string EncryptText(string input, string password)
        {
            // Get the bytes of the string
            byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

            // Hash the password with SHA256
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);

            string result = Convert.ToBase64String(bytesEncrypted);

            return result;
        }

        public static string DecryptText(string input, string password)
        {
            // Get the bytes of the string
            byte[] bytesToBeDecrypted = Convert.FromBase64String(input);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes);

            string result = Encoding.UTF8.GetString(bytesDecrypted);

            return result;
        }

Набор полезных JS скриптов

Сюда входят:
1 использование jquery элемента blockUI
2 проверка полей телефона и поля суммы
3 работа с cookie

Footer в ASP NET

В тег form добавляем div, в котором есть ещё один div с пометкой class="mainWindow"( margin: 0 auto; width: 1024px;  height: 768px;),  а в него div с class="footer"(float: left; width: 1024px; height: 25px;).
ContentPlaceHolder помещаем в div с class="workPlace"(float: left;width: 1024px; height: 610px;)


пятница, 12 июля 2013 г.

Поиск файла по всем дискам

Поиск файла по всем дискам и директориям.



static void Main(string[] args)
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                FindFiles(drive.RootDirectory.ToString(), "notepad++.exe");
            }
            Console.Out.WriteLine("Press any key");
            Console.ReadKey();
        }

        public static void FindInDir(DirectoryInfo dir, string pattern, bool recursive)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    foreach (FileInfo file in dir.GetFiles(pattern))
                    {
                        Console.Out.WriteLine(file.FullName);
                    }
                }
                catch (UnauthorizedAccessException)
                {
                }

                if (recursive)
                {
                    DirectoryInfo[] subdir = dir.GetDirectories();
                    int i;
                    int l = subdir.Length;
                    for (i = 1; i < l; i++)
                    {
                        try
                        {
                            FindInDir(subdir[i], pattern, recursive);
                        }
                        catch (UnauthorizedAccessException)
                        {
                            Console.Out.WriteLine("Отказано в доступе " + subdir[i].Name);
                        }
                    }
                }
            });
        }
        public static void FindFiles(string dir, string pattern)
        {
            Task.Factory.StartNew(() =>
            {
                FindInDir(new DirectoryInfo(dir), pattern, true);
            });
        }
    }

понедельник, 25 марта 2013 г.

Сравнение строк без учета регистра

Заметка.
Два способа сравнить строки без учета регистра букв.
Первый через регулярные выражения, а второй через свойство OrdinalIgnoreCase у IndexOf.


Regexp reg = new Regexp("что ищешь", RegexOptions.IgnoreCase)
Match n = new.Match(string)


if(stringToTest.IndexOf("myvalue", StringComparison.OrdinalIgnoreCase) >= 0)
{
   //строки совпали
}
else
{
   //строки не совпали
}

среда, 21 ноября 2012 г.

WPF Бегущая строка

Новая задача - сделать бегущую строку в WPF приложении. Делается очень просто через XAML.
Значения From и To задаются исходя из размера окна программы + длина текста(в 2 раза больше окна).


Canvas x:Name="Canvas" Background="Transparent" Height="25"
                VerticalAlignment="Top">
            <TextBlock Margin="0,7,0,0" VerticalAlignment="Bottom" FontSize="15"  FontWeight="Bold" Foreground="#555"
                       Text="Тестовый текст" Canvas.Right="0">
                <TextBlock.Triggers>
                    <EventTrigger RoutedEvent="TextBlock.Loaded">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="1300" To="-750" 
                                                     Duration="0:0:15" RepeatBehavior="Forever"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </TextBlock.Triggers>
            </TextBlock>
        </Canvas>

среда, 3 октября 2012 г.

WPF file explorer часть 2

В продолжение создания файлового менеджера на WPF. Сегодня решил немного улучшить программу  и добавил несколько функций:

  • открытие выделенного файла в списке
  • копирование выделенного файла в списке (копирование из одной папки в другую)
  • удаление выделенного файла в списке (удаление файла из папки)
  • выделение всех файлов в списке


Открытие


private void Open_selectItem(object sender, RoutedEventArgs e)
        {
            FileInfo filinf = listBox1.SelectedItem as FileInfo;
            try 
            {
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = filinf.FullName;
                p.Start();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

воскресенье, 23 сентября 2012 г.

WPF file explorer


Был долго занят с работой, поэтому ничего нового не публиковал. Вот появилось время, решил написать про файловый менеджер.
Задачи:
просмотр дисков и папок компьютера
показывание файлов, находящихся на диске или в папке.
В общем идея такая, чтобы рядом с именем диска была стрелочка, которая разворачивает вниз список папок, а рядом, во втором окне, показывались файлы.
Делал на WPF. Добавляем 1 treeview и 1 listview(пробовал с listBox, но там глюк с отображением содержимого папок), затем пишем такой код.



public MainWindow()
        {
            InitializeComponent();
            TreeViewDrivers();
        }
void TreeViewDrivers() 
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = drive;
                item.Header = drive.ToString();
                item.Items.Add("*");
                //trw_Products.Items.Add(item);
                treeView1.Items.Add(item);

                item.Expanded += new RoutedEventHandler(item_DirExpanded);
            }
        }

вторник, 17 июля 2012 г.

Изменяем TabControl через XAML

Занялся изменением внешнего стиля TabControl. Хотелось сделать угловатые закладки как в Expression Blend 4(в самой программе) или как в Google Chrome. Есть некоторые НЕДОРАБОТКИ, но всё вполне функционирует.  Единственное неудобство - GRID в TabItem автоматичесски подстраивается под содержимое. Для начала поискал пару примеров, в общем вот что получилось.
Всё запихиваем в <Windows.Resurces>


<Style TargetType="{x:Type TabItem}">
            <Setter Property="SnapsToDevicePixels" Value="true"/>
            <Setter Property="OverridesDefaultStyle" Value="true"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid Margin="0,0,-12,0">
                            <!--Самостоятельная проба создать вкладки-->
                            <Border Name="Border" Background="Transparent" BorderBrush="Transparent"
                                    BorderThickness="1,1,1,1" CornerRadius="6,6,0,0" />
                            <Path Name="Blablabla" Data="M0.5,3.5 C0.5,1.8431458 1.8431458,0.5 3.5,0.5 L46.5,0.5 C48.156854,0.5 75.082788,25.5 70.333333,25.5 65.583878,25.5 0.75000088,25.249498 0.5,25.583056 0.24999912,25.916615 0.5,10.944442 0.5,3.5 z" 
              Fill="Black" HorizontalAlignment="Left" Height="26.089" Stretch="Fill" Stroke="White" 
              VerticalAlignment="Bottom"  Width="110"/>
                            <ContentPresenter x:Name="ContentSite" TextElement.Foreground="White" ContentSource="Header" VerticalAlignment="Center"
                                              HorizontalAlignment="Center" Margin="0,0,18,0"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter TargetName="Border" Property="Background" Value="Orange" />
                                <Setter Property="Panel.ZIndex" Value="100" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter TargetName="ContentSite" Property="TextElement.Foreground" Value="White"/>
                                <Setter TargetName="Border" Property="Background" Value="Transparent"/>

                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

понедельник, 2 июля 2012 г.

Как вытащить путь до файла через ярлык

Изначально я просто решил опробовать Drag and drop в WPF и Win Form. Сделал окошко, где был ListBox, сделал так, чтобы в него можно было перетащить файлы. В ListBox'e показывался путь до этого файла, то есть то место, откуда я  перетащил файл. Потом появилась идея каким - то образом заставить программу выдавать путь до файла, в моём случае через ярлык, узнать, где установлена программа. В общем, нашёлся такой путь решения.
GetFullPath используется как метод-функция.

 // Таким образом узнаем путь до файла, через ярлык
        string GetFullPath(FileInfo file)
        {
            // проверяем, является ли файл ярлыком
            if (file.Extension == ".lnk")
            {
                using (var fstream = File.Open(file.FullName, FileMode.Open, FileAccess.Read))
                {
                    using (var reader = new BinaryReader(fstream))
                    {
                        fstream.Seek(0x14, SeekOrigin.Begin);
                        var flags = reader.ReadUInt32();
                        if ((flags & 0x01) == 1)
                        {
                            fstream.Seek(0x4c, SeekOrigin.Begin);
                            var itemIdLength = reader.ReadUInt16();
                            fstream.Seek(itemIdLength, SeekOrigin.Current);
                        }
                        var start = fstream.Position;
                        var length = reader.ReadUInt32();
                        fstream.Seek(0x0c, SeekOrigin.Current);
                        var offset = reader.ReadUInt32();
                        fstream.Seek(start + offset, SeekOrigin.Begin);
                        return new string(reader.ReadChars((int)(start + length - fstream.Position)));
                    }
                }
            }
            else
                return file.FullName;
        }

суббота, 16 июня 2012 г.

WPF clock

Ещё одни электронные часы, только теперь на WPF. Всё делается намного прощё, хотя впринципе и в Win Form можно было бы сделать так же.



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.Shapes;
using System.Windows.Threading;

namespace MyTimer
{
       
       /// 
       /// Interaction logic for MainWindow.xaml
       /// 
       
       
       public partial class MainWindow : Window
       {
              DispatcherTimer timer;
              
              public MainWindow()
              {
                     this.InitializeComponent();

                     timer = new DispatcherTimer();
                     timer.Interval = TimeSpan.FromSeconds(1.0);
                     timer.Start();
                     timer.Tick += new EventHandler(delegate(object s, EventArgs a)
        {
                     
                       tb.Text = "" + DateTime.Now.Hour +":"
                     + DateTime.Now.Minute +":"
                     + DateTime.Now.Second;
              
         
        });
              }
                     
       }
}

четверг, 31 мая 2012 г.

Электронные часы

Мне нравится писать программы по чьи-то примерам. Я так быстрее учусь программировать. Недавно писал простенький файловый менеджер, исходник которого был для консольного приложения. Немного поэксперементировав, я смог его сделать в Win Form. Что касается электронных часов - это первая программа, которую я вообще хотел написать. И вот ещё один вариант таких часов, но уже с использованием потоков.

четверг, 24 мая 2012 г.

Программа сама себя копирует

После пересмотра Железного человека задался вопросом, а как заставить программу саму себя скопировать куда - либо (в другое место). Задача стояла так - нужно либо ввести в консоль команду,  либо нажать кнопку, чтобы программа выполнила копирование самой себя в другую папку. Вот в принципе 2 варианта решения этой задачи. Один вариант сделан на основы одной из программ, которую я уже выкладывал.
Вот первый (здесь нужно вставить названия папки, чтобы программа знала куда копироваться):

            // Полный путь к программе.
            string currentAssembly = Assembly.GetExecutingAssembly().Location;
            // Название файла программы.
            string fileName = Path.GetFileName(currentAssembly);
            // Папка назначения.
            string destinationDirectory = Path.Combine(Directory.GetCurrentDirectory(), "copy");
            // Проверяем, есть ли директория, если нет - создаём.
            if (!Directory.Exists(destinationDirectory))
                Directory.CreateDirectory(destinationDirectory);
            // Копируем в заданную папку, перезаписывая, при необходимости.
            File.Copy(currentAssembly, Path.Combine(destinationDirectory, fileName), true);
            Console.WriteLine("Скопировано.");
            Console.ReadKey();

Вот второй:


        static void Main(string[] args)
        {
            Console.WriteLine("введите команду");
            string command = Console.ReadLine();
            if(command == "копируй себя")
            {
                CopyFolder(@"D:\Working\project\Новая папка\copiesItselfTo",
                    @"d:\__autoSeo_results\copiesItselfTo");
                Console.WriteLine("Копирование завершено");
            }
            Console.ReadLine();
        }
        static public void CopyFolder(string sourceFolder, string destFolder)
        {
            // Directory.Exists - Определяет, указывает ли заданный путь на существующий каталог на диске
            if (!Directory.Exists(destFolder))
                Directory.CreateDirectory(destFolder);
            string[] files = Directory.GetFiles(sourceFolder);
            //Directory.GetFiles - Возвращает имена файлов (с указанием пути к ним) в указанном каталоге
            foreach (string file in files)
            {
                string name = Path.GetFileName(file);
                string dest = Path.Combine(destFolder, name);
                File.Copy(file, dest);
            }
            string[] folders = Directory.GetDirectories(sourceFolder);
            foreach (string folder in folders)
            {
                string name = Path.GetFileName(folder);
                string dest = Path.Combine(destFolder, name);
                CopyFolder(folder, dest);
            }
        }

воскресенье, 20 мая 2012 г.

Перемешивание списка

Иногда бывает нужно перемешать(отсортировать) определённый список или массив данных в случайном порядке.
Вот один вариант решения данной задачи:

    class Randoming
    {
        public static void MixList<t>(IList<t> list) 
        {
            Random r = new Random();
            //Создаем сортируемый список и набиваем в него значения из 
            //целевого списка. Тип SortedList устроен так, что при добавлении 
            //нового элемента, он (элемент) помещается не в конец списка 
            //элементов, а между ними, обеспечивая моментальную автоматическую 
            //сортировку списка
            SortedList<int, t> mixedList = new SortedList<int, t>();
            //заполняем список
            foreach (t item in list)
                mixedList.Add(r.Next(), item);

            list.Clear();
            for (int i = 0; i < mixedList.Count; i++)
            {
                list.Add(mixedList.Values[i]);
            }  
        }
    }
        
static void Main(string[] args)
        {
            Console.WriteLine("Сейчас будет рандомная сортировка");
            List<string> myList = new List<string>();
            //List<string> result = new List<string>();
            for (int i = 0; i < 50; i++)
                myList.Add(i.ToString());
            Randoming.MixList(myList);
            foreach(var ml in myList)
            {
                //result.Add(ml);
                Console.WriteLine(ml);
            }
            //Console.WriteLine(result);
            Console.ReadLine();
        }

Получаем исходный код страницы

Код не мой, просто нашёл пример, который мне понравился. Вот решил добавить его себе в блог, вдруг пригодится когда - нибудь. По мере изучения исходника программы, понял, что не так и сложно это было написать самому. Но ввиду того, что я не так долго занимаюсь программированием - стараюсь находить, в основном готовые программы, чтобы покапаться в их коде. Сам пишу пока что простенькие программы.
Для начала кидаем на форму две кнопки, один текст бокс(называем его urlTextBox ) и один  richTextBox1. Размещаем это по форме как угодно.
Задача - получить исходный код страницы.
Вот реализация:

        private void button1_Click(object sender, EventArgs e)
        {
            //Программа достаёт исходный код страницы
            //создаём строку url,в которой будем указывать адресс сайта
            string url = urlTextBox.Text;
            //Создаём объект , который будет выполнять запрос к URI(идентификатор ресурса)
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            //GetResponse - возвращает ответ на интернет-запрос
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            //Реализуем считывание символов из потока байтов в определенной кодировке.
            //GetResponseStream -  возвращает поток данных из  интернет-ресурса
            StreamReader sr = new StreamReader(response.GetResponseStream());
            //Читаем поток от начала до конца
            richTextBox1.Text = sr.ReadToEnd();
            //закрываем поток
            sr.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //очишаем поле
            richTextBox1.Clear();
        }

пятница, 18 мая 2012 г.

Быстрая сортировка

Решил уделить больше внимание различным сортировкам на C#. Первая, которую решил осуществить  -  Quick Sort (Быстрая сортировка). Один из быстрых известных универсальных алгоритмов сортировки массивов. Суть алгоритма:
  • из массива выбирается элемент. Как правило, в качестве этого элемента берется центральный элемент массива. 
  • остальные элементы распределяются таким образом, чтобы слева  оказались все элементы, меньшие или равные опорному элементу. Элементы, большие или равные опорному элементу, помещаются справа. 

вторник, 15 мая 2012 г.

Шифр Цезаря

Вот решил на C# написать самостоятельно реализацию шифра Цезаря. Ничего сверхъестественного или сложного не пытался написать. Поэтому реализация получилась очень простой.
Шифр Цезаря, также известный как шифр сдвига, код Цезаря или сдвиг Цезаря — один из самых простых и наиболее широко известных методов шифрования.
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется буквой находящейся на некоторое постоянное число позиций левее или правее него в алфавите. Например, в шифре со сдвигом 3, А была бы заменена на Г, Б станет Д, и так далее.
Пока заставил программу только шифровать, похже добавлю дишифровку.

            Console.WriteLine("Введите слово,которое нужно зашифровать:");
            string s = Console.ReadLine();
            string abc = "abcdefghijklmnopqrstuvwxyz";
            //abc наш алфавит
            Console.WriteLine("Укажите длину сдвига");
            int len = Convert.ToInt32(Console.ReadLine());
            // len  - число сдвигов в сторону
            int a;
            string code = string.Empty;
            for (int i = 0; i < s.Length; i++)
            {
                a = i + len;
                code += abc[a];
            }
            Console.WriteLine(code);
            Console.ReadLine();