<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Andrea Zingoni's blog</title>
        <link>http://community.dotnetwork.it/AndreaZ/Default.aspx</link>
        <description>Se un problema si può risolvere... perché arrabbiarsi? Se un problema non si può risolvere... perché arrabbiarsi?</description>
        <language>it-IT</language>
        <copyright>Andrea Zingoni</copyright>
        <managingEditor>andrea.zingoni@poste.it</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <image>
            <title>Andrea Zingoni's blog</title>
            <url>http://community.dotnetwork.it/images/RSS2Image.gif</url>
            <link>http://community.dotnetwork.it/AndreaZ/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Web Services: impossibile caricare la sezione di configurazione endpoint</title>
            <category>Visual Basic.Net</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/web-services-impossibile-caricare-la-sezione-di-configurazione-endpoint.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Lavorando (“smanettando”) coi Web Services si potrebbe incorrere nella seguente eccezione di Visual Studio:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;“Impossibile caricare la sezione di configurazione endpoint per il contratto 'mio Web Service Soap'. Trovata più di una configurazione per il contratto. Indicare la sezione di configurazione endpoint preferita per nome.”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt; &lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" border="0" src="http://www.andreazingoni.it/images/EndPoint.PNG" /&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;L’errore non sta nella configurazione del server, bensì nella configurazione dell’applicazione che deve collegarsi al Web Service.&lt;/p&gt;  &lt;p&gt;Succede che nel file di configuazione dell’applicazione talvolta vengano generati in automatico due riferimenti uguali allo stesso Web Service.&lt;/p&gt;  &lt;p&gt;Per correggere l’errore basta aprire il file di configurazione dell’applicazione selezionandolo da Esplora Soluzioni di Visual Studio:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.andreazingoni.it/images/EndPoint 2.PNG" /&gt;  &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Scorrerlo ed identificare il tag &lt;strong&gt;&amp;lt;endpoint&amp;gt;&lt;/strong&gt; in cui viene configurata la chiamata al Web Service.&lt;/p&gt;  &lt;p&gt;A questo punto è possibile notare la doppia dichiarazione:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.andreazingoni.it/images/EndPoint 3.PNG" /&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Basterà quindi eliminare la seconda (terza, o quarta… :-P) dichiarazione per far funzionare correttamente la nostra applicazione.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;HTH&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;PS: Perchè in italiano c’è pochissima documentazione a riguardo??…&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f2acec5d-c14b-4f38-a6d7-0b3d67485c9e" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/WebServices/default.aspx" rel="tag"&gt;WebServices&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/379.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/web-services-impossibile-caricare-la-sezione-di-configurazione-endpoint.aspx</guid>
            <pubDate>Tue, 09 Mar 2010 14:18:06 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/379.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/web-services-impossibile-caricare-la-sezione-di-configurazione-endpoint.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/379.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Macro per inserire immagini in Word 2007 e creare automaticamente un PDF</title>
            <category>Varie</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-inserire-immagini-in-word-2007-e-creare-automaticamente.aspx</link>
            <description>&lt;p&gt;Sfruttando gli ultimi 2 post: &lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx"&gt;Macro per utilizzare lo scanner da Word 2007&lt;/a&gt; e &lt;a href="http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx"&gt;Esportare un documento Office 2007 in PDF&lt;/a&gt;, ho leggermente automatizzato il procedimento aziendale di “scansione, inserimento immagni, esportazione in PDF”.&lt;/p&gt;  &lt;p&gt;Tutta la procedura viene svolta da una semplice macro:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;&lt;span class="kwrd"&gt;Sub&lt;/span&gt; Crea_PDF()
&lt;span class="rem"&gt;'&lt;/span&gt;
&lt;span class="rem"&gt;' Crea_PDF Macro&lt;/span&gt;
&lt;span class="rem"&gt;' Riduce i margini del foglio.&lt;/span&gt;
    &lt;span class="kwrd"&gt;With&lt;/span&gt; Selection.PageSetup
        .LineNumbering.Active = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .Orientation = wdOrientPortrait
        .TopMargin = CentimetersToPoints(1.27)
        .BottomMargin = CentimetersToPoints(1.27)
        .LeftMargin = CentimetersToPoints(1.27)
        .RightMargin = CentimetersToPoints(1.27)
        .Gutter = CentimetersToPoints(0)
        .HeaderDistance = CentimetersToPoints(1.25)
        .FooterDistance = CentimetersToPoints(1.25)
        .PageWidth = CentimetersToPoints(21)
        .PageHeight = CentimetersToPoints(29.7)
        .FirstPageTray = wdPrinterDefaultBin
        .OtherPagesTray = wdPrinterDefaultBin
        .SectionStart = wdSectionNewPage
        .OddAndEvenPagesHeaderFooter = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .DifferentFirstPageHeaderFooter = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .VerticalAlignment = wdAlignVerticalTop
        .SuppressEndnotes = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .MirrorMargins = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .TwoPagesOnOne = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .BookFoldPrinting = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .BookFoldRevPrinting = &lt;span class="kwrd"&gt;False&lt;/span&gt;
        .BookFoldPrintingSheets = 1
        .GutterPos = wdGutterPosLeft
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;With&lt;/span&gt;
    
&lt;span class="rem"&gt;' Scannerizza le immagini.&lt;/span&gt;
&lt;span class="kwrd"&gt;On&lt;/span&gt; &lt;span class="kwrd"&gt;Error&lt;/span&gt; &lt;span class="kwrd"&gt;Resume&lt;/span&gt; &lt;span class="kwrd"&gt;Next&lt;/span&gt;
WordBasic.InsertImagerScan
          
&lt;span class="rem"&gt;' Esporta in PDF.&lt;/span&gt;
ActiveDocument.ExportAsFixedFormat OutputFileName:= _
        &lt;span class="str"&gt;"C:\Documents and Settings\Andrea\Desktop\Doc1.pdf"&lt;/span&gt;, ExportFormat:= _
        wdExportFormatPDF, OpenAfterExport:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, OptimizeFor:= _
        wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, &lt;span class="kwrd"&gt;To&lt;/span&gt;:=1, _
        Item:=wdExportDocumentContent, IncludeDocProps:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, KeepIRM:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, _
        CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, _
        BitmapMissingFonts:=&lt;span class="kwrd"&gt;True&lt;/span&gt;, UseISO19005_1:=&lt;span class="kwrd"&gt;False&lt;/span&gt;
        
        &lt;span class="rem"&gt;' Messaggio di notifica.&lt;/span&gt;
        MsgBox &lt;span class="str"&gt;"Creazione del file PDF completata."&lt;/span&gt;, vbInformation, &lt;span class="str"&gt;"Crea PDF"&lt;/span&gt;
                 
&lt;span class="rem"&gt;' Chiude Word chiedendo conferma.&lt;/span&gt;
Application.Quit

&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;NB: In questo caso il file PDF viene generato nel “C:\Documents and Settings\Andrea\Desktop”, sempre col solito nome (Doc1.pdf). Questa è una soluzione rapida per chi, come me, crea dei semplici file temporanei. E’ invece possibile personalizzare i nomi dei file inserendo ad esempio una &lt;a href="http://msdn.microsoft.com/it-it/library/6z0ak68w(VS.80).aspx" target="_blank"&gt;inputbox&lt;/a&gt; prima dell’esportazione.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1f89b1b8-a6bf-4b08-be83-c5cf7debf767" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Office+2007/default.aspx" rel="tag"&gt;Office 2007&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Word+2007/default.aspx" rel="tag"&gt;Word 2007&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/378.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-inserire-immagini-in-word-2007-e-creare-automaticamente.aspx</guid>
            <pubDate>Tue, 09 Mar 2010 09:56:23 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/378.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-inserire-immagini-in-word-2007-e-creare-automaticamente.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/378.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Esportare un documento Office 2007 in PDF</title>
            <category>Varie</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx</link>
            <description>&lt;p&gt;Per esportare un documento Office 2007 (Word, Excel) in PDF, basta installare questo componente aggiuntivo scaricabile direttamente dal sito Microsoft:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=4d951911-3e7e-4ae6-b059-a2e79ed87041&amp;amp;displaylang=it" href="http://www.microsoft.com/downloads/details.aspx?familyid=4d951911-3e7e-4ae6-b059-a2e79ed87041&amp;amp;displaylang=it"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=4d951911-3e7e-4ae6-b059-a2e79ed87041&amp;amp;displaylang=it&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una volta installato il componente basterà poi cliccare su: Pulsante Office=&amp;gt;Salva con nome=&amp;gt;PDX o XPS.&lt;/p&gt;  &lt;p&gt;That's all folks!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0295b0b7-1f17-4263-b5a7-d742abbb3e6c" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/office/default.aspx" rel="tag"&gt;office&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Word+2007/default.aspx" rel="tag"&gt;Word 2007&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Excel+2007/default.aspx" rel="tag"&gt;Excel 2007&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/377.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx</guid>
            <pubDate>Tue, 09 Mar 2010 09:44:53 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/377.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/esportare-un-documento-office-2007-in-pdf.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/377.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Macro per utilizzare lo scanner da Word 2007</title>
            <category>Varie</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx</link>
            <description>&lt;p&gt;Per scrivere una macro che utilizza lo scanner da Word 2007 basta una sola riga di codice:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;WordBasic.InsertImagerScan&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;In questo modo, appena effettuata la scansione, l’immagine verrà inserita automaticamente all’interno del documento.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2c5ec28c-3d74-4675-9163-f2d1fcdb6006" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Office/default.aspx" rel="tag"&gt;Office&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Word+2007/default.aspx" rel="tag"&gt;Word 2007&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/376.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx</guid>
            <pubDate>Tue, 09 Mar 2010 09:36:12 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/376.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2010/03/09/macro-per-utilizzare-lo-scanner-da-word-2007.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/376.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Intercettare l&amp;rsquo;evento ItemCheck della CheckedListBox</title>
            <category>Visual Basic.Net</category>
            <category>Varie</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/12/14/intercettare-lrsquoevento-itemcheck-della-checkedlistbox.aspx</link>
            <description>&lt;p&gt;Sfortunatamente la &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.forms.checkedlistbox.objectcollection.aspx" target="_blank"&gt;CheckedListBox&lt;/a&gt; non possiede un evento che si scatena dopo che è stato “flaggato” un item, percui è difficile poter interagire direttamente con l’elemento selezionato.&lt;/p&gt;  &lt;p&gt;E’ possibile aggirare il problema creando degli items personalizzati visto che all’interno della CheckedListBox è possibile aggiungere qualunque oggetto indicizzato (che espone l’interfaccia &lt;a href="http://msdn.microsoft.com/it-it/library/s4ys34ea(VS.95).aspx" target="_blank"&gt;IDictionary&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Creiamo una classe personalizzata che rappresenti un item e che abbia una proprietà di tipo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.forms.checkstate.aspx" target="_blank"&gt;CheckState&lt;/a&gt; che memorizzi il flag impostato dalla CheckedListBox che lo contiene.&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;&lt;span class="rem"&gt;' Oggetto personalizzato myChekedItem.&lt;/span&gt;
&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; myChekedItem
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _Nome &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
    &lt;span class="kwrd"&gt;Property&lt;/span&gt; Nome() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Get&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; _Nome
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Get&lt;/span&gt;
        &lt;span class="kwrd"&gt;Set&lt;/span&gt;(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; value &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;)
            _Nome = value
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Set&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt;

    &lt;span class="kwrd"&gt;Private&lt;/span&gt; _Stato &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState
    &lt;span class="kwrd"&gt;Property&lt;/span&gt; Stato() &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState
        &lt;span class="kwrd"&gt;Get&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; _Stato
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Get&lt;/span&gt;
        &lt;span class="kwrd"&gt;Set&lt;/span&gt;(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; value &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState)
            _Stato = value
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Set&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Property&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt;(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; nome &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; stato &lt;span class="kwrd"&gt;As&lt;/span&gt; CheckState)
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.Nome = nome
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.Stato = stato
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Overrides&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; ToString() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;.Nome
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;
&lt;span class="kwrd"&gt;End&lt;/span&gt; Class&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Eseguendo l’overrides della funzione &lt;a href="http://msdn.microsoft.com/it-it/library/ms173154.aspx" target="_blank"&gt;.ToString&lt;/a&gt; della classe base, permetteremo alla CheckedListBox di visualizzare automaticamente la proprietà Nome nell’item personalizzato, senza dover impostare la proprietà (nascosta) DisplayMember.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Popoliamo la CheckedListBox con gli items personalizzati.&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; Form1_Load(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sender &lt;span class="kwrd"&gt;As&lt;/span&gt; System.&lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; e &lt;span class="kwrd"&gt;As&lt;/span&gt; System.EventArgs) &lt;span class="kwrd"&gt;Handles&lt;/span&gt; &lt;span class="kwrd"&gt;MyBase&lt;/span&gt;.Load
        &lt;span class="rem"&gt;' Aggiunge gli oggetti myChekedItem alla CheckedListBox.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.CheckedListBox1.Items.Add(&lt;span class="kwrd"&gt;New&lt;/span&gt; myChekedItem(&lt;span class="str"&gt;"prova Item personalizzato 1"&lt;/span&gt;, CheckState.Indeterminate))
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.CheckedListBox1.Items.Add(&lt;span class="kwrd"&gt;New&lt;/span&gt; myChekedItem(&lt;span class="str"&gt;"prova Item personalizzato 2"&lt;/span&gt;, CheckState.Indeterminate))
    &lt;span class="kwrd"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;

&lt;p&gt;Intercettiamo l’evento .ItemCheck della CheckedListBox e risaliamo all’item personalizzato selezionato:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; CheckedListBox2_ItemCheck(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sender &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; e &lt;span class="kwrd"&gt;As&lt;/span&gt; System.Windows.Forms.ItemCheckEventArgs) &lt;span class="kwrd"&gt;Handles&lt;/span&gt; CheckedListBox1.ItemCheck
        &lt;span class="rem"&gt;' Imposta il checkstate all'oggetto myChekedItem selezionato.&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; chkItem &lt;span class="kwrd"&gt;As&lt;/span&gt; myChekedItem = &lt;span class="kwrd"&gt;DirectCast&lt;/span&gt;(&lt;span class="kwrd"&gt;Me&lt;/span&gt;.CheckedListBox1.Items(e.Index), myChekedItem)
        chkItem.Stato = e.NewValue

        &lt;span class="rem"&gt;' Aggiunge l'item selezionato.&lt;/span&gt;
        &lt;span class="kwrd"&gt;If&lt;/span&gt; e.NewValue = CheckState.Checked &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ListBox1.Items.Add(chkItem)
        &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; e.NewValue = CheckState.Unchecked &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            &lt;span class="kwrd"&gt;Me&lt;/span&gt;.ListBox1.Items.Remove(chkItem)
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;All’interno dell’evento .ItemCheck gestiremo i nostri items come oggetti indipendenti sfruttandone tutte le loro funzionalità. In questo caso li abbiamo aggiunti o rimossi ad una ListBox sfruttandone i metodi .Items.Add e .Items.Remove a seconda del valore della loro prorietà Stato.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:34653de3-a482-4654-ac9e-68a41fe55681" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/CheckedListBox/default.aspx" rel="tag"&gt;CheckedListBox&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/ItemCheck/default.aspx" rel="tag"&gt;ItemCheck&lt;/a&gt;, &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/275.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/12/14/intercettare-lrsquoevento-itemcheck-della-checkedlistbox.aspx</guid>
            <pubDate>Mon, 14 Dec 2009 16:32:28 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/275.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/12/14/intercettare-lrsquoevento-itemcheck-della-checkedlistbox.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/275.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Se lo StreamWriter &amp;egrave; troppo lento</title>
            <category>Varie</category>
            <category>Visual Basic.Net</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/10/23/se-lo-streamwriter-egrave-troppo-lento.aspx</link>
            <description>&lt;p&gt;Generalmente per salvare un file di testo è molto comodo utilizzare uno StreamWriter:&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sw &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; IO.StreamWriter(&lt;span class="str"&gt;"C:\SW prova.txt"&lt;/span&gt;)
            sw.Write(&lt;span class="str"&gt;"Mio testo"&lt;/span&gt;)
            sw.Flush()
            sw.Close()&lt;/pre&gt;

&lt;p&gt;Se il testo da salvare però è di grandi dimensioni, lo StreamWriter sarà lento ad eseguire la scrittura su disco. Per evitare rallentamenti è possibile salvare il file come flusso di byte utilizzando la classe IO.FileStream:&lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; fs &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; IO.FileStream(&lt;span class="str"&gt;"C:\FS prova.txt"&lt;/span&gt;, IO.FileMode.OpenOrCreate)
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; enc &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.Text.UTF8Encoding
            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; bytes() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt; = enc.GetBytes(&lt;span class="str"&gt;"Mio testo molto lungo"&lt;/span&gt;)
            fs.Write(bytes, 0, bytes.Length)
            fs.Flush()
            fs.Close()&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2205e1bd-404b-4fe3-8e2d-e098a20e5e67" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/tips/default.aspx" rel="tag"&gt;tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/248.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/10/23/se-lo-streamwriter-egrave-troppo-lento.aspx</guid>
            <pubDate>Fri, 23 Oct 2009 07:48:07 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/248.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/10/23/se-lo-streamwriter-egrave-troppo-lento.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/248.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Nome del primo e dell&amp;rsquo;ultimo giorno del mese</title>
            <category>Visual Basic.Net</category>
            <category>Varie</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/10/12/primo-ed-ultimo-giorno-del-mese.aspx</link>
            <description>&lt;p&gt;Niente di eccezionale ma abbastanza utile:&lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Class&lt;/span&gt; myDaysOfYear
    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetFirstDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; DateTime.Parse(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"01/{0}/{1}"&lt;/span&gt;, data.Month, data.Year))
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetNameOfFirstDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(GetFirstDayOfMonth(data).DayOfWeek)
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetLastDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; DateTime.Parse(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}/{1}/{2}"&lt;/span&gt;, &lt;span class="kwrd"&gt;Date&lt;/span&gt;.DaysInMonth(data.Year, data.Month), data.Month, data.Year))
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;

    &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Shared&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetNameOfLastDayOfMonth(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; data &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Return&lt;/span&gt; Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(GetLastDayOfMonth(data).DayOfWeek)
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;
&lt;span class="kwrd"&gt;End&lt;/span&gt; Class&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Le funzioni della classe si richiamano così:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;pre class="VisualBasicFormat"&gt;        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; NomeDelPrimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = myDaysOfYear.GetNameOfFirstDayOfMonth(DateTime.Today)
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; DataPrimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt; = myDaysOfYear.GetFirstDayOfMonth(DateTime.Today)
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; NomeUltimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = myDaysOfYear.GetNameOfLastDayOfMonth(DateTime.Today)
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; DataUltimoGiornoDelMese &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Date&lt;/span&gt; = myDaysOfYear.GetLastDayOfMonth(DateTime.Today)&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:48aff68d-c983-4c9c-976f-2a846df99627" class="wlWriterEditableSmartContent"&gt;Tag Cloud: &lt;a href="http://community.dotnetwork.it/andreaz/Tags/Tips/default.aspx" rel="tag"&gt;Tips&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/221.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/10/12/primo-ed-ultimo-giorno-del-mese.aspx</guid>
            <pubDate>Mon, 12 Oct 2009 10:53:14 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/221.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/10/12/primo-ed-ultimo-giorno-del-mese.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/221.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Tanti auguri BOSS!!</title>
            <category>Varie</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/09/23/tanti-auguri-boss.aspx</link>
            <description>&lt;p align="center"&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;img src="http://www.andreazingoni.it/The_Boss.jpg" width="640" height="258" /&gt; &lt;/p&gt;  &lt;p align="center"&gt;Non ho mai parlato nel blog del mio mito… che con la sua musica mi ha accompagnato per più di vent’anni.&lt;/p&gt;  &lt;p align="center"&gt;Oggi però è il suo 60eimo compleanno ed uno strappo alla regola lo devo proprio fare:&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font color="#ff0000" size="7"&gt;TANTI AUGURI BOSS!!!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font color="#ff0000" size="7"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/190.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/09/23/tanti-auguri-boss.aspx</guid>
            <pubDate>Wed, 23 Sep 2009 12:42:14 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/190.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/09/23/tanti-auguri-boss.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/190.aspx</wfw:commentRss>
        </item>
        <item>
            <title>RowFilter non funziona con i nomi di colonna con spazi</title>
            <category>Varie</category>
            <category>Visual Basic.Net</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/08/17/rowfilter-non-funziona-con-i-nomi-di-colonna-con-spazi.aspx</link>
            <description>&lt;p&gt;Può capitare di ritrovarsi con una &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.datatable.aspx" target="_blank"&gt;DataTable&lt;/a&gt; contenente delle &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.datacolumn(en-us,VS.71).aspx" target="_blank"&gt;DataColumns&lt;/a&gt; nominate in modo non convenzionale, ossia con caratteri non validi o con spazi.&lt;/p&gt;  &lt;p&gt;In questo caso le proprietà .&lt;a href="http://msdn.microsoft.com/it-it/library/system.data.dataview.rowfilter.aspx" target="_blank"&gt;RowFilter&lt;/a&gt; e .&lt;a href="http://msdn.microsoft.com/it-it/library/system.data.dataview.sort.aspx" target="_blank"&gt;Sort&lt;/a&gt; dell’oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.dataview.aspx" target="_blank"&gt;DataView&lt;/a&gt; non funzionano correttamente.&lt;/p&gt;  &lt;p&gt;Per aggirare questo problema basta rinominare le colonne interessate prima di impostare il filtro di ricerca o di ordinamento:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;            &lt;span class="rem"&gt;' Rinomina la colonna "Nome colonna con spazi" in "Nome_colonna_con_spazi".&lt;/span&gt;
            dt.Columns(13).ColumnName = dt.Columns(13).ColumnName.Replace(&lt;span class="str"&gt;" "&lt;/span&gt;, &lt;span class="str"&gt;"_"&lt;/span&gt;)

            &lt;span class="rem"&gt;' Imposta il filtro sulla colonna rinominata.&lt;/span&gt;
            dt.DefaultView.RowFilter = &lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0} = '{1}'"&lt;/span&gt;, dt.Columns(13).ColumnName, &lt;span class="str"&gt;"Italia"&lt;/span&gt;)&lt;/pre&gt;

&lt;p&gt;Volendo è possibile ripristinare il nome originale eseguendo l’operazione inversa dopo aver impostato i filtri.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;            dt.Columns(13).ColumnName = dt.Columns(13).ColumnName.Replace(&lt;span class="str"&gt;"_"&lt;/span&gt;, &lt;span class="str"&gt;" "&lt;/span&gt;)&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5dede15b-13b2-4acd-90cc-5aedce44be3e" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Tips" rel="tag"&gt;Tips&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DataTable" rel="tag"&gt;DataTable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DataView" rel="tag"&gt;DataView&lt;/a&gt;&lt;/div&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/185.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/08/17/rowfilter-non-funziona-con-i-nomi-di-colonna-con-spazi.aspx</guid>
            <pubDate>Mon, 17 Aug 2009 17:00:29 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/185.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/08/17/rowfilter-non-funziona-con-i-nomi-di-colonna-con-spazi.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/185.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Censurare le parole non gradite</title>
            <category>Visual Basic.Net</category>
            <category>Varie</category>
            <link>http://community.dotnetwork.it/AndreaZ/archive/2009/08/04/censurare-le-parole-non-gradite.aspx</link>
            <description>&lt;p&gt;Non ho mai avuto l'esigenza di censurare l'input dell'utente ma leggendo un &lt;a href="http://www.dotnetwork.it/Forums/tabid/54/afv/topic/aff/3/aft/3152/Default.aspx" target="_blank"&gt;post&lt;/a&gt;  su DNW ho capito che è una cosa da fare necessariamente, soprattutto se si gestiscono forum o altre discussioni pubbliche.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Proviamo quindi a realizzare una funzione che effettui il controllo delle parole non gradite. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;La censura potrebbe avvenire semplicemente sovrascrivendo le parole indesiderate con dei caratteri non leggibili (es. l'asterisco).  &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Il sistema presentato avrà una contronidicazione: censurarà parti di parole che in realtà non devono essere censurate. Prendiamo ad esempio una frase come questa:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Cazzottare un figaro siculo&lt;/strong&gt;&lt;/em&gt; (prendere a pugni un barbiere siciliano)&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;la versione censurata risulterà in questo modo: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;c****ttare un f***ro sic***&lt;/strong&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Per evitare censure di questo tipo bisognerà lavorare molto sulla logica del programma tenendo in considerazione svariati scenari (parole singole, parole incorporate, parole con spazi, ecc…)&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;La funzione che segue non tiene conto della sopracitata logica ma effettua una censura indistinta delle parole indesiderate.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Il codice della funzione è molto semplice.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Creiamo un elenco in un file di testo (o in un database) delle parole da censurare (parolaccie, offese, riferimenti religiosi, ecc...) &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;parolaA&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;parolaB&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;parolaC&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Cicliamo ognuna di queste parole e controlliamo se è presente nel testo da controllare. Se la parola è presente nel testo, la sovrascriveremo con una serie di caratteri non leggibili utilizzando una &lt;a href="http://msdn.microsoft.com/it-it/library/system.text.regularexpressions(VS.80).aspx" target="_blank"&gt;regular expression&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Chi non ha dimestichezza con le regex può sfruttare direttamente il metodo &lt;a href="http://msdn.microsoft.com/it-it/library/system.string.replace.aspx" target="_blank"&gt;.Replace&lt;/a&gt; dell'oggetto stringa (String, Textbox.Text, ecc...) ma questa soluzione non è performante come l'utilizzo delle regular expression. Un trucco per velocizzare comunque questo procedimento potrebbe essere quello di appoggiarsi ad uno &lt;a href="http://msdn.microsoft.com/it-it/library/system.text.stringbuilder.aspx" target="_blank"&gt;stringbuilder&lt;/a&gt; ma a conti fatti il codice da scrivere risulterebbe più articolato di quello delle regex. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;pre class="VisualBasicFormat"&gt;    &lt;span class="rem"&gt;' VB.&lt;/span&gt;
    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; Button1_Click(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sender &lt;span class="kwrd"&gt;As&lt;/span&gt; System.&lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; e &lt;span class="kwrd"&gt;As&lt;/span&gt; System.EventArgs) &lt;span class="kwrd"&gt;Handles&lt;/span&gt; Button1.Click
        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.TextBox2.Text = &lt;span class="kwrd"&gt;Me&lt;/span&gt;.CensorRegex(&lt;span class="kwrd"&gt;Me&lt;/span&gt;.TextBox1.Text)
    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;

    &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; CensorRegex(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; text &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;
        &lt;span class="kwrd"&gt;Dim&lt;/span&gt; path &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="str"&gt;"c:\Parole sgradite.txt"&lt;/span&gt;
        &lt;span class="kwrd"&gt;If&lt;/span&gt; My.Computer.FileSystem.FileExists(path) &lt;span class="kwrd"&gt;Then&lt;/span&gt;
            Using sr &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; IO.StreamReader(path)
                &lt;span class="kwrd"&gt;Do&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt; sr.Peek() &amp;gt;= 0

                    &lt;span class="rem"&gt;' Crea il pattern per la regex.&lt;/span&gt;
                    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; pattern &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}"&lt;/span&gt;, sr.ReadLine)

                    &lt;span class="rem"&gt;' Crea la stringa di censura.&lt;/span&gt;
                    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; mask &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; = &lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}{1}"&lt;/span&gt;, pattern.Substring(0, 1), &lt;span class="kwrd"&gt;New&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;(&lt;span class="str"&gt;"*"&lt;/span&gt;c, pattern.Length - 1))

                    &lt;span class="rem"&gt;' Esegue la censura.&lt;/span&gt;
                    text = Regex.Replace(text, pattern, mask, RegexOptions.IgnoreCase)
                &lt;span class="kwrd"&gt;Loop&lt;/span&gt;

                sr.Close()
            &lt;span class="kwrd"&gt;End&lt;/span&gt; Using

            &lt;span class="rem"&gt;' Ritorna il valore.&lt;/span&gt;
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; text
         &lt;span class="kwrd"&gt;Else&lt;/span&gt;
            MessageBox.Show(&lt;span class="kwrd"&gt;String&lt;/span&gt;.Format(&lt;span class="str"&gt;"File {0} non è stato trovato."&lt;/span&gt;, path), &lt;span class="str"&gt;"Errore"&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.&lt;span class="kwrd"&gt;Error&lt;/span&gt;)
            &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;.Empty
        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;
    &lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Un altro problema di questo codice è che non riesce a mantenere maiuscuola la prima lettera della parola da censurare. Ovviamente il problema è aggirabile ma richiederebbe un overhead che annullerebbe ogni beneficio dell'utilizzo delle regex in termini di velocità.&lt;/p&gt;&lt;img src="http://community.dotnetwork.it/AndreaZ/aggbug/183.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Zingoni</dc:creator>
            <guid>http://community.dotnetwork.it/AndreaZ/archive/2009/08/04/censurare-le-parole-non-gradite.aspx</guid>
            <pubDate>Tue, 04 Aug 2009 12:55:04 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/AndreaZ/comments/183.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/AndreaZ/archive/2009/08/04/censurare-le-parole-non-gradite.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/AndreaZ/comments/commentRss/183.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>