Code & Snippet
Esempi di codice e Snippet
Ci sono vari metodi di farlo ad esempio usare SQL-DMO (SQL Server 2000) o meglio ancora SMO (SQL Server 2005). Ma questi due metodi prevedono di installare sui client le relative dll.
Un altro modo invece è quello di usare MC-SQLR ovvero il SQL Server Resolution Protocol e quindi di inviare un pacchetto
CLNT_BCAST_EX e analizzare i pacchetti di risposta di risposta server SVR_RESP.
Qui trovate un esempio Locate SQL Server instances on the local network, l'autore aveva analizzato il traffico di rete per capire come funzionava il protocollo ora con la pubblicazione delle specifiche dei protocolli Microsoft non è più necessario: MC-SQLR]:...
Una delle impostazioni che possibile fare su un'istanza di SQL Server è quella del percorso di default in cui memorizzare file dati e logs di un nuovo database. Ho fatto diverse ricerca, ma non trovato un modo semplice per ricavare tramite T-SQL tali informazioni.
A quanto sembra se si modificano tali percorsi questi vengono memorizzati nelle chiavi di registry:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\DefaultData
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\DefaultLog
In caso contrario i path è quello specificato durante l'installazione per i File di dati quindi si può pensare di ricavarli dai path dei file mdf e ldf del database master.
Di seguito uno...
A volte mi capita di dover mettere mano a codice .NET 1.1 su Visual Studio 2003 e in questa versione la griglia nativa il DataGrid non era ricco di funzionalità. L'ultima richiesta che mi è arrivata è come realizzare l'autosizing delle righe per vedere completamente il contenuto delle righe le cui colonne vano su più righe. Manualment la cosa è possibiole quindi la funzionalità in effetti c'è ma non è esposta e quindi occorre utilizzare la reflection come indicato in questo link http://www.syncfusion.com/FAQ/winforms/FAQ_c44c.aspx
Di seguito la versione che ho realizzato:
Private Sub AutoSizeRows(ByVal columnStyle As System.Windows.Forms.DataGridColumnStyle)
Dim dataGrid As System.Windows.Forms.DataGrid = columnStyle.DataGridTableStyle.DataGrid
...
Lo script in se non è nulla di che nel senso basta utilizzare WMI per leggere la proprietà SerialNumeber della classe Win32_BIOS, inrealtà lo scopo di questo script è quello di creare una template per simili esigenze ovvero:
Gestire script utilizzabili da riga di comando con possibilità di richiedere dati all'utente
Utilizzare WMI
Connettersi anche a computer remoti
Visualizzare in forma tabellare i risultati
Tutte queste esigenze di fatto sono semplicemente realizzabili se si utilizza l'oggetto Microsoft.CmdLib disponibile in Windows XP e Windows 2003 Server,...
In questo articolo ho raccolto alcune riflessioni su come inviare mail tramite .NET Framework 1.1 e 2.0 utilizzando Exchange 2003 e Exchange 2007 analizzando le differenze relative alla gestione dell'autenticazione in .NET 1.1 e 2.0 e le modifiche apportate in Exchange 2007 rispetto a Exchange 2003.
A volte in uno script amministrativo può essere necessario dover comprimere un file e in tal caso una possibilità è quella di usare le cartelle comprese presenti a partire da XP.
[Update] Si tenga conto che Le cartelle compresse di XP hanno il limite di 4 GB
Option Explicit
Dim strScriptFullName, strCurrentPath, strZipFilePath, strAddFilePath
strScriptFullName = wscript.scriptfullname
strCurrentPath = Left(strscriptfullname, InStrRev(strScriptFullName, "\"))
strZipFilePath = strCurrentPath & "test.zip"
strAddFilePath = strCurrentPath & "test.txt"
'Crea un file zip vuoto
If CreateEmptyZip(strZipFilePath) Then
'Aggiunge un file all'archivio zip
Call AddFile2Zip(strZipFilePath, strAddFilePath)
End If
Function CreateEmptyZip(strZipFilePath)
On Error Resume Next
'Apertura file in scrittura
Dim objFso, objFile
Const ForWriting = 2
Set objFso = CreateObject("Scripting.FileSystemObject")
...
Mi sono cimentato nella realizzazione di una Sezione per MWPSK che mi permettesse di realizzare la funzionalità "Dove siamo"/"Where we are" presente nella maggior parte siti in modo più dinamico tramite una mappa di Virtual Earth.
La scelta è caduta su una Section perchè rispetto agli Easy Control permettono di avere dei dati di configurazione che possono essere poi salvati anche se l'implementazione di una Section è maggiormente complessa rispetto a quella di un Easy Control. In questo modo però è posiibile dare all'utente la possibilità di configurare la mappa consentendo la possibiltà di inserire latitudine e longitudine del centro mappa,...
Leggendo questo post di Corrado mi è venuto in mente un modo per formattare i valori booleani partendo dal fatto che CInt(True ) è -1 e CInt(False) è 0:
String.Format("Il valore è {0:Falso;Vero}.",CInt(booleanValue))
Per fare il preview di uno Screensaver in un oggetto container è possibile utilizzare il parametro /p dello stesso. Di seguito il codice per visualizzare uno Screensaver in una PictureBox:
Private Const ScreenSaverName As String = "ssbezier.scr"Private screenSaverProcess As System.Diagnostics.Process
Dim startInfo As New System.Diagnostics.ProcessStartInfostartInfo.Arguments = "/p " & Me.PictureBox1.Handle.ToString()startInfo.FileName = ScreenSaverNamestartInfo.UseShellExecute = FalsescreenSaverProcess = System.Diagnostics.Process.Start(startInfo)
Per arrestare la visualizzazione dello Screensaver basterà terminare il processo:screenSaverProcess.Kill()screenSaverProcess.Close()screenSaverProcess.Dispose()
Per ricavare la porta di una stampante in VS 2003 è possibile utilizzare WMI e in particolare la classe Win32_Printer :
Public Shared Function GetPrinterPortName(ByVal printerName As String) As String Dim portName As String = String.Empty Dim path As String = String.Format("Win32_Printer.DeviceID='{0}'", printerName) Dim p As New System.Management.ManagementObject(path)
p.Get() portName = p("PortName").ToString() p.Dispose() : p = Nothing
Return portNameEnd Function
Per utilizzare il codice occcore aggiungere un reference a System.Management.
In VS 2005 non ho trovato funzionalità native per ricavare la porta della stampante anche se inizialmente era previsto un My.Computer.Printers come si può leggere nel seguente articolo http://msdn.microsoft.com/msdnmag/issues/04/05/VisualBasic2005/ ma nella versione definitiva pare non sia poi stato implementato chissà se conteneva...
Nel caso in cui si abbia un pulsante che chuiude la form e e quando lo si seziona una validate di un controllo fallisce la form non verrà chiusa anche nel caso in cui sul pulsante si sia impostato CausesValidation = False.
Io ho risolto inserendo nel click del pulsante il seguente codice:
For Each cnt As System.Windows.Forms.Control In Me.Controls cnt.CausesValidation = False Next Me.CausesValidation = False
Me.Close()
Lo stesso comportamento lo si riscontra anche se si tenta di chiudere la form con il pulsante di chiusura di sustema (X rossa), a tal proposito si veda il seguente:A control's Validating event is...
Nel caso in cui nella rete si abbiano computer con SID identici, dovuto al fatto che l'installazione è stata fatta partendo da un'identica immagine tramite tool tipo Ghost qunado si installa WSUS si riscontreranno malfunzionamenti dovuti al fatto che le patch verranno distribuite solo ad una macchina in quanto WSU non sarà in grado di distinguerle.
A tal proposito si legga il seguente Attack of the Clones.
Se ci si trova in questa situazione occorrerà cabiare il SID alle macchine con strumenti quali Sysprep o Newsid e quindi eliminare i SID duplicati in WSUS e a questo proposito si veda Delete Duplicate SUS...
Dim wmiQuery, objWMIService, objPing, objStatus wmiQuery = "Select * From Win32_PingStatus Where Address = 'HostName'" Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set objPing = objWMIService.ExecQuery(wmiQuery) For Each objStatus In objPing If objStatus.StatusCode = 0 Then msgbox(objStatus.ProtocolAddress) Else msgbox("Unreachable") End If Next Set wmiQuery = Nothing Set objWMIService = Nothing Set objPing = Nothing Set objStatus = Nothing
Ovviamente il codice può essere trasportato anche in applicazioni .NET
UPDATE:Come detto da Marco Minerva nel suo post:http://blogs.ugidotnet.org/marcom/archive/2007/01/25/68646.aspx
Se la necessità è solo quella di ricavare gli indirizzi IP il .NET Framework offre nativamente la classe System.Net.DNS.GetHostEntry
Se invece l'esigenza è di taglio più sistemistico e...
Se nelle operazioni fra date è necessario tenere conto dell'ora legale è possibile utilizzare il metodo ToLocalTime:
Si veda il seguente codice:
Dim date1 As DateTime = #10/29/2006 2:00:00 AM#
Console.WriteLine(date1.AddHours(2))Console.WriteLine(date1.AddHours(2).ToLocalTime)
Output:29/10/2006 4.00.0029/10/2006 5.00.00
Per sapere se una data cade nel periodo dell'ora legale è possibile utilizzare il metodo System.TimeZone.CurrentTimeZone.IsDaylightSavingTime
Si veda il seguente codice:
Dim date1 As Date = #10/28/2006 2:00:00 AM#Dim date2 As Date = #10/29/2006 4:00:00 AM#
Console.WriteLine(System.TimeZone.CurrentTimeZone.DaylightName)Console.WriteLine(System.TimeZone.CurrentTimeZone.GetDaylightChanges(2006).Start)Console.WriteLine(System.TimeZone.CurrentTimeZone.GetDaylightChanges(2006).End)
Console.WriteLine(System.TimeZone.CurrentTimeZone.IsDaylightSavingTime(date1))Console.WriteLine(System.TimeZone.CurrentTimeZone.IsDaylightSavingTime(date2))
Output:ora solare Europa occidentale26/03/2006 2.00.0029/10/2006 3.00.00TrueFalse
Il .NET Framework 2.0 ha migliorato la gestione del binding e tramite queste nuove funzionalità è possibile gestire il valore nullo sui ComboBox i cui valori sono gestiti tramite binding su una DataTable, ma il cui SelectedValue può dove gestire il valore nullo.Un modo per risolvere questo problema può essere quello di aggiungere sulla DataTable che contiene i valori per il ComboBox una DataRow per la gestione del valore nullo.
Sia ad esempio ComboBoxSourceDataTable la DataTable che contiene i valori del ComboBox avente due colonne ID (Int32) e Descrizione (String).
Ipotizzando che il valore int32.MinValue per ID sia un valore al di...
Dovendo realizzare una DataGridViewColumn di tipo MaskedTextBox e NumericUpDown ho fatto un salto su Msdn dove ho trovato questo esempio per colonne MaskedTextBox:
DataGridView Custom Column Sample http://msdn2.microsoft.com/en-us/library/ms180996.aspx
tutto bene ma quando da IDE di tenta di impostare le proprietà custom il valore non viene memorizzato.
Dopo aver letto questo thread su Microsoft Connect:DataGridView Column Editor code generation issue http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=108961stavo quasi per considerarlo un bug, ma ne ero veramente poco convinto, infatti sulle colonne native del framework non ci sono problemi.
Poi ho provato questo esempio:Sviluppo di una cella e colonna NumericUpDown personalizzate per il controllo DataGridViewhttp://www.microsoft.com/italy/msdn/library/framework/winf_numericupdown.mspxe qui il problema non si presentava e...
In questo periodo ho creato un'applicazione per un magazzino che si occupava di stampare un etichetta per ogni pesatura effetuata da un operatore.Quindi ho creato un report con intestazione e dettaglio disabilitando le altre sezioni e utilizzando un DataSet come fonte dati, il tutto in ambiente VS 2003.Siccome sul pc era presente solo la stampante per le etichette mi è venuto naturale aggiungere alla form il report e usare il metodo PrintToPrinter per stamparlo.Il problema era che venivano eseguiti salti pagina non impostati dopo la stampa dell'etichetta.Per risolvere il problema ho usato il seguente codice: Me.rptEtichetta.Close() Me.rptEtichetta.SetDataSource(Nothing) Me.rptEtichetta.SetDataSource(Me.dstEtichetta) Me.rptEtichetta.PrintToPrinter(1, False,...
In questo post Rilevazione modifiche hardware avevo già affrontato questo problema valutando quali soluzioni venivano offerte da un punto di vista sistemistico.In questi giorni però ho avuto l'esigenza di forzare la rilevazione hardware via codice e dopo aver letto questo articolo della KB: How To Force Reenumeration of a Device Tree From an Application ne ho realizzato una versione in VB.NET 2005.Se vi può servire la trovate qui: MyRefreshHW2005
Uno snippet per i print job in corso.
Dim path As New System.Management.ManagementPath("root\cimv2")Dim options As New System.Management.ConnectionOptions
'Local Hostpath.Server = "."
'Remote Host'path.Server = "ServerName"'options.Username = "DomainName\UserName"'options.Password = "UserPassword"
Dim scope As New System.Management.ManagementScope(path, options)Dim query As New System.Management.ObjectQuery( _ "SELECT Name, Document, JobStatus, Owner, TotalPages, Size, TimeSubmitted FROM Win32_PrintJob")Dim search As New System.Management.ManagementObjectSearcher(scope, query)Dim objectCollection As System.Management.ManagementObjectCollection
objectCollection = search.Get()
Dim printerName, document, owner As StringDim pages, size As System.UInt32Dim timeSubmitted As DateTimeFor Each prntJob As System.Management.ManagementObject In objectCollection printerName = prntJob("Name").ToString().Split(","c)(0) document = prntJob("Document").ToString() owner = prntJob("Owner").ToString() pages = System.Convert.ToUInt32(prntJob("TotalPages")) size = System.Convert.ToUInt32(prntJob("Size")) timeSubmitted = System.Management.ManagementDateTimeConverter.ToDateTime( _ prntJob("TimeSubmitted").ToString())
Console.WriteLine("Printer: " & printerName) Console.WriteLine("Document: " & document) Console.WriteLine("Owner: " & owner) Console.WriteLine("Pages: " &...
Creando controlli o componenti custom capita di creare proprietà che referenzino oggetti e in molti casi si vorrebbe evitare di vedere le proprietà di questi oggetti.
In questi casi basta applicare alla proprietà il seguente attributo:<System.ComponentModel.TypeConverter(GetType(System.ComponentModel.ReferenceConverter))> _Public Property MyConfirmButton() As System.Windows.Forms.Button
In DOS esiste il pratico comando ATTRIB:http://www.microsoft.com/technet/prodtechnol/windowsserver2003/it/library/ServerHelp/56202570-64a8-424b-8a11-09f5b8584cab.mspx?mfr=true
In WSH invece è possibile ricorrere ad un codice del tipo che imposta l'attributo Archive per un singolo file o per tutti i file in una directory e relative subdirectory:
WSH.echo ToggleArchiveBit("F:\test.txt") SetArchiveBit("F:\Test")
Function ToggleArchiveBit(filePath) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile(filePath)
If objFile.Attributes And 32 then objFile.Attributes = objFile.Attributes XOR 32 ToggleArchiveBit = "Archive bit is cleared." Else objFile.Attributes = objFile.Attributes XOR 32 ToggleArchiveBit = "Archive bit is set." End If End Function
Function SetArchiveBit(Path) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder(Path) Set colSubfolders = objFolder.Subfolders For Each objSubfolder in...
Con il .NET Framework 1.0 e 1.1 un modo era ricorrere all'api SHGetFileInfo come descritto nel seguente:http://support.microsoft.com/kb/319340/en-us
Con l'introduzione del metodo ExtractAssociatedIcon del .Net framework 2.0 è possibile ottenere lo stesso risultato tramite l'utilizzo del registry evitando così l'utilizzo di PInvoke:
Public Shared Function GetFileExtensionIcon(ByVal fileExtension As String) As System.Drawing.Icon Dim defaultIconFile As String = Nothing
Dim keyExtension As Microsoft.Win32.RegistryKey
keyExtension = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("." & fileExtension)
If keyExtension IsNot Nothing Then 'Lettura program name Dim programName As String programName = keyExtension.GetValue(String.Empty).ToString
'Lettura program default icon Dim keyProgramDefaultIcon As Microsoft.Win32.RegistryKey keyProgramDefaultIcon = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey( _ programName & "\DefaultIcon")
If keyProgramDefaultIcon IsNot Nothing Then Dim...
Oggi avevo bisogno di usare in una form una DataTable e volevo che alla dispose della form venisse fatta anche la dispose della DataTable e tra me ho pensato potrei usare un DataSet che posso aggiungere come un componente e che verrà quindi aggiunto alla collezione components e alla Dispose della form verrà rilasciato visto che il codice generato per la dispose della form è il seguente:
'Form overrides dispose to clean up the component list. Protected Overrides Sub Dispose(ByVal disposing As Boolean) If disposing AndAlso components IsNot Nothing Then components.Dispose() End If MyBase.Dispose(disposing) End Sub
Peccato che la quando viene...
Il .NET framework 2.0 ha aggiunto alcuni nuovi editor, ad esempio ora esiste un editor per stringe di connessione (seppur minimalistico) di seguito un'esempio per utilizzarlo:
''' <summary>''' Stringa di connessione.''' </summary>''' <value></value>''' <returns></returns>''' <remarks></remarks><System.ComponentModel.Editor("System.Web.UI.Design.ConnectionStringEditor, System.Design", GetType(System.Drawing.Design.UITypeEditor)), _System.ComponentModel.Description("Stringa di connessione."), _System.ComponentModel.DefaultValue("")> _Public Property ConnectionString As String
Al seguente link un'elenco di editor che ereditano da UITypeEditor:http://msdn2.microsoft.com/it-it/library/bfc7teys.aspx
Siccomme a volte capita di dover implementare l'interfaccia System.ComponentModel.ICustomTypeDescriptor e creare un PropertyDescriptor Custom per rendere dinamico il comportamento di proprietà mi sono fatto un esempio da cui partire che rende una proprietà ReadOnly o meno sulla basa del valore di una seconda proprietà.
http://blogs.ugidotnet.org/alexblog/articles/41383.aspx
L'esempio è in VB.NET 2005, ma il codice funziona anche con le versioni precedenti del framework.
Il framework 2.0 ha introdotto il nuovo namespace System.Net.Mail per inviare posta tramite il protocollo SMTP.
Per gestire l'autenticazione verso un SMTP occorre instaziare un oggetto System.Net.NetworkCredential come mostrato nel seguente esempio che invia una mail utilizzando l'SMTP di Virgilio:
Dim message As New System.Net.Mail.MailMessage("mailfrom@dom.it", "mailto@virgilio.it", "Obj", "Body")Dim client As New System.Net.Mail.SmtpClient("out.virgilio.it")client.Credentials = New System.Net.NetworkCredential("mailto@virgilio.it", "password")client.Send(message)message.Dispose()
Il post è stato trasformato in Tip ed è disponibile al seguente link:http://www2.ugidotnet.org/tips/tips_read.aspx?ID=173
Per poter incollare su Excel basta che i dati siano separati da tabulazione e al termine di ogni riga vi sua un NewLine.
Dim sb As New System.Text.StringBuilderFor Each row As System.Data.DataRow In ds.MyTable.Rows For Each column As System.Data.DataColumn In ds.MyTable.Columns sb.Append(row(column)) sb.Append(ControlChars.Tab) Next sb.Append(ControlChars.NewLine)NextClipboard.SetDataObject(sb.ToString)
Ovviamente l'idea puo essere poi estesa per copiare ad esempio le righe selezionate di una DataGrid o GridView in un foglio di Excel.
Se si osserva il comportamente del client di Navison quando apre un database SQL Server si nota che vengono visualizzati solo i database di Navision a cui si può accedere con le credenziali fornite e non tutti quelli dell'istanza.Questo ci porta a fare la considerazione che il controllo viene fatto fatto sul database dove infatti troviamo la tabella $ndo$dbproperty che contiene un solo record con le informazioni di Navision (ad esempio nella colonna databaseversionno troviamo la versione).
Quindi per ottenere l'informazione possimao ricavare l'elenco dei database a cui si ha diritto di accedere con le credenziali fornite e controllare poi l'esistenza...
Queste informazioni sono reperibili tramite la seguente chiave di registro:HKEY_LOCAL_MACHINE\SOFTWARE\Navision\Microsoft Business Solutions-Navision
Questa chiave ha una sottochiave che rappresenta la versione installata (xes W1 4.00) che a sua volta contiene un valore Path che rapprasenta il percorso in cui è stato installato il client di Navision
Di seguito il codice per ottenere le informazioni in VB.Net:
Public Shared Function GetNavisionVersion() As String Dim value As String = String.Empty
Try Dim key As Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( _ "SOFTWARE\Navision\Microsoft Business Solutions-Navision", False)
value = key.GetSubKeyNames()(0) Catch ex As Exception Throw New System.ApplicationException("Navision Client is not installed.", ex) End Try
Return value End Function
...
Usando VS 2005 ho potuto apprezzare il lavoro fatto per quanto riguarda la gestione dei settings dell'applicazione che ora hanno due scope quello Application (solo read only nel senso che occorre modificare il file config) e quello User.Il problema però è che i TableAdapter utilizzano una stringa di connessione memorizzata nei settings, ma con scope Application quindi a runtime non è possibile modificare la stringa di connessione (tra l'altro a quanto pare non è possibile inserire nei settings una Connection String che abbia lo scope User confermate?).
Un modo per modificare la stringa di connessione lo trovate qui http://blogs.msdn.com/smartclientdata/archive/2005/07/25/443034.aspx e consiste...
Private Sub DownloadFile(ByVal url As String, ByVal filePath As String)
Dim webRequest As System.Net.WebRequest = System.Net.HttpWebRequest.Create(url) Dim webResponse As System.Net.WebResponse = webRequest.GetResponse() Dim inputStream As System.IO.Stream = webResponse.GetResponseStream()
Dim buffer(CInt(webResponse.ContentLength) - 1) As Byte inputStream.Read(buffer, 0, buffer.Length)
inputStream.Close() webResponse.Close() inputStream = Nothing webResponse = Nothing webRequest = Nothing
Dim fileStream As New System.IO.FileStream(filePath, IO.FileMode.CreateNew) Dim outputStream As New System.IO.BinaryWriter(fileStream)
outputStream.Write(buffer)
buffer = Nothing outputStream.Close() fileStream.Close() outputStream = Nothing fileStream = Nothing
End Sub
E' stato pubblicato un'articolo sulla KB per realizzare la feature in oggetto in C# che fa uso di PInvoke:
How to use Visual C# to obtain the color of the pixel that is referenced by the mouse pointerhttp://support.microsoft.com/default.aspx?scid=kb;en-us;892462
Il Visualizzatore immagini e fax per Windows non è
un'eseguibile bensì una funzionalità contenuta nella dll shimgvw.dll.Infatti
se tramite Opzioni Cartella andiamo a vedere quale applicazione viene aperta
quando in espora risorse facciamo doppio click su un file immagine notiamo che
viene utilizzata la seguente:rundll32.exe
C:\WINDOWS\System32\shimgvw.dll,ImageView_Fullscreen %1
Quindi possimao scrivere un codice di questo tipo
per aprire un'immagine tramite il Visualizzatore:
Dim p As New
System.Diagnostics.Processp.StartInfo.FileName = "rundll32.exe"p.StartInfo.Arguments =
System.IO.Path.Combine(System.Environment.SystemDirectory,
"shimgvw.dll")p.StartInfo.Arguments &=
",ImageView_Fullscreen"p.StartInfo.Arguments &= "
E:\MyImg.gif"p.StartInfo.UseShellExecute = Falsep.StartInfo.Verb =
"open"p.Start()
Analogamente è possibile stampare su una stampate a
scelta:
Dim p As New
System.Diagnostics.Processp.StartInfo.FileName =
"rundll32.exe"p1.StartInfo.Arguments =
System.IO.Path.Combine(System.Environment.SystemDirectory,
"shimgvw.dll")p.StartInfo.Arguments &= ",ImageView_PrintTo
/pt"p.StartInfo.Arguments &= "...
How to use the Windows Forms NotifyIcon component in Visual Basic .NET to
display an icon for an application in the notification areahttp://support.microsoft.com/?scid=kb;en-us;903898
Dalla Knowbase ecco un paio di soluzioni su come implementare il ping
How to ping an IP address by using sockets in Visual Basic .NEThttp://support.microsoft.com/default.aspx?scid=kb;en-us;828993
HOW TO: Ping an IP address with Visual Basic by using ICMP http://support.microsoft.com/kb/300197/
Enterprise SOA Application Demo
Discover
an SOA solution that uses InfoPath, BizTalk, ASP.NET Web Services, RPG on
an AS/400, CICS on a Mainframe, J2EE on WebSphere, Pocket PC, SQL Server,
Speech Server, and MOM (8/19/2005).
Microsoft Electronic Product Code...
Tramite il seguente codice è possibile creare una share di rete senza fare
ricorso alle Api (ovviamente con performance minori rispetto a
quest'ultime).I sistemi operativi supportati sono:
Windows Server 2003
Windows XP
Windows 2000 Professional/Server
Windows NT Workstation/Server 4.0 SP4 e
successivi
Dim path As New
System.Management.ManagementPath("Win32_Share")Dim share As New System.Management.ManagementClass(Nothing, path, Nothing)
Dim inArgs As
System.Management.ManagementBaseObjectinArgs =
share.GetMethodParameters("Create")inArgs("Path") =
"C:\MyFolder"inArgs("Name") = "ShareName" '"ShareName$" for hide shareinArgs("Type") =
0inArgs("MaximumAllowed") = NothinginArgs("Description") = Nothing
Dim outArgs As
System.Management.ManagementBaseObjectoutArgs = share.InvokeMethod("Create",
inArgs, Nothing)
inArgs.Dispose() : inArgs = NothingoutArgs.Dispose() : outArgs = Nothingshare.Dispose() : share =
Nothingpath =
Nothing
Per maggiori info sul metodo create della...
Caricando il PictureBox utilizzando un MemoryStream si evita di tenere bloccato il file.
'Caricamento file nel BufferDim fs As New System.IO.FileStream("E:\Test.bmp", IO.FileMode.Open, IO.FileAccess.Read)Dim buffer(CInt(fs.Length) - 1) As Byte
fs.Read(buffer, 0, CInt(fs.Length))fs.Close() : fs = Nothing
'Caricamento Buffer nel MemoryStreamDim ms As New System.IO.MemoryStream(buffer)buffer = Nothing
'Lettura immagine da MemoryStreamMe.PictureBox1.Image = System.Drawing.Image.FromStream(ms)
Uno snippet per elencare gli applicativi installati su un pc.
Dim path As New System.Management.ManagementPath("root\cimv2")Dim options As New System.Management.ConnectionOptions
'Local Hostpath.Server = "."
'Remote Host'path.Server = "ServerName"'options.Username = "DomainName\UserName"'options.Password = "UserPassword"
Dim scope As New System.Management.ManagementScope(path, options)Dim query As New System.Management.ObjectQuery("SELECT * FROM Win32_Product")Dim search As New System.Management.ManagementObjectSearcher(scope, query)Dim objectCollection As System.Management.ManagementObjectCollection
objectCollection = search.Get()
For Each myObject As System.Management.ManagementObject In objectCollection Console.WriteLine(myObject.GetPropertyValue("Caption"))Next
Nel il framework .Net 2.0 è stato aggiunto l'attributo DisplayName che permette di personalizzare la visualizzazione del nome della proprietà.
Public Class MySettings Private DataFilePathValue As String
<system.componentmodel.DisplayName("Path file dati")> _ <system.ComponentModel.Description("Path del file utilizzato per memorizzare i dati.")> _ Public Property DataFilePath() As String Get Return Me.DataFilePathValue End Get Set(ByVal value As String) Me.DataFilePathValue = value End Set End Property
End Class
Se posizioniamo una Label su una Picturebox e impostiamo la proprietà BackColor della Label a System.Drawing.Color.Transparent per renderla traparente notiamo che non diventa trasparente rispetto alla Picturebox.
Il motivo di questo comportamento lo troviamo su MSDN Proprietà Control.BackColor:
La proprietà BackColor non supporta i colori trasparenti a meno che il bit di stile di ControlStyles.SupportsTransparentBackColor non sia impostato su true.
La proprietà BackColor è una proprietà di ambiente. Una proprietà di ambiente è una proprietà di un controllo che, se non impostata, viene recuperata dal controllo padre. Per impostazione predefinita, a un controllo Button sarà associata, ad esempio, la stessa proprietà BackColor del controllo...
Per sincronizzare lo scroll orizzontale di due Datagrid si può utilizzare la Reflection per accedere alla proprietà Friend del DataGrid HorizontalOffset.
Il trucco sta nel ricavare nell'evento Scroll del primo DataGrid il relativo valore di HorizontalOffset e impostarlo sulla seconda DataGrid:
Private Sub DataGrid1_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.Scroll
Dim horizontalOffset1 As System.Reflection.PropertyInfo
horizontalOffset1 = Me.DataGrid1.GetType().GetProperty("HorizontalOffset", _ System.Reflection.BindingFlags.NonPublic Or _ System.Reflection.BindingFlags.GetProperty Or _ System.Reflection.BindingFlags.Instance)
Dim horizontalOffset2 As System.Reflection.PropertyInfo
horizontalOffset2 = Me.DataGrid2.GetType().GetProperty("HorizontalOffset", _ System.Reflection.BindingFlags.NonPublic Or _ System.Reflection.BindingFlags.GetProperty Or _ System.Reflection.BindingFlags.Instance)
horizontalOffset2.SetValue(Me.DataGrid2, _ horizontalOffset1.GetValue(Me.DataGrid1, Nothing), Nothing)
End Sub
Se il Textbox ha la proprietà Multiline =True le seguenti due righe di codice presentano una differenza:
Me.TextBox1.Text &= "Riga di test " & index & ControlChars.NewLine
Me.TextBox1.AppendText("Riga di test " & index & ControlChars.NewLine)
Il metodo AppendText fa in modo che il Textbox visualizzi sempre la parte finale del testo gestendo in automatico lo scroll.
Da prove effettuate pare se si crea un componente/controllo e poi una bitmap (16 x 16 16 colori) con lo stesso nome del controllo/componente questa viene attribuita come ToolboxBitmap anche senza utilizzare l'attributo ToolboxBitmap.Nel caso il controllo sia in un Namespace (interno di quello di root) basta dare rinominare la bitmap come:Namespace.NomeControlloComponente.bmp
Mi annoto per futura memoria le istruzione per connettersi all'SMTP Server di Virgilio e Libero tramite System.Web.Mail.
Il trucco sta nell'impostare la collezione Fields dell'oggetto MailMessage utilizzando i corretti valori del field smtpauthenticate di cui riporto il significato:0=Perform no authentication1=Use the basic (clear text) authentication mechanism2=Use the NTLM authentication mechanism
Connessione a Virgilio:Dim mail As New System.Web.Mail.MailMessageSystem.Web.Mail.SmtpMail.SmtpServer = "out.virgilio.it"mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "0")
Richiede l'impostazione esplicita della connessione senza autenticazione.
Connessione a Libero:Dim mail As New System.Web.Mail.MailMessageSystem.Web.Mail.SmtpMail.SmtpServer = "mail.libero.it"
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "0")
Oppure
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1")mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "user@libero.it")mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "password")
Richiede l'impostazione esplicita della connessione senza autenticazione oppure la connessione autenticata.
Oggi mentre stavo scrivendo del codice per caricare un ListView mi sono imbattuto in un errore (mio sia ben chiaro) subdolo (almeno per me).
Per velocizzare il caricamento del listview mi ero creato un arraylist contenente gli item da aggiungenre e per aggiugerli al ListView ho usato il metodo AddRange:
Me.lsvMain.Items.AddRange(DirectCast(items.ToArray(), System.Windows.Forms.ListViewItem()))
Risultato un errore a runtime di Invalid Cast.Ed è vero perche il metodo ToArray restituisce un array di Object quindi la DirectCast non può funzionare.
Ciò che è strano però è che neppure il CType funziona:
Me.lsvMain.Items.AddRange(CType(items.ToArray(), System.Windows.Forms.ListViewItem()))
A questo punto la soluzione è stata quella di utilizzare un override della ToArray
Me.lsvMain.Items.AddRange(DirectCast(items.ToArray(GetType(System.Windows.Forms.ListViewItem)), System.Windows.Forms.ListViewItem()))
Su Ugi è stato pubblicato un mio articolo sui Windows Hooks.http://www.ugidotnet.org/articles/articles_read.aspx?ID=94
Nell'articolo ho inserito anche una classe per un'utilizzo più agevole degli hooks.
Un grazie a Raffaele Rialdi per avermi rivelato alcuni retroscena.
Come molti di voi sapranno per far sì che sul DataGrid si possa selezionare una sola riga si ricorre spesso alla soluzione reperibile su Syncfusion.com di cui riporto di seguito il codice:
Public Class MyDataGrid Inherits DataGrid
Private oldSelectedRow As Integer
Protected Overloads Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) 'don't call the base class if left mouse down If (e.Button <> MouseButtons.Left) Then MyBase.OnMouseMove(e) End If End Sub
Protected Overloads Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) 'don't call the base class if in header Dim hti As DataGrid.HitTestInfo hti = Me.HitTest(New Point(e.X, e.Y))
If (hti.Type = DataGrid.HitTestType.Cell) Then If (oldSelectedRow > -(1)) Then ...
Ecco una funzioncina nata da una domanda sul Newsgroup di Vb.Net per generare un file ico da uno bmp.
Public Sub BmpToIcon(ByVal fileName As String) Dim bitmap As System.Drawing.Bitmap = _ New System.Drawing.Bitmap(fileName) Dim hIcon As IntPtr = bitmap.GetHicon()
Dim icon As System.Drawing.Icon = _ System.Drawing.Icon.FromHandle(hIcon)
Dim stream As IO.Stream = IO.File.OpenWrite( _ System.IO.Path.GetDirectoryName(fileName) & _ System.IO.Path.GetFileNameWithoutExtension(fileName) & ".ico")
icon.Save(stream)
stream.Close()
icon.Dispose() bitmap.Dispose()End Sub
Una delle domande che ogni tanto ricorrono nel NG di VB.NET è come ricavare il valore di una variabile conoscendo il nome. Supponendo di essere all'interno di una form ecco una soluzione al problema basata sulla Reflection:
Public Variabile As String = "Valore"
MsgBox(GetValueByName("Variabile"))Public Function GetValueByName(ByVal name as String) As String Dim field As System.Reflection.FieldInfo field = Me.GetType.GetField(name) Return field.GetValue(Me).ToString()End Function
Il metodo è estendibile comunque anche ad altri scenari.
Ecco un paio di funzioni che ho scritto per creare e aprire un file udl tramite la DataLink Dialog utilizzando il namespace System.Diagnostics evitando così il reference ad AdoDb:
Public Shared Function CreateUDLFile(ByVal udlFilePath As String) As Boolean Dim file As New System.IO.FileInfo(udlFilePath) 'Creazione file file.Create().Close() 'Apertura file OpenUDLFile(udlFilePath) 'In caso di annullamento il file non viene generato e lo si elimina If file.Length = 0 Then file.Delete() Return False End If Return TrueEnd Function
Public Shared Sub OpenUDLFile(ByVal udlFilePath As String) Dim process As System.Diagnostics.Process process = System.Diagnostics.Process.Start(udlFilePath) process.WaitForExit() process.Close() process.Dispose() process = NothingEnd Sub
Un modo per capire se una stringa OleDb si riferisce a SQLServer è quello di controllarne il provider tramite una regular expression:
Public Overloads Shared Function IsSqlConnectionString(ByVal connectionString As String) As Boolean Dim regex As New System.Text.RegularExpressions.Regex("Provider\s*=\s*SQLOLEDB[^;]*;", System.Text.RegularExpressions.RegexOptions.IgnoreCase) Return regex.IsMatch(connectionString)End Function
L'idea è ovviamente esensibile ad altri provider.
Il CommandBuilder è un oggetto che se fosse più flessibile avrebbe sicuramente attratto maggiormente gli sviluppatori, una sua pessima abitudine è quella di invalidare le modifiche fatte ai comandi da lui generati.Per maggior info si veda il seguente:PRB: CommandBuilder Changes Modified Commands Back to Original
Un modo per aggirare il problema può essere quello di clonare il comando generato ed aggiungere la modifica necessaria.
Esempio:
da.InsertCommand = DirectCast(DirectCast(da.InsertCommand, System.ICloneable).Clone, _ System.Data.IDbCommand)da.InsertCommand.CommandText &= "; SELECT SCOPE_IDENTITY() AS ID"da.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
A volte torna utile utilizzare la Data Link per generare le stringhe di connessione:http://www.ugidotnet.org/tips/tips_read.aspx?ID=116La Data Link però ci restituisce una stringa di connessione per OleDb alla quale deve essere rimosso il parametro Provider per essere utilizzata per inizializzare un oggetto SqlConnection.
Un modo può essere quello di utilizzare una regular expression:
Public Shared Function GetSqlConnectionString(ByVal oledbConnectionString As String) As String
Dim regex As New System.Text.RegularExpressions.Regex("Provider=[^;]*;", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
Return regex.Replace(oledbConnectionString, String.Empty)
End Function
Un modo per associare ad un controllo personalizzato un'icona da visualizzare nella Toolbox è il seguente:1) Creare una bitmap di dimensione 16x16 (il colore del pixel nell'angolo in basso a sinistra rappresenta il colore trasparente)
2) Impostare il nome della bitmap a NomeControllo.bmp o NomeNamespace.NomeControllo.bmp se il controllo risiede all'interno di un Namespace.
3) Impostandone la proprietà Build Action della bitmap a Embedded Resource
4) Impostare il seguente attributo sul controllo: <System.Draving.TollboxBitmap(GetType(NomeControllo))>_ Public Class NomeControllo
Quando in una form si deve gestire una tabella avente 2 o più campi i cui valori sono in relazione con i dati contenuti in un'altra tabella (xes si pensi al caso delle provincie per una semplice anagrafica che ha 2 indirizzi: abitazione e ufficio) viene spontaneo utilizzare due ComboBox bindati sulla DataTable collegata. Così facendo però i valori dei ComboBox risultano sincronizzati in quanto il BindingContext è unico per entrambi e non c'è modo di assegare valori diversi ai due controlli.
La soluzione è quella di creare per il secondo ComboBox un nuovo BindingContext:combobox2.BindingContext = New System.Windows.Forms.BindingContext
Questa funzione permette di verificare se un testo è visualizzabile integralmente in un area prefissata e può essere utile nei casi in cui si voglia visualizzare un ToolTip per testi che superano lo spazio messo a disposizione da un controllo (xes. un tooltip sugli item di un ListView in modalità dettaglio il cui testo supera la larghezza della colonna)
Public Function IsTextExceedSize(ByVal graphics As System.Drawing.Graphics, _ ByVal text As String, _ ByVal font As System.Drawing.Font, ByVal width As Integer, _ ByVal height As Integer) As Boolean
Dim textSize As System.Drawing.SizeF Dim charactersFitted, linesFitted As Integer Dim layoutRect As New System.Drawing.SizeF(width, height)
textSize = graphics.MeasureString(text, font, layoutRect,...
Si supponga di avere un ListBox a multiselezione su cui si è impostato DataSource, ValueMember e DisplayMember.Per ricavare i ValueMember selezionati basta notare che in questo caso gli Items sono dei DataRowView.
For index As Integer = 0 To Me.ListBox1.SelectedIndices.Count - 1 With DirectCast(Me.ListBox1.Items(Me.ListBox1.SelectedIndices(index)), _ System.Data.DataRowView) MsgBox(.Row(Me.ListBox1.ValueMember).ToString) End WithNext
Dim myProcess As New ProcessDim myProcessStartInfo As New ProcessStartInfo("cmd.exe")myProcessStartInfo.Arguments = "/C dir c:"myProcessStartInfo.UseShellExecute = FalsemyProcessStartInfo.RedirectStandardOutput = TruemyProcess.StartInfo = myProcessStartInfomyProcess.Start()Console.WriteLine(myProcess.StandardOutput.ReadToEnd)myProcess.Close()
Ha volte capita di voler gestire tramite il controllo PropertyGrid delle date i cui valori sono memorizzati in un database, diventa quindi necessario gestire il caso della data nulla.
Si supponga di avere la seguente tabella:Config ID (PK String) Data (Date)
per cui si è proveduto a generare una DataTest tipizzato ConfigSchema contenente la DataTable tipizzata Config.Per poter gestire i dati tramite un PropertyGrid è necessario costruirsi una Classe wrapper avente due proprietà ID e Data:
Public Class ConfigWrapper Private _Row As ConfigSchema.ConfigRow
Public Sub New(ByVal row As ConfigSchema.ConfigRow) Me._Row = row End Sub
Public Property ID() As String Get Return Me._Row.ID End...
A volte può capitare (almeno a me) di utilizzare l'evento Validanting per delle decodifiche (xes IDCliente - RagioneSociale) appare chiaro che in situazioni come questa sarebbe utile avere una funzione PerformValidating, che invochi l'elaborazione contenuta nell'evento e ci dica se la validazione è riuscita o meno, da utilizzare quando modifichiamo il record per evitare la ripetizione del codice di decodifica o tortusi escamotage per richiamare la funzione a cui è collegato l'evento Validating.
Un modo per ottenere tale risultato può essere quello di ricorrere alla Reflection:
Function PerformValidating(ByVal control As System.Windows.Forms.Control) As Boolean
control.Focus()
Dim method As System.Reflection.MethodInfo
method = control.GetType.GetMethod("OnValidating", _ ...
Molto spesso per comodità si utilizzano nei programmi gli enumerativi e altrettanto spesso si desidererebbe associare agli elementi una descrizione da utilizzare poi sull'interfaccia utente.
Un metodo può essere quello di utilizzare l'attibuto System.ComponentModel.Description come segue:
Public Enum Prove As Integer _ Uno _ Due _ TreEnd Enum
Per recuperare poi queste descrizioni si può utilizzare la reflection come segue:
Dim fields() As System.Reflection.FieldInfofields = GetType(Prove).GetFields(Reflection.BindingFlags.Public Or _ Reflection.BindingFlags.Static)
For Each field As System.Reflection.FieldInfo In fields Dim descriptions() As Object descriptions = field.GetCustomAttributes( _ GetType(System.ComponentModel.DescriptionAttribute), _ False)
If descriptions.Length > 0 Then MsgBox(DirectCast(descriptions(0), _ System.ComponentModel.DescriptionAttribute).Description) End If
Next