вторник, 6 сентября 2011 г.

Считывание даты из документа Microsoft Excel


Вроде не чего сложного в считывании значений из Excel  документа нет, делаю я это так.
 
   1:  
   2: excelappworkbooks = excelapp.Workbooks;
   3: excelappworkbook = excelappworkbooks["file.xlsx"];
   4:  
   5: try
   6: {
   7: excelappworkbook.SaveAs(@"D:\new_file.xlsx", 
   8: Excel.XlFileFormat.xlOpenXMLWorkbook,
   9: Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
  10: Excel.XlSaveAsAccessMode.xlNoChange,
  11: Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
  12: Type.Missing);
  13: }
  14: catch (Exception ex)
  15: {
  16: listBox1.Items.Add(ex.Message);
  17: }

 

Открыли документ. Тепер читаем.

 


   1:  
   2: excelsheets = excelappworkbook.Worksheets;
   3: excelworksheet = (Excel.Worksheet)excelsheets.get_Item("Лист1");
   4: excelcells = excelworksheet.get_Range("A1", "A1");
   5: new_var = excelworksheet.get_Range("B1", "B1");
   6: dataGridView1.Rows.Add(Convert.ToString(excelcells­.Value2),Convert.ToString(new_var.Value2));


 

А вот с чтением даты у меня возникли заморочки, ексель возвращает дату как double.

 

Потом умные люди подсказали что из double можно получить DateTime используя вот такое преобразование:

 

var dt = DateTime.FromOADate(/*Дата как double*/);

 

Мне помогло, надеюсь и вам полезно окажется.

суббота, 3 сентября 2011 г.

Определение рабочей области рабочего стола

Вот столкнулся с такой задачкой нужно размещать форму в зависимости от размеров экрана. Решение оказалось очень простым использовать класс Screen.


Screen.PrimaryScreen.WorkingArea; - вот так получаем размеры рабочей области главного экрана 
без панели задач.

воскресенье, 21 августа 2011 г.

Проблема с наследованием от winforms

Столкнулся с задачей когда нужно реализовать наследование форм. В принципе все хорошо есть базовый класс, есть наследник. Но с наследником творится черт знает что. Не богу добавить не одного контрола. Погуглил и вот что выяснил. Если родительская форма находится в ДЛЛ то из за специфики работы с ресурсами возникает вот такая проблема. Печально. Если знаете как обойти помогите.

понедельник, 20 июня 2011 г.

Автоматическая прокрутка текста на последнюю строку в TextBox

 

Как-то нужно мне было чтобы при выводе логов текст автоматически прокручивался в TextBox на последнюю позицию, как в консоли виндовс, а то текст все время норовит перейти на первую строку. Встроенных методов прокрутки на последнюю строку я не нашёл.

Прокрутка текста в TextBox на последнюю строку:

textBox1.SelectionStart = textBox1.Text.Length;
textBox1.ScrollToCaret();

воскресенье, 19 июня 2011 г.

Работа и решение проблем при роботе с виндовс формс(Win Forms) при обращении из фонового потока. Шаблоны обращения к форме.

Довольно хорошо всем известна проблема возникающая при попытке обращения к свойствам или методам виндовс формы, WPF формы. Также известно что эта проблема решается с помощью применения маршализацыи.

Пример кода для работы с виндовс формой из фонового потока:

   1: Action action = delegate()
   2:     {
   3: // код работы с формой и её контролами 
   4:         label1.Text =
   5:             DateTime.Now.ToLongTimeString();
   6:     };
   7: // проверка нужно ли исполнять код с помощью маршализации или нет,
   8: //есле нужно применяем маршализацыю.
   9:     if (this.InvokeRequired)
  10:         this.Invoke(action);
  11:     else
  12:         action();

Аналогичный пример для WPF:



   1: Action action = () => textBlock1.Text =
   2:         DateTime.Now.ToString();
   3:     if (System.Threading.Thread.CurrentThread !=
   4:         textBlock1.Dispatcher.Thread)
   5:     {
   6:         textBlock1.Dispatcher.Invoke
   7:             (System.Windows.Threading.DispatcherPriority.Normal,
   8:             action);
   9:     }
  10:     else
  11:     {
  12:         action();
  13:     }

Данные примеры, вполне неплохо, подходят если вы используете возможность обращения к форма не очень часто, но в противном случае постоянное копирование кода начинает раздражать и усложнять код. По этому я предлагаю вам рассмотреть более элегантный метод применения морализации к любому контролу.


Метод расширения для класса Control для роботы из фонового потока.



   1: public static class ControlExtensions
   2: {
   3:     public static void InvokeIfNeeded(this Control ctl,
   4:         Action doit)
   5:     {
   6:         if (ctl.InvokeRequired)
   7:             ctl.Invoke(doit);
   8:         else
   9:             doit();
  10:     }
  11:  
  12:     public static void InvokeIfNeeded<T>(this Control ctl,
  13:         Action<T> doit, T args)
  14:     {
  15:         if (ctl.InvokeRequired)
  16:             ctl.Invoke(doit, args);
  17:         else
  18:             doit(args);
  19:     }
  20: }

Метод расширения контрола для работы из фонового потока совместимый с C# 2.0



   1: public delegate void Action;
   2: public delegate void Action<T>(T arg);
   3:  
   4: public static class ControlExtensions
   5: {
   6:     public static void InvokeIfNeeded(Control ctl, Action doit)
   7:     {
   8:         if (ctl.InvokeRequired)
   9:             ctl.Invoke(doit);
  10:         else
  11:             doit();
  12:     }
  13:  
  14:     public static void InvokeIfNeeded<T>( Control ctl,
  15:         Action<T> doit, T args)
  16:     {
  17:         if (ctl.InvokeRequired)
  18:             ctl.Invoke(doit, args);
  19:         else
  20:             doit(args);
  21:     }
  22: }

Пример использования


С# 2.0



   1: private void OnTick20(object sender, EventArgs e)
   2: {
   3:     ControlExtensions.InvokeIfNeeded(this, delegate()
   4:     {
   5:         toolStripStatusLabel1.Text =
   6:           DateTime.Now.ToLongTimeString();
   7:     });
   8: }

С# 3.5



   1: this.InvokeIfNeeded(() => toolStripStatusLabel1.Text =
   2:         DateTime.Now.ToLongTimeString());

Как свернуть приложение в трей

Чтобы свернуть приложение в трей:

В конструкторе формы - скрываем  приложение на панели задач, при запуске:

public Form()
{
    InitializeComponent();
    this.ShowInTaskbar = false;
    this.VindowState = VindowState.Minimized;
}

Размещаем  на форме элементы управления NotifyIcon.
Добавляем обработчик события двойного нажатия на NotifyIcon:



private void Click(object sender, System.EventArgs e)
{
    //Инвертируем состояние отображения на панели задач
    this.ShowInTaskbar = !this.ShowInTaskbar;
    //Показываем или скрываем форму взависимости от состояния ShowInTaskbar
    if(this.ShowInTaskbar) this.VindowState = VindowState.Minimized; else this.WindowState = VindowState.Defaulth;
}

суббота, 16 апреля 2011 г.

ImageListView – Правильный подход к отображению списка изображений.

ImageListView – NET. компонент, с открытым исходным кодом,  для отображения списка картинок, с асинхронной загрузкой  превю изображений.

Не стандартная работа с консолью.

Парочка методов для не стандартной работы с консолью.

Исходники программы для захвата и сохранения области экрана.

ScreenCapt
Исходник на C#, крошечной программки для снятия скриншотов с области экрана и последующего сохранения в файл.
MyZoomer.zip

Продолжение