Promemoria. Questo link presenta una possibile soluzione nel caso in cui, lavorando con SQL Server 2005, si presenti il seguente messaggio d'errore:
The database principal owns a schema in the database, and cannot be dropped. (Microsoft SQL Server, Error: 15138).
Piccolo post derivato da una risposta su un forum. Un semplice modo per dotare una nostra applicazione di un log degli eventi, è utilizzare la classe EventLog che il .Net Framework mette a disposizione. MSDN suggerisce, nel caso in cui si debba usare il log per poche operazioni di utilizzare i metodi statici della classe EventLog, altrimenti conviene registrare un log degli eventi personalizzato e utilizzare un'istanza della classe EventLog. Quando detto si traduce in poche righe di codice:
1 if (!EventLog.SourceExists("MyEventLog", "."))
2 EventLog.CreateEventSource("MyEventLog", "CustomApplication");
3
4 _demoLog = new EventLog("CustomApplication", ".", "MyEventLog");
Per aggiungere una nuova entry al log è sufficiente utilizzare il metodo WriteEntry:
1 _demoLog.WriteEntry("Evento click eseguito", EventLogEntryType.SuccessAudit);
Se ad esempio, volessimo visualizzare le entries del nostro log in un controllo ListBox è sufficiente eseguire un ciclo for each sulla collezione Entries esposta dall'istanza di EventLog:
1 string entryMessage ="";
2 foreach (EventLogEntry entry in _demoLog.Entries ){
3 entryMessage = string.Format ("{0} {1} {2}",
4 entry.EntryType.ToString (),entry.MachineName ,
5 entry.Message );
6
7 listBox1.Items.Add (entryMessage );
8 }
Per cancellare le entries, utilizziamo il metodo Clear() dell'istanza:
Nel caso in cui invece volessimo eliminare l'Event Log registrato, è sufficiente utilizzare il metodo statico Delete() :
1 EventLog.Delete("MyEventLog")
Importante (1): Per creare ed eliminare un event source ( e realtive entries) è necessario che l'utente abbia i diritti di amministrazione, altrimenti a run-time verrà sollevata l'opportuna eccezione. Magari il log degli eventi potrebbe essere registrato sulla macchina in fase di installazione dell'applicazione, fase in cui ci si aspetta che l'utente che esegue il task sia in posseso degli opportuni diritti di amministrazione
Importante (2): Per utilizzare il sistema di logging è necessario che il sistema operativo che ospita l'applicazione sia Windows 2000, Windows XP, Windows 2003 Server o superiori (Windows 98 e Windows Millennium Edition non supportano l'Event log)
Oltre che da codice, possiamo visualizzare lo stato del nostro log utilizzando l'apposito Event Viewer richiamabile anche da riga di comando: eventvwr.exe
Per l'esempio indicato, su Windows Vista Ultimate, otteniamo:
Per approfondimenti, MSDN
Se in una nostra WPF Windows Application abbiamo la necessità di utilizzare il nuovo controllo WebBrowser per visualizzare del codice HTML, possiamo percorrere due strade, secondo delle nostre esigenze:
1) Il codice HTML deve essere visualizzato (ad esempio) sull'evento click di un controllo button: possiamo utilizzare i metodi NavigateToString(string text) o NavigateToStream(System.IO.Stream stream). Ad esempio, se scriviamo:
1 WebBrowserInstance.NavigateToString("<h2>Prova</h2><p>Ciao</p>");
otteniamo:
dove il codice XAML è:
1 <WebBrowser ClipToBounds="True" Name="WebBrowserInstance"></WebBrowser>
2) Se il codice HTML da visualizzare è ottenuto dinamicamente, sembra non essere presente (attualmente) un modo diretto per bindare il codice HTML ad una proprietà del controllo WebBrowser (anche se quest'ultimo è un DependencyObject). Per ovviare al problema possiamo creare un nuovo UserControl contenente un controllo WebBrowser. Il codice XAML dell'UserControl è:
1 <UserControl x:Class="MyNamespace.BindableWebBrowser"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 Height="300" Width="300" Loaded="UserControl_Loaded">
5 <Grid Name="contentGrid">
6 </Grid>
7 </UserControl>
8
Mentre il codice C# è:
1 namespace MyNamespace
2 {
3 public partial class BindableWebBrowser : UserControl
4 {
5
6 private WebBrowser _wb = null;
7
8 public WebBrowser Wb
9 {
10 get { return _wb; }
11 set { _wb = value; }
12 }
13
14 public BindableWebBrowser()
15 {
16 InitializeComponent();
17
18 _wb = new WebBrowser();
19 _wb.Margin = new Thickness(0);
20 contentGrid.Children.Add(_wb);
21 }
22
23 public string HtmlCode
24 {
25 get { return (string)GetValue(TextProperty); }
26 set { SetValue(TextProperty, value); }
27 }
28
29 public static readonly DependencyProperty TextProperty =
30 DependencyProperty.Register("HtmlCode", typeof(string),
31 typeof(BindableWebBrowser), new UIPropertyMetadata(string.Empty, new PropertyChangedCallback(HtmlDocumentChangedCallBack)));
32
33 public static void HtmlDocumentChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args)
34 {
35 BindableWebBrowser bindableWebBrowser = (BindableWebBrowser)property;
36 bindableWebBrowser.Wb.NavigateToString((string)args.NewValue);
37 }
38
39 private void UserControl_Loaded(object sender, RoutedEventArgs e)
40 {
41 }
42 }
43 }
In questo modo in una Window WPF, nel codice XAML, possiamo scrivere:
1 <local:BindableWebBrowser HtmlCode="<h3>Hello World!!!</h3>" Margin="24.577,60,12,0" Grid.Column="1" Height="65" VerticalAlignment="Top"></local:BindableWebBrowser >
oppure eseguire un binding del controllo in questo modo:
1 <local:BindableWebBrowser HtmlCode="{Binding Path=Description}" ></local:BindableWebBrowser >
Ottenendo, utilizzando il codice del primo caso, quanto segue:
Se invece il nostro scopo è semplicemente visualizzare un sito web, allora è sufficiente scrivere nel codice XAML:
1 <WebBrowser Source="http://blogs.ugidotnet.org/" ClipToBounds="True" Name="wbTest"></WebBrowser>
Senza scrivere un nuovo UserControl.
L'aspetto grafico dell'UserControl può essere notevolmente migliorato (parliamo di WPF :-)), ma spero che il codice possa ritornare utile.
Technorati Tag:
WPF,
WebBrowser