venerdì 9 giugno 2023

Salvataggio log con le funzioni di System.Diagnostic.

 Salvataggio log con le funzioni di System.Diagnostic.


            /* Gestione log in debug */

            string percorsoSalvataggio = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\" + "PAI-PL_PCCS_Client\\Log\\";

            if (!Directory.Exists(percorsoSalvataggio))

            {

                Directory.CreateDirectory(percorsoSalvataggio);

            }


            if (m_LogStreamFile == null)

            {

                try

                {

                    m_LogStreamFile = new FileStream(percorsoSalvataggio + DateTime.Now.ToString("yyyyMMddHHmmss") + "_LogFile.txt", FileMode.Append);

                    // Add the stream object to the trace listeners.

                    TextWriterTraceListener m_LogListener = new TextWriterTraceListener(m_LogStreamFile);

                    Debug.Listeners.Add(m_LogListener);


                    m_timerFlush = new System.Timers.Timer(10000);

                    m_timerFlush.Start();

                    m_timerFlush.Elapsed += TimerFlush_Elapsed;

                }

                catch (Exception)

                {


                }

            }

venerdì 14 marzo 2014

Controllo Automatico Data e Ora inserito in un Label , MaskTextBox e TextBox C#

Capita spesso di dover eseguire dei controlli sul testo contenuto in un Label, TextBox o MaskTextBox e nel dover dare un feedback all'utente nella correttezza dei dati inseriti. In aiuto in questo caso ci arrivano le regole REGEX che tramite una stringa di formattazione andiamo a controllare il testo che l'utente ha inserito e a segnalarli qualche errore.
L'esempio seguente mostra come controllare due campi, uno data e l'altro orario, e come viene segnalato all'utente tramite una colorazione rossa o bianca la correttezza dei dati inseriti. Il codice è poi inserito all'interno dell'evento di "TextChanged" del controllo in modo da avere un riscontro in tempo reale ad ogni carattere inserito.


Code:
void mTextBoxOra_TextChanged(object sender, SystemEventArgs e)
{
    Regex OraFormat = new Regex(@"^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]#CODE#quot;);

    if (!OraFormat.Match(mTextBoxOra.Text).Success)
    {
        mTextBoxOra.BackColor = Color.Coral;
    }
    else
    {
        mTextBoxOra.BackColor = Color.White;
    }
}

void mTextBoxData_TextChanged(object sender, SystemEventArgs e)
{
    Regex DataFormat = new Regex(@"^(((((0[1-9])|(1\d)|(2[0-8]))\/((0[1-9])|(1[0-2])))|((31\/((0[13578])|(1[02])))|((29|30)\/((0[1,3-9])|(1[0-2])))))\/((20[0-9][0-9])|(19[0-9][0-9])))|((29\/02\/(19|20)(([02468][048])|([13579][26]))))#CODE#quot;);

    if (!DataFormat.Match(mTextBoxData.Text).Success)
    {
        mTextBoxData.BackColor = Color.Coral;
    }
    else
    {
        mTextBoxData.BackColor = Color.White;
    }
}

giovedì 14 novembre 2013

WPF - DataGrid non aggiorna la variabile Binding C#

Mi è capitato di avere il seguente problema:
Ho una DataGrid  che binda ad una Collection, ma modificando un parametro questo non viene aggiornato nella collection. Casualmente mi sono imbattuto nel seguente consiglio:
http://stackoverflow.com/questions/17211462/wpf-bound-datagrid-does-not-update-items-properties 


La soluzione è molto semplice ed è quella di far ereditare alla classe degli item la
ObservableCollection

Ecco l'esempio:

Code:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel; // ObservableCollection
using System.ComponentModel; // INotifyPropertyChanged
using System.Collections.Specialized; // NotifyCollectionChangedEventHandler
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObservableCollectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // ATTN: Please note it's a "TrulyObservableCollection" that's instantiated. Otherwise, "Trades[0].Qty = 999" will NOT trigger event handler "Trades_CollectionChanged" in main.
            // REF: http://stackoverflow.com/questions/8490533/notify-observablecollection-when-item-changes
            TrulyObservableCollection<Trade> Trades = new TrulyObservableCollection<Trade>();
            Trades.Add(new Trade { Symbol = "APPL", Qty = 123 });
            Trades.Add(new Trade { Symbol = "IBM", Qty = 456});
            Trades.Add(new Trade { Symbol = "CSCO", Qty = 789 });

        Trades.CollectionChanged += Trades_CollectionChanged;
        Trades.ItemPropertyChanged += PropertyChangedHandler;
        Trades.RemoveAt(2);

        Trades[0].Qty = 999;

        Console.WriteLine("Hit any key to exit");
        Console.ReadLine();

        return;
    }

    static void PropertyChangedHandler(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine(DateTime.Now.ToString() + ", Property changed: " + e.PropertyName + ", Symbol: " + ((Trade) sender).Symbol + ", Qty: " + ((Trade) sender).Qty);
        return;
    }

    static void Trades_CollectionChanged(object sender, EventArgs e)
    {
        Console.WriteLine(DateTime.Now.ToString() + ", Collection changed");
        return;
    }
}

#region TrulyObservableCollection
public class TrulyObservableCollection<T> : ObservableCollection<T>
    where T : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler ItemPropertyChanged;

    public TrulyObservableCollection()
        : base()
    {
        CollectionChanged += new NotifyCollectionChangedEventHandler(TrulyObservableCollection_CollectionChanged);
    }

    void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);

        if (ItemPropertyChanged != null)
        {
            ItemPropertyChanged(sender, e);
        }
    }
}
#endregion

#region Sample entity
class Trade : INotifyPropertyChanged
{
    protected string _Symbol;
    protected int _Qty = 0;
    protected DateTime _OrderPlaced = DateTime.Now;

    public DateTime OrderPlaced
    {
        get { return _OrderPlaced; }
    }

    public string Symbol
    {
        get
        {
            return _Symbol;
        }
        set
        {
            _Symbol = value;
            NotifyPropertyChanged("Symbol");
        }
    }

    public int Qty
    {
        get
        {
            return _Qty;
        }
        set
        {
            _Qty = value;
            NotifyPropertyChanged("Qty");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
#endregion
}

mercoledì 16 ottobre 2013

Concatenare immagini Bitmap C#

Ecco un esempio di codice per concatenare tra loro 2 o più immagini:


Code:
//Concatenate Image in Horizontal
private Bitmap ConcatenateImage(IList<Bitmap> ListImage)
{
 int ImWidth = 0;

 for (int i = 0; i < ListImage.Count(); i++)
 {
  ImWidth = ImWidth + ListImage[i].Width;
 }

 Bitmap bmpfinal = new Bitmap(ImWidth, ListImage[0].Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

 Graphics gr = Graphics.FromImage(bmpfinal);

 gr.DrawImage(ListImage[0], new System.DrawingPoint(0, 0));
 for (int i = 1; i < ListImage.Count(); i++)
 {
  gr.DrawImage(ListImage[i], new System.DrawingPoint(ListImage[i - 1].Width, 0));
 }

 gr.Dispose();
 
 return bmpfinal;
}<!--[if IE]>

Convertire immagini Bitmap in ImageSource

Il seguente codice converte un immagine in formato Bitmap in formato ImageSource:



Code:
//Convert Bitmap to ImageSource
public ImageSource ToImageSource(System.DrawingBitmap source)
{
 BitmapSource bitSrc = null;

 var hBitmap = source.GetHbitmap();

 try
 {
  bitSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
   hBitmap,
   IntPtr.Zero,
   Int32Rect.Empty,
   BitmapSizeOptions.FromEmptyOptions());
 }
 catch
 {
  bitSrc = null;
 }
 finally
 {
  NativeMethods.DeleteObject(hBitmap);
 }

 return bitSrc;
}

//Class Utility
internal static class NativeMethods
{
 [DllImport("gdi32.dll")]
 [return: MarshalAs(UnmanagedType.Bool)]
 internal static extern bool DeleteObject(IntPtr hObject);
}

Cosa molto importante è la cancellazione dell'oggetto tramite la classe "NativeMethods" altrimenti potreste avere problemi di memoria.