<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Sotiris Filippidis' Weblog</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/default.aspx</link><description>Λόλα, να ένα middle tier.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>CodeColorizer: Ενα plugin για χρωματιστό κώδικα στο Windows Live Writer</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2008/11/23/codecolorizer-plugin-windows-live-writer.aspx</link><pubDate>Sun, 23 Nov 2008 11:15:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46421</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/46421.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=46421</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=46421</wfw:comment><description>&lt;p&gt;Οταν χρησιμοποιείτε το Windows Live Writer, δεν έχετε τη δυνατότητα by default να τοποθετήσετε έγχρωμο και σωστά idented κώδικα στα posts σας. Κατεβάζοντας ένα Live Writer plugin από αυτή τη διεύθυνση: &lt;a title="http://www.carlosag.net/Tools/WindowsLiveWriter/" href="http://www.carlosag.net/Tools/WindowsLiveWriter/"&gt;http://www.carlosag.net/Tools/WindowsLiveWriter/&lt;/a&gt;, το πρόβλημα λύνεται! &lt;/p&gt; &lt;p&gt;Το χρησιμοποίησα και έμεινα απόλυτα ικανοποιημένος. Οδηγίες για την εγκατάσταση θα βρείτε στην σελίδα που παραπέμπει το link.&lt;/p&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=46421" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A703C103AE03C303B903BC03B103_+_B503C103B303B103BB03B503AF03B103_/default.aspx">Χρήσιμα εργαλεία</category></item><item><title>FriendFeed: Ενα RSS feed για όλες σας τις δραστηριότητες</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2008/04/05/friendfeed-rss-feed.aspx</link><pubDate>Sat, 05 Apr 2008 21:39:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41361</guid><dc:creator>cap</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/41361.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=41361</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=41361</wfw:comment><description>&lt;P&gt;Ειναι αλήθεια οτι αν πάτε στο &lt;A href="http://www.friendfeed.com"&gt;FriendFeed&lt;/A&gt; δεν θα δείτε κάποιο wow site με όμορφα γραφικά και ελκυστικά τσιτάτα. Ομως, αυτό που κανει είναι πραγματικά χρήσιμο.&lt;/P&gt;
&lt;P&gt;Εν ολίγοις: Εγγράφεστε στο FriendFeed, του λέτε ποιά blogs έχετε, και σε ποιές υπηρεσίες είστε εγγεγραμμένοι (π.χ. youtube, del.icio.us, last.fm και άλλες δημοφιλείς υπηρεσίες) και το FriendFeed φροντίζει να παράγει ένα feed με όλες σας τις δραστηριότητες συγκεντρωτικά. Ετσι, έχετε ένα feed που περιέχει τα πάντα για σάς: Από το νέο σας blog post (το FriendFeed τελευταία βελτιώθηκε ωστε να υποστηρίζει πολλαπλά blogs) ως το τελευταίο video που ορίσατε αγαπημένο στο YouTube ή το τελευταίο link που προσθέσατε στο Del.Icio.Us. &lt;/P&gt;
&lt;P&gt;Το FriendFeed διαθέτει ένα ολοκληρωμένο API για την ενσωμάτωσή του σε τρίτες εφαρμογές. Ηδη έχει υλοποιηθεί ως &lt;A href="http://www.facebook.com/apps/application.php?id=2795223269&amp;amp;ref=s"&gt;Facebook application&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Δείτε το δικό μου feed εδώ: &lt;A href="http://www.friendfeed.com/sfilip"&gt;http://www.friendfeed.com/sfilip&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=41361" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A003B103C103BF03C503C303B903AC03C303B503B903C203_+_C003C103BF03CA03CC03BD03C403C903BD03_+_BA03B103B903_+_C503C003B703C103B503C303B903CE03BD03_/default.aspx">Παρουσιάσεις προϊόντων και υπηρεσιών</category></item><item><title>Company Profiles στο LinkedIn</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2008/03/22/company-profiles-linkedin.aspx</link><pubDate>Sat, 22 Mar 2008 10:23:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41057</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/41057.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=41057</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=41057</wfw:comment><description>&lt;P&gt;Παρά το οτι πιό "χαλαρά" social networks όπως το Facebook, το MySpace ή το Hi5 κερδίζουν κόσμο από την Ελλάδα, το &lt;A href="http://www.linkedin.com"&gt;LinkedIn&lt;/A&gt; παραμένει μια σταθερή αξία για την επαγγελματική μας δικτύωση. Ενα profile σας στο LinkedIn μπορεί, ορισμένες φορές, να υποκασταστήσει αποτελεσματικά το κλασικό Word/PDF CV σας, ιδίως αν σε αυτό περιλαμβάνονται συστάσεις από άλλους συνεργάτες.&lt;/P&gt;
&lt;P&gt;Ως μεμονωμένος επαγγελματίας, μπορούσε κανείς να κάνει πολλά. Αυτό όμως που έλειπε από το LinkedIn μέχρι σήμερα ήταν τα Company Profiles, σελίδες δηλαδή που περιέχουν στοιχεία για την εταιρία σας, καθώς και τα μέλη του LinkedIn που εργάζονται σε αυτή. Οι πληροφορίες παρέχονται σε συνεργασία με την Capital IQ, που σημαίνει οτι (τουλάχιστον για την beta φάση) θα πρέπει να ξεχάσετε τη δυνατότητα να προσθέσετε τη δική σας εταιρία. &lt;/P&gt;
&lt;P&gt;Στα Company Profiles εμφανίζονται ενδιαφέροντα στοιχεία όπως πρόσφατες προσλήψεις, σχετικές εταιριες, προαγωγές, δημοφιλή προφιλ εργαζομένων και άλλα. Το LinkedIn σκοπεύει να κάνει τα Profiles κάτι σαν Wiki, επιτρέποντας στους εργαζόμενους των εταιριών να μεταβάλλουν τα στοιχεία τους. &lt;/P&gt;
&lt;P&gt;Η βάση δεδομένων της Capital IQ περιέχει 160.000 εταιρίες, ενώ το LinkedIn σκοπεύει να φτάσει το 1.000.000 Company Profiles στο μέλλον.&lt;/P&gt;
&lt;P&gt;Ακούγεται ενδιαφέρον, αρκεί να δοθεί συνεχεια και να επιτραπεί η δημιουργία Company Profiles από τους χρήστες. &lt;/P&gt;
&lt;P&gt;Σχετικό υλικό μπορείτε να βρείτε στο &lt;A href="http://blog.linkedin.com/blog/2008/03/company-profile.html"&gt;LinkedIn Blog&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Αν δεν ξέρετε τι είναι το LinkedIn, μπορείτε να διαβάσετε αυτό το Blog Post: &lt;A href="http://www.dotnetzone.gr/cs/blogs/equilibrium/archive/2005/07/02/LinkedIn.aspx"&gt;LinkedIn: Η άλλη διάσταση στις επαγγελματικές σχέσεις&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=41057" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A003B103C103BF03C503C303B903AC03C303B503B903C203_+_C003C103BF03CA03CC03BD03C403C903BD03_+_BA03B103B903_+_C503C003B703C103B503C303B903CE03BD03_/default.aspx">Παρουσιάσεις προϊόντων και υπηρεσιών</category></item><item><title>Κυκλοφόρησε το DotNetNuke 4.8.1 Language Pack</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2008/03/20/dotnetnuke-4-8-1-language-pack.aspx</link><pubDate>Thu, 20 Mar 2008 09:04:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:41018</guid><dc:creator>cap</dc:creator><slash:comments>3</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/41018.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=41018</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=41018</wfw:comment><description>&lt;P&gt;Κυκλοφόρησε το ενημερωμένο Greek Language Pack για την έκδοση 4.8.1 του DotNetNuke, &lt;A href="http://www.dotnetnuke.com/Products/Development/Forge/CoreLocalization/LanguagePacks/tabid/933/Default.aspx"&gt;το οποίο μπορείτε να βρείτε εδώ&lt;/A&gt;. Για άλλη μια φορά, όπως και με το προηγούμενο Greek Language Pack,&amp;nbsp;τα ευχαριστήριά σας προς τον κ. Αγγελο Ξυπολιά και την &lt;A href="http://www.xelixis.gr"&gt;Xelixis&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=41018" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>Τεχνική παρουσίαση DotNetNuke Portal: Chios Echo</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2008/03/10/dotnetnuke-portal-chios-echo.aspx</link><pubDate>Tue, 11 Mar 2008 01:46:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:40796</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/40796.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=40796</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=40796</wfw:comment><description>&lt;P&gt;&lt;IMG hspace=5 src="http://www.dotnetzone.gr/cs/photos/cap/images/40795/original.aspx" align=right vspace=5&gt;Το &lt;A href="http://www.chios-echo.gr/"&gt;http://www.chios-echo.gr/&lt;/A&gt; δημιουργήθηκε φέτος σε συνεργασία με την εταιρία &lt;A href="http://www.tool.gr"&gt;Tool&lt;/A&gt;, και φιλοξενείται με τη συνεργασία της εταιρίας &lt;A href="http://www.xelixis.gr"&gt;Xelixis&lt;/A&gt;.&amp;nbsp;Αποσκοπώ και πάλι στο να δώσω μια περιγραφή του από τεχνική σκοπιά.&lt;/P&gt;
&lt;P&gt;Το&amp;nbsp;portal τρέχει στην έκδοση 4.8.0&amp;nbsp;του &lt;A href="http://www.dotnetnuke.com"&gt;DotNetNuke&lt;/A&gt;&amp;nbsp;και για τη δημιουργία του χρησιμοποιήθηκε προδιαμορφωμένο περιβάλλον ("κομμένα" γραφικά σε HTML) το οποίο μετεξελίχθηκε σε skin. Απαραίτητες ήταν όμως και κάποιες "βαθύτερες" αλλαγές (εκτός του φακέλου /portals), όπως το&amp;nbsp;customization του search box και της σελίδας αποτελεσμάτων αναζήτησης καθώς και κάποια άλλα customizations που αφορούσαν κυρίως τη λειτουργία του navigation side menu ως skin object (βλ. παρακάτω). Για την πρώτη σελίδα χρησιμοποιείται διαφορετικό ascx αρχείο (διπλό content pane) από ο,τι για τις εσωτερικές.&lt;/P&gt;
&lt;P&gt;Το top-level navigation είναι "καρφωτό" με τα γνωστά javascripts για το onMouseOver image roll, δεδομένου οτι τα top-level links δεν μεταβάλλονται. Αν και θα μπορούσε να χρησιμοποιηθεί κάποιο module, δεν υπήρχε ουσιαστικά κάποιο μεγαλύτερο πρακτικό όφελος.&lt;/P&gt;
&lt;P&gt;Για την ενοτητα των &lt;A href="http://www.chios-echo.gr/Default.aspx?tabid=56&amp;amp;"&gt;νέων&lt;/A&gt; χρησιμοποιήθηκε το module &lt;A href="http://www.orizonti.com/DotNetNuke/NukeNewsModule/tabid/646/Default.aspx"&gt;Orizonti NukeNews&lt;/A&gt;, κατάλληλα προσαρμοσμένο. Υπήρχε όμως η απαίτηση στην πρώτη σελίδα να εμφανίζεται ένα top x των ειδήσεων. Δεδομένου οτι το NukeNews module δεν παρείχε αυτή τη λειτουργικότητα, για αυτή την απαίτηση χρησιμοποιήθηκε το &lt;A href="http://www.bi4ce.com/?tabid=122&amp;amp;pid=2"&gt;ListX&lt;/A&gt; module,&amp;nbsp;το οποίο&amp;nbsp;επιτρέπει απευθείας queries στην database και συγκεκριμένα στα database tables του NukeNews module, και ενεργοποιήθηκε για αυτό η λειτουργία Ajax έτσι ωστε ο χρήστης να μην περιμένει τη φόρτωση των τίτλων για να δει την πρώτη σελίδα.&lt;/P&gt;
&lt;P&gt;Για το side navigation χρησιμοποιήθηκε (με αρκετά μεγάλη προσαρμογή) το CISS.SideMenu module,το οποίο αποτελεί μέρος του πακέτου &lt;A href="http://www.dnn360.net/navsuite"&gt;Navigation Suite All-in-one&lt;/A&gt;. Το module χρησιμοποιήθηκε ως skin object. Το ίδιο ακριβώς module, με&amp;nbsp;διαφορετικό configuration και&amp;nbsp;styling αυτή τη φορά, χρησιμοποιήθηκε και για την δημιουργία του &lt;A href="http://www.chios-echo.gr/Default.aspx?tabid=85"&gt;sitemap &lt;/A&gt;του portal.&lt;/P&gt;
&lt;P&gt;Για την παροχή στοιχείων στην υπηρεσία Google Analytics χρησιμοποιήθηκε το δωρεάν &lt;A href="http://www.southvillagesoftware.com/DotNetNuke/Modules/SVSGoogleAnalytics/tabid/80/Default.aspx"&gt;SVS Google Analytics &lt;/A&gt;module.&lt;/P&gt;
&lt;P&gt;Τελος, από τα core modules έχει γίνει χρήση του core DNN &lt;A href="http://www.dotnetnuke.com/Products/Development/Forge/ModuleRepository/tabid/830/Default.aspx"&gt;Repository&lt;/A&gt; module για την παροχή &lt;A href="http://www.chios-echo.gr/Default.aspx?tabid=202&amp;amp;language=en-US"&gt;εγγράφων και ακουστικού υλικού&lt;/A&gt; προς λήψη, του &lt;A href="http://www.dotnetnuke.com/Products/Development/Forge/ModuleFAQ/tabid/892/Default.aspx"&gt;FAQ&lt;/A&gt; module για την παροχή &lt;A href="http://www.chios-echo.gr/Default.aspx?tabid=74&amp;amp;language=en-US"&gt;FAQs&lt;/A&gt; (τι άλλο; :) ), ενώ μελλοντικά θα χρησιμοποιηθεί και το DNN &lt;A href="http://www.dotnetnuke.com/Products/Development/Forge/ModuleForums/tabid/820/Default.aspx"&gt;Forum&lt;/A&gt; core module.&lt;/P&gt;
&lt;P&gt;Το portal βρίσκεται υπό ανάπτυξη, και ενδέχεται να προστεθούν και άλλα modules στο άμεσο μέλλον για να καλυφθούν οι επιπρόσθετες απαιτήσεις λειτουργικότητας.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=40796" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>Δωρεάν εργαλείο δημιουργίας διαγραμμάτων UML για το Visual Studio</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/11/09/uml-visual-studio.aspx</link><pubDate>Fri, 09 Nov 2007 21:10:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:37149</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/37149.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=37149</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=37149</wfw:comment><description>&lt;P&gt;Από το &lt;A href="http://www.digitalnews.gr"&gt;digitalnews.gr&lt;/A&gt;&amp;nbsp;διάβασα την πολύ ενδιαφέρουσα είδηση της κυκλοφορίας ενός δωρεάν εργαλείου UML modeling από την &lt;A href="http://www.tangible.de"&gt;Tangible&lt;/A&gt; που προστίθεται ως add-on στο Visual Studio επιτρέποντάς σας να ενσωματώσετε στα projects σας διαγράμματα UML και συγκεκριμένα τα εξής:&lt;/P&gt;
&lt;P&gt;- Use Case Diagrams&lt;BR&gt;- Component Diagrams&lt;BR&gt;- State Charts&lt;BR&gt;- Class Diagrams&lt;BR&gt;- Activity Diagrams&lt;BR&gt;- Persistent Object Models. &lt;/P&gt;
&lt;P&gt;Περισσότερα θα βρείτε εδώ: &lt;A href="http://www.tangiblearchitect.net/modellingtools.html"&gt;http://www.tangiblearchitect.net/modellingtools.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=37149" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A703C103AE03C303B903BC03B103_+_B503C103B303B103BB03B503AF03B103_/default.aspx">Χρήσιμα εργαλεία</category></item><item><title>Dynamically adding controls to ASPX pages (web forms) and assigning event handlers </title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/11/08/dynamically-adding-controls-and-assigning-event-handlers-to-web-forms-aspx-pages.aspx</link><pubDate>Thu, 08 Nov 2007 22:09:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:37077</guid><dc:creator>cap</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/37077.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=37077</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=37077</wfw:comment><description>&lt;P&gt;Although I've seen a lot of articles describing how to dynamically add controls to a Web Form, few mention even a little hint to how you can make event handlers actually WORK with dynamically-added controls. This article may seem (and probably is) a beginner-level one, but I think it's essential to cover this issue.&lt;/P&gt;
&lt;P&gt;There are a lot of reasons why you would want to dynamically generate Web Forms, i.e. add controls at runtime. Suppose your form's structure depends on metadata stored in a database, or has to change depending on what data it has to do with every time. Whatever the reason, you probably need to dynamically add controls to it like a textbox or two, or even your own complex, fully functional user controls. &lt;/P&gt;
&lt;P&gt;How do you do that?&lt;/P&gt;
&lt;P&gt;First, let's understand the various ways we can add controls to a web form. We can do it in either of three ways:&lt;/P&gt;
&lt;P&gt;1. Declaratively (at design time)&lt;BR&gt;2. Programmatically (at design time)&lt;BR&gt;3. Dynamically (at run-time)&lt;BR&gt;&lt;BR&gt;The first two ways are simple: Either we do a declaration somewhere and let VS.NET write the code for us (1), or we just type our own code, including the designer code (2). Both are done in design time. What we are interested in is (3): Doing it at run time.&lt;/P&gt;
&lt;P&gt;(We'll be using the Page_Load sub for all our examples, although it's not always the most convenient place to put dynamic control code - just for the sake of simplicity)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The WRONG way &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;That's what people usually do:&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellSpacing=0 cellPadding=0 width="100%" border=0&gt;

&lt;TR style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;
&lt;TD style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;PRE style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;BR&gt;2&lt;BR&gt;3&lt;BR&gt;4&lt;BR&gt;5&lt;BR&gt;6&lt;BR&gt;7&lt;BR&gt;8&lt;BR&gt;9&lt;BR&gt;10&lt;BR&gt;11&lt;BR&gt;12&lt;BR&gt;13&lt;BR&gt;14&lt;BR&gt;15&lt;BR&gt;16&lt;BR&gt; &lt;/PRE&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;PRE style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; Partial &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt; WebForm1&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Inherits&lt;/SPAN&gt; System.Web.UI.Page&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Protected&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;WithEvents&lt;/SPAN&gt; _tx &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; TextBox&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Protected&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; Page_Load(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Handles&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.Load&lt;BR&gt;        _tx &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; TextBox&lt;BR&gt;        _tx.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"textbox1"&lt;/SPAN&gt;&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(_tx)&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; _tx_TextChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Handles&lt;/SPAN&gt; _tx.TextChanged&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;'do something&lt;/SPAN&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;P&gt;This works well if we have only ONE textbox. In order to handle events with the _tx_TextChanged sub which uses the HANDLES keyword, we had to declare our _tx variable as at least visible from everywhere from our page and use the keyword "withevents". We also have to declare an event handling method using the keyword "handles".&lt;/P&gt;
&lt;P&gt;What happens, though, if we have to dynamically add an unknown number of textboxes? A number that might change with each run because it depends on some external factor like query results from a database? &lt;/P&gt;
&lt;P&gt;Well, the answer is that we can thoretically&amp;nbsp;do that in the way mentioned above, but good-bye event handling. We can set _txt to another new textbox and add that as well to our controls collection. BUT! The _tx_TextChanged event handler will be working only for the LAST textbox added (the one we last set _txt to refer to). Like this:&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellSpacing=0 cellPadding=0 width="100%" border=0&gt;

&lt;TR style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;
&lt;TD style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;PRE style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;BR&gt;2&lt;BR&gt;3&lt;BR&gt;4&lt;BR&gt;5&lt;BR&gt;6&lt;BR&gt;7&lt;BR&gt;8&lt;BR&gt;9&lt;BR&gt;10&lt;BR&gt;11&lt;BR&gt;12&lt;BR&gt;13&lt;BR&gt;14&lt;BR&gt;15&lt;BR&gt;16&lt;BR&gt;17&lt;BR&gt;18&lt;BR&gt;19&lt;BR&gt;20&lt;BR&gt;21&lt;BR&gt;22&lt;BR&gt; &lt;/PRE&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;PRE style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; Partial &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt; WebForm1&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Inherits&lt;/SPAN&gt; System.Web.UI.Page&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Protected&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;WithEvents&lt;/SPAN&gt; _tx &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; TextBox&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Protected&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; Page_Load(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Handles&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.Load&lt;BR&gt;        _tx &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; TextBox&lt;BR&gt;        _tx.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"textbox1"&lt;/SPAN&gt;&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(_tx)&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;        _tx &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; TextBox&lt;BR&gt;        _tx.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"textbox2"&lt;/SPAN&gt;&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(_tx)&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; _tx_TextChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Handles&lt;/SPAN&gt; _tx.TextChanged&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;'do something&lt;/SPAN&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;If we change the text of the FIRST textbox and put a breakpoint in line 12, we will notice it is NEVER being hit. That is because _tx_TextChanges can handle only one reference: The one variable _tx was assigned last, and that is the reference for the SECOND text box.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The RIGHT way&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The right way to handle events in dynamically added controls is to forget the "handles" keyword and use the AddHandler method, like in the following example:&lt;/P&gt;
&lt;P&gt;
&lt;TABLE style="BORDER-RIGHT:#e5e5e5 1px solid;BORDER-TOP:#e5e5e5 1px solid;BORDER-LEFT:#e5e5e5 1px solid;BORDER-BOTTOM:#e5e5e5 1px solid;BACKGROUND-COLOR:#f2f2f2;" cellSpacing=0 cellPadding=0 width="100%" border=0&gt;

&lt;TR style="VERTICAL-ALIGN:top;LINE-HEIGHT:normal;"&gt;
&lt;TD style="WIDTH:40px;TEXT-ALIGN:right;"&gt;&lt;PRE style="BORDER-RIGHT:#e7e7e7 1px solid;PADDING-RIGHT:2px;PADDING-LEFT:2px;FONT-SIZE:11px;PADDING-BOTTOM:2px;MARGIN:0px;COLOR:gray;PADDING-TOP:2px;FONT-FAMILY:courier new;"&gt;1&lt;BR&gt;2&lt;BR&gt;3&lt;BR&gt;4&lt;BR&gt;5&lt;BR&gt;6&lt;BR&gt;7&lt;BR&gt;8&lt;BR&gt;9&lt;BR&gt;10&lt;BR&gt;11&lt;BR&gt;12&lt;BR&gt;13&lt;BR&gt;14&lt;BR&gt;15&lt;BR&gt;16&lt;BR&gt;17&lt;BR&gt;18&lt;BR&gt;19&lt;BR&gt;20&lt;BR&gt;21&lt;BR&gt;22&lt;BR&gt;23&lt;BR&gt;24&lt;BR&gt;25&lt;BR&gt;26&lt;BR&gt;27&lt;BR&gt;28&lt;BR&gt;29&lt;BR&gt;30&lt;BR&gt;31&lt;BR&gt;32&lt;BR&gt;33&lt;BR&gt;34&lt;BR&gt;35&lt;BR&gt;36&lt;BR&gt;37&lt;BR&gt;38&lt;BR&gt;39&lt;BR&gt;40&lt;BR&gt;41&lt;BR&gt;42&lt;BR&gt;43&lt;BR&gt;44&lt;BR&gt;45&lt;BR&gt;46&lt;BR&gt;47&lt;BR&gt;48&lt;BR&gt;49&lt;BR&gt;50&lt;BR&gt;51&lt;BR&gt;52&lt;BR&gt;53&lt;BR&gt; &lt;/PRE&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;PRE style="PADDING-RIGHT:2px;PADDING-LEFT:8px;PADDING-BOTTOM:2px;MARGIN:0px;PADDING-TOP:2px;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Partial &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt; _Default&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Inherits&lt;/SPAN&gt; System.Web.UI.Page&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Protected&lt;/SPAN&gt; _genTextbox &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; TextBox&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Protected&lt;/SPAN&gt; _genButton &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; Button&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Protected&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; Page_Load(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Handles&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.Load&lt;BR&gt;&lt;BR&gt;        _genButton &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; Button&lt;BR&gt;        _genButton.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"btn1"&lt;/SPAN&gt;&lt;BR&gt;        _genButton.Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"btn1"&lt;/SPAN&gt;&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;AddHandler&lt;/SPAN&gt; _genButton.Click, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;AddressOf&lt;/SPAN&gt; Click1&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(_genButton)&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;        _genButton &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; Button&lt;BR&gt;        _genButton.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"btn2"&lt;/SPAN&gt;&lt;BR&gt;        _genButton.Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"btn2"&lt;/SPAN&gt;&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;AddHandler&lt;/SPAN&gt; _genButton.Click, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;AddressOf&lt;/SPAN&gt; click2&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(_genButton)&lt;BR&gt;&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Dim&lt;/SPAN&gt; b &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; Button&lt;BR&gt;        b.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"btn3"&lt;/SPAN&gt;&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;AddHandler&lt;/SPAN&gt; b.Click, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;AddressOf&lt;/SPAN&gt; Click3&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(b)&lt;BR&gt;&lt;BR&gt;        _genTextbox &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; TextBox&lt;BR&gt;        _genTextbox.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt1"&lt;/SPAN&gt;&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(_genTextbox)&lt;BR&gt;&lt;BR&gt;        _genTextbox &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; TextBox&lt;BR&gt;        _genTextbox.ID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt2"&lt;/SPAN&gt;&lt;BR&gt;        Form.Controls.&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Add&lt;/SPAN&gt;(_genTextbox)&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; Click1(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs)&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;DirectCast&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.FindControl(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt1"&lt;/SPAN&gt;), TextBox).Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"button 1 pressed"&lt;/SPAN&gt;&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;DirectCast&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.FindControl(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt2"&lt;/SPAN&gt;), TextBox).Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;""&lt;/SPAN&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; Click2(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs)&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;DirectCast&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.FindControl(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt1"&lt;/SPAN&gt;), TextBox).Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;""&lt;/SPAN&gt;&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;DirectCast&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.FindControl(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt2"&lt;/SPAN&gt;), TextBox).Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"button 2 pressed"&lt;/SPAN&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; Click3(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs)&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;DirectCast&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.FindControl(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt1"&lt;/SPAN&gt;), TextBox).Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"button 3 pressed"&lt;/SPAN&gt;&lt;BR&gt;        &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;DirectCast&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.FindControl(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"txt2"&lt;/SPAN&gt;), TextBox).Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"button 3 pressed"&lt;/SPAN&gt;&lt;BR&gt;    &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;In this code, we create three buttons and two textboxes dynamically. Each button is assigned an event handler which does something to the two textboxes. Let's examine some interesting things here:&lt;/P&gt;
&lt;P&gt;For the buttons, we didn't use the "withevents" keyword in line 4. Of course, we didn't use the "handles" keyword as well. We just assigned event handlers to our two buttons in lines 9 and 14 respectively, passing the addresses of the Click1 and Click2 methods which we have constructed by hand. Although there is only ONE variable for the two buttons, the handlers both work fine! That is because the handlers are not hooked to the _genbutton variable and its current reference any more, as when the "handles" keyword is used.&lt;/P&gt;
&lt;P&gt;You might also have noticed something strange - a third button being initialized at line 16, with a variable totally local to the Page_Load sub, which is too assigned an event handler - &amp;nbsp;and works just fine! So you don't even have to declare protected variables as placeholders for references if you don't want to. Local variables will do just the same.&lt;/P&gt;
&lt;P&gt;You have already probably noticed that we are setting the ID property of every control we create. Why? Well, since these controls have not been officially declared in the page, intellisense does not work for them. So, the only way to find what we have constructed is to use the FindControl method which takes a control ID as an argument and returns an object which we must cast to the right type, as is done in all 3 event handlers. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In order to achieve fully dynamic addition of controls in web forms you have to:&lt;/P&gt;
&lt;P&gt;- Forget about the "handles" keyword. Use the AddHandler method instead. Copy signatures from the event handling methods generated when you use the "withevents" and "handles" keywords in Visual Studio, if you feel you can't remember that argument each handler uses, and create your own handling methods which you'll link to your controls with the help of the AddHandler method.&lt;/P&gt;
&lt;P&gt;- No need to declare protected stuff if you don't need to. Even local variables will do. If you do declare protected / private stuff, event handlers will work quite as well since they aren't hooked to what your variable refers to at runtime.&lt;/P&gt;
&lt;P&gt;- Always set the control's ID property so you can find it again at runtime using the FindControl method.&lt;/P&gt;
&lt;P&gt;Hope that helped a bit.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;A href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.dotnetzone.gr%2fcs%2fblogs%2fsfilip%2farchive%2f2007%2f11%2f08%2fdynamically-adding-controls-and-assigning-event-handlers-to-web-forms-aspx-pages.aspx"&gt;&lt;IMG alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.dotnetzone.gr%2fcs%2fblogs%2fsfilip%2farchive%2f2007%2f11%2f08%2fdynamically-adding-controls-and-assigning-event-handlers-to-web-forms-aspx-pages.aspx" border=0&gt;&lt;/A&gt; 
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=37077" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category></item><item><title>Οι εφαρμογές bug / issue tracking που χρησιμοποιούμε</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/10/12/bug-issue-tracking.aspx</link><pubDate>Fri, 12 Oct 2007 15:41:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:36182</guid><dc:creator>cap</dc:creator><slash:comments>5</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/36182.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=36182</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=36182</wfw:comment><description>&lt;P&gt;Σε μια προσπάθεια συγκέντρωσης των bug / issue tracking προγραμμάτων που χρησιμοποιούν οι Ελληνες developers, έχω δημοσιεύσει στο Google Documents ένα public spreadsheet στη διεύθυνση &lt;A class=imSmallTxt href="http://spreadsheets.google.com/ccc?key=pzX382cJsXGbe_H9rbLo7Pw&amp;amp;hl=en"&gt;http://spreadsheets.google.com/ccc?key=pzX382cJsXGbe_H9rbLo7Pw&amp;amp;hl=en&lt;/A&gt;. Εκεί μπορείτε να δείτε τι έχει προστεθεί μέχρι τώρα και να συμπληρώσετε τα δικά σας. &lt;/P&gt;
&lt;P&gt;Το συγκεκριμένο υλικό, αν και εφόσον αποκτήσει το απαραίτητο περιεχόμενο, θα δημοσιευτεί εδώ και στην αντίστοιχη συζήτηση του dotNETZone.gr.&lt;/P&gt;
&lt;P&gt;Το συγκεκριμένο document μπορείτε να το δείτε read-only. Αν έχετε ήδη λογ/σμό στο gmail, μπορείτε να μου στείλετε με προσωπικό μήνυμα στο dotnetzone.gr το email σας ωστε να σας προσθέσω στους collaborators για να μπορείτε να κάνετε επεξεργασία και να προσθέσετε και τις δικές σας εγγραφές. Ως collaborators, μπορείτε και εσείς να στείλετε προσκλήσεις collaboration σε τρίτους.&lt;/P&gt;
&lt;P&gt;Ας φτιάξουμε μαζί μια πλήρη λίστα, όχι οποιουδήποτε software κυκλοφορεί, αλλά αυτών που ΧΡΗΣΙΜΟΠΟΙΟΥΜΕ. Σας περιμένω.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=36182" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_9303B503BD03B903BA03AC03_/default.aspx">Γενικά</category><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A703C103AE03C303B903BC03B103_+_B503C103B303B103BB03B503AF03B103_/default.aspx">Χρήσιμα εργαλεία</category></item><item><title>Δημιουργία AJAX master-detail interface με custom SQL Queries σε σελίδα του dotNETNuke με τη χρήση του ListX Module</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/09/30/ajax-master-detail-interface-custom-sql-queries-dotnetnuke-listx-module.aspx</link><pubDate>Sun, 30 Sep 2007 21:06:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35657</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/35657.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=35657</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=35657</wfw:comment><description>&lt;DIV class=post-header-line-1&gt;&lt;/DIV&gt;
&lt;P class="post-body entry-content"&gt;Προειδοποίηση: Το άρθρο αυτό προϋποθέτει ότι γνωρίζετε την ύπαρξη και το βασικό χειρισμό του &lt;A href="http://www.bi4ce.com/?tabid=122&amp;amp;pid=2"&gt;&lt;FONT color=#666699&gt;ListX module&amp;nbsp;&lt;/FONT&gt;&lt;/A&gt;από την&amp;nbsp;&lt;A href="http://www.bi4ce.com/"&gt;&lt;FONT color=#666699&gt;Bi4ce &lt;/FONT&gt;&lt;/A&gt;και οτι γνωρίζετε ορισμένα βασικά πράγματα σε σχέση με το DotNetNuke (όπως π.χ. το πώς να εγκαταστήσετε modules). Για να εφαρμόσετε τα όσα αναφέρονται στο άρθρο θα πρέπει να έχετε εγκατεστημένο το ListX module στο DotNetNuke portal σας.&lt;/P&gt;
&lt;P class="post-body entry-content"&gt;(Το πρωτότυπο άρθρο δημοσιεύτηκε από εμένα στα Αγγλικά, εδώ: &lt;A href="http://dnnuke.blogspot.com/2007/09/using-listx-component-to-create.html"&gt;http://dnnuke.blogspot.com/2007/09/using-listx-component-to-create.html&lt;/A&gt;. Το παρόν αποτελεί προσαρμογή στα Ελληνικά, με σχεδόν το ίδιο περιεχομένο).&lt;BR&gt;&lt;BR&gt;Για όσους δεν το γνωρίζουν, το ListX σας επιτρέπει να "τραβάτε" και να παρουσιάζετε δεδομένα από τη βάση του dotNEtNuke, ή από κάποια τρίτη εξωτερική βάση δεδομένων και να τα παρουσιάζετε εντός του dotNetNuke, και υποστηρίζει εκτενώς AJAX.&lt;BR&gt;&lt;BR&gt;Με την πρώτη ματιά, ο τίτλος της δημοσίευσης μπορεί σας φαίνεται περίπλοκος. Αυτό όμως που θέλω να σας δείξω είναι η λειτουργικότητα του ListX με τη βοήθεια της οποίας όχι μόνο μπορείτε να κάνετε queries σε κάποια database και να δείξετε αποτελεσματα σε grid-style ή repeater-style, αλλά ακόμα και να έχετε detail σελίδες. Ουσιαστικά, θα επιχειρήσουμε να φτιάξουμε ένα master-detail interface τραβώντας δεδομένα από κάποιο πίνακα και χρησιμοποιώντας για αυτό το σκοπό το ListX.&lt;/P&gt;
&lt;P class="post-body entry-content"&gt;Πρώτα από όλα, θα χρειαστούμε κάποιον πίνακα από τον οποίο θα πρέπει να αντλήσουμε δεδομένα. Για λόγους απλότητας, θα χρησιμοποιήσουμε έναν υπάρχοντα πίνακα του DotNetNuke, ο οποίος περιέχει δεδομένα ακόμα και στην default εγκατάσταση: Τον πίνακα Tabs. Ο πίνακας αυτός περιέχει πληροφορίες για τις σελίδες του DNN (όπως τον τίτλο, το id της σελίδας κλπ). Στην default εγκατάσταση, ο πίνακας περιέχει στοιχεία για όλες τις σελίδες του Admin και του Host καθώς και για την default (home) σελίδα μας. Φυσικά, μπορείτε να χρησιμοποιήσετε κάποιο δικό σας πίνακα για τον ίδιο σκοπό, μέσα στην βάση του DNN ή σε εξωτερική βάση δεδομένων. &lt;BR&gt;&lt;BR&gt;Ας δούμε τα δύο SQL queries που θα χρησιμοποιήσουμε για να εμφανίσουμε τα master και detail κομμάτια του interface μας: &lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Query 1: &lt;/STRONG&gt;Το query που θα χρησιμοποιήσουμε για να δείξουμε τις εγγραφές του πίνακα Tabs συγκεντρωτικά (master)&lt;BR&gt;&lt;SPAN style="FONT-FAMILY:courier new;"&gt;SELECT tabid AS pageid, tabname FROM tabs ORDER BY tabname DESC&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Query 2:&lt;/STRONG&gt; Το query που θα χρησιμοποιήσουμε για το detail μέρος. &lt;BR&gt;&lt;SPAN style="FONT-FAMILY:courier new;"&gt;SELECT tabname, title, isvisible, iconfile, tabpath FROM tabs WHERE tabid = @pageid&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;Αν σας μπερδεύει το &lt;STRONG&gt;@pageid&lt;/STRONG&gt;, να σας πω οτι θα δείτε παρακάτω, όταν θα χρησιμοποιήσουμε το query στο ListX module, οτι αυτό θα αντιπροσωπεύει μια &lt;STRONG&gt;παράμετρο &lt;/STRONG&gt;η οποία θα αντικατασταθεί στο runtime με το tab id της σελίδας των οποίων τα details θέλουμε να δούμε, ουσιαστικά δηλαδή με το primary key της εγγραφής της οποίας θα δείξουμε τα details. &lt;/P&gt;
&lt;P class="post-body entry-content"&gt;Επίσης να σημειώσουμε οτι στο Query 1 χρησιμοποιούμε το alias &lt;STRONG&gt;"pageid"&lt;/STRONG&gt; για τη στήλη &lt;STRONG&gt;"tabid".&lt;/STRONG&gt; Αυτό το κάνουμε γιατί το "tabid" αποτελεί ήδη παράμετρο του querystring στο dotnetnuke και, λόγω του τρόπου με τον οποίο τα διάφορα ListX modules επικοινωνούν μεταξύ τους (χρησιμοποιώντας το querystring, αν δεν πιάσατε το υποννοούμενο), δεν θέλουμε να μπερδευτεί η δική μας παράμετρος με το querystring που χρησιμοποιείται από το DNN. &lt;/P&gt;
&lt;P class="post-body entry-content"&gt;Ας βάλουμε λοιπόν το πρώτο μας ListX module instance (το "master" κομμάτι του master-detail interface). Προσθέστε ένα ListX instance σε όποια σελίδα θέλετε (αν δεν ξέρετε πώς να το κάνετε αυτό, μην συνεχίσετε να διαβάζετε!).&lt;BR&gt;&lt;BR&gt;- Κάντε κλικ στο "&lt;STRONG&gt;View Options"&lt;/STRONG&gt; του drop-down μενού του νέου σας module για να μεταφερθείτε στη σελίδα ρυθμίσεων. &lt;BR&gt;- Κάντε κλικ στο εικονίδιο "&lt;STRONG&gt;Query"&lt;/STRONG&gt; για να εμφανίσετε την αντίστοιχη ενοτητα και προσθέστε το query no.1:&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P class="post-body entry-content"&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35643/original.aspx"&gt;&lt;/P&gt;&lt;A href="http://bp2.blogger.com/_GEekUYeFuZ0/Rv55dSdd0AI/AAAAAAAAAFk/8vLDOa4nlpQ/s1600-h/listx_1.jpeg"&gt;&lt;/A&gt;
&lt;DIV class="post-body entry-content"&gt;&lt;BR&gt;- Κάντε κλικ στο &lt;STRONG&gt;"Save and Continue"&lt;/STRONG&gt;.&lt;BR&gt;- Κάντε κλικ στο εικονίδιο &lt;STRONG&gt;"Format"&lt;/STRONG&gt; (μπορείτε να ΄ξανακάνετε κλικ στο εικονίδιο &lt;STRONG&gt;"Query"&lt;/STRONG&gt; για να κρύψετε την προηγούμενη ενότητα, αν θέλετε). &lt;/DIV&gt;
&lt;P class="post-body entry-content"&gt;Το επόμενο βήμα μας είναι ο ορισμός του template βάσει του οποίου θα παρουσιάζονται τα δεδομένα μας. Κάντε κλικ στο εικονίδιο με το μολύβι δίπλα στο &lt;STRONG&gt;"List Item Detail"&lt;/STRONG&gt; για να επεξεργαστείτε το list item detail template και να ορίσετε ένα πολύ απλό template όπως το παρακάτω: &lt;/P&gt;
&lt;P class="post-body entry-content"&gt;&lt;A href="http://bp1.blogger.com/_GEekUYeFuZ0/Rv5tnCddz5I/AAAAAAAAAEs/6EaxGauKz1g/s1600-h/listx_2.jpeg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;DIV class="post-body entry-content"&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35644/original.aspx"&gt;&lt;BR&gt;&lt;BR&gt;Προσέξτε οτι το template αυτό, στην αρχική του μορφή, δεν περιέχει κάποιο ουσιώδες link για να επικοινωνήσουμε με το "detail" τμήμα του interface μας (το οποίο δεν έχουμε ούτως η άλλως φτιάξει ακόμα). Θα προσθέσουμε τον σχετικό κώδικα αργότερα. .&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;- Κάντε κλικ στο &lt;STRONG&gt;"Save and Continue"&lt;/STRONG&gt;.&lt;BR&gt;- Κάντε κλικ στο εικονίδιο &lt;STRONG&gt;"Format"&lt;/STRONG&gt; ξανά για να κρύψετε, αν θέλετε, αυτή την ενότητα.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Τελειώνοντας την προετοιμασία του πρώτου μας module, θα τσεκάρουμε την επιλογή &lt;STRONG&gt;"Show all records"&lt;/STRONG&gt; στην ενότητα General της σελίδας View Options για να μπορέσουμε να δούμε όλες τις εγγραφές, όπως παρακάτω: &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;A href="http://bp0.blogger.com/_GEekUYeFuZ0/Rv5uPyddz6I/AAAAAAAAAE0/26eB0ISwV2o/s1600-h/listx_3.jpeg"&gt;&lt;/A&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35645/original.aspx"&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class="post-body entry-content"&gt;- Κάντε κλικ στο &lt;STRONG&gt;"Save Configuration"&lt;/STRONG&gt; για να επιστρέψετε στη σελίδα σας. &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Να πώς θα φαίνονται τα αποτελέσματα του "master" module:&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35646/original.aspx"&gt;&lt;/DIV&gt;&lt;A href="http://bp1.blogger.com/_GEekUYeFuZ0/Rv56JCdd0BI/AAAAAAAAAFs/0kpr29JhRBk/s1600-h/listx_4.jpeg"&gt;&lt;/A&gt;
&lt;P&gt;&lt;BR&gt;&lt;BR&gt;Εχουμε λοιπόν μια λίστα που προέρχεται από ένα query που κάναμε στον πίνακα tabs, η οποία περιέχει links που (ακομα) δεν οδηγούν πουθενά. Ας ξεκινήσουμε την ετοιμασία του δεύτερου (detail) ListX module και θα επανέλθουμε αργότερα στο πρώτο. Προσθέστε άλλο ένα ListX instance στη σελίδα σας, κάτω από το πρώτο. &lt;BR&gt;&lt;BR&gt;Για να μην γίνει τεράστιο αυτό το άρθρο, από εδώ και κάτω δεν θα δίνω οδηγίες για το πώς μπορείτε να μεταβείτε στις διάφορες ενότητες της σελίδας View Options του ListX module. Απλα φροντίστε να κάνετε κλικ στο &lt;STRONG&gt;"Save and Continue"&lt;/STRONG&gt; κάθε φορά που ολοκληρώνετε μια ομάδα ρυθμίσεων έτσι ωστε να μην χάσετε κατα λάθος τις ρυθμίσεις σας. &lt;BR&gt;&lt;BR&gt;Στο δεύτερο ListX instance μας (το "detail"), πρέπει επίσης να ορίσουμε ένα query για να αντλούμε δεδομένα από τον πίνακα tabs. Θα χρησιμοποιήσουμε το Query no.2:&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35647/original.aspx"&gt;&lt;BR&gt;&lt;A href="http://bp0.blogger.com/_GEekUYeFuZ0/Rv56aydd0CI/AAAAAAAAAF0/vqYsKrIfa_c/s1600-h/listx_5.jpeg"&gt;&lt;/A&gt;&lt;BR&gt;και θα ορίσουμε επίσης ένα απλό template παρουσίασης στην ενότητα Format:&lt;BR&gt;&lt;BR&gt;&lt;A href="http://bp0.blogger.com/_GEekUYeFuZ0/Rv5zPyddz_I/AAAAAAAAAFc/OtFNiBTgrYk/s1600-h/listx_6.jpeg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35649/original.aspx"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Μην ξεχάσετε να τσεκάρετε την επιλογή &lt;STRONG&gt;"Show all records"&lt;/STRONG&gt; στην ενότητα General της σελίδας View Options.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Αυτό που κάναμε στο δεύτερο module μας θα μας παρουσιάσει τα details μιας εγγραφής που θα επιλέξουμε από το πρώτο μας ListX module. Για να δουλέψει όμως αυτό, πρέπει να κανουμε άλλη μια ρύθμιση στο "detail" listX module μας: Να ορίσουμε την παράμετρο &lt;STRONG&gt;@pageid&lt;/STRONG&gt;. Αυτή θα προέρχεται από το QueryString (είναι ο τρόπος με τον οποίο δουλεύει το ListX σε αυτή την περίπτωση), έτσι πρέπει να ορίσουμε κάτι όπως το παρακάτω στην ενότητα Variables της σελίδας View Options στο δεύτερο ListX module μας:&lt;/P&gt;&lt;A href="http://bp3.blogger.com/_GEekUYeFuZ0/Rv567idd0DI/AAAAAAAAAF8/cdH7BbYOM7Y/s1600-h/listx_7.jpeg"&gt;&lt;/A&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35652/original.aspx"&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;Αν θυμάστε τι είπα για τις παραμέτρους του querystring νωρίτερα, ίσως τώρα κατανοείτε καλύτερα γιατί χρησιμοποιούμε το όνομα pageid αντί του tabidf. Αν χρησιμοποιείτε URLs θα δείτε την παράμετρο κάπως έτσι: &lt;STRONG&gt;/tabid/xxx &lt;/STRONG&gt;οπου xxx είναι το id της σελίδας σας ενώ αν δεν χρησιμοποιείτε friendly URLs θα δείτε την παράμετρο να εμφανίζεται κάπως έτσι: &lt;STRONG&gt;/default.aspx?tabid=xxx&lt;/STRONG&gt;. Οπως και να έχει, εφόσον αυτή η παράμετρος χρησιμοποιείται για ΚΑΘΕ σελίδα στην οποία μεταβαίνουμε εντός του DNN, πρέπει να ΜΗΝ χρησιμοποιήσουμε αυτό το όνομα για την querystring parameter μέσω της οποίας θα επικοινωνούν τα δύο ListX modules μας. (Ελπίζω να μην σας μπέρδεψα χειρότερα).&lt;/P&gt;&lt;BR&gt;
&lt;P&gt;- Κάντε κλικ στο &lt;STRONG&gt;"Save Configuration" &lt;/STRONG&gt;όταν τελειώσετε με όλες τις ρυθμίσεις για να επιστρέψετε στη σελίδα σας. .&lt;/P&gt;Αυτό που κάναμε ήταν οτι ορίσαμε μια μεταβλητή η οποία θα περιέχεται στο querystring με το όνομα "pageid". Η τιμή της μεταβλητής αυτής θα δοθεί στην παράμετρο @pageid (του δεύτερου query μας) ωστε το WHERE του να φέρει μόνο μια εγγραφή (αυτή με το συγκεκριμένο id). 
&lt;P&gt;Περιμένετε όμως. Δεν πρέπει να κάνουμε το πρώτο μας (master) module να επικοινωνεί με κάποιο τρόπο με το δεύτερο (detail) module μας και να "περνάει" αυτή τη μεταβλητή; &lt;/P&gt;
&lt;P&gt;Φυσικά. Εφόσον έχουμε μια μοναδική τιμή id για κάθε εγγραφή, είναι η ώρα να τη χρησιιμοποιήσουμε. Μετατρέπουμε το template του ΠΡΩΤΟΥ μας (master) module ως εξής:&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;BR&gt;&lt;A href="http://bp3.blogger.com/_GEekUYeFuZ0/Rv57Zidd0EI/AAAAAAAAAGE/Xa5m-WzRFQ0/s1600-h/listx_8.jpeg"&gt;&lt;/A&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35653/original.aspx"&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;&lt;/P&gt;Η &lt;STRONG&gt;lxFetch function&lt;/STRONG&gt; είναι μια JavaScript function του ListX η οποία, με λίγα λόγια, κάνει refresh ένα module (με AJAX) περνώντας του όσα name/value pairs χρειάζονται, στο querystring. &lt;BR&gt;&lt;BR&gt;Η πρώτη παράμετρος είναι το module ID του module που θέλουμε να φορτώσουμε (fetch). Το module id μπορείτε να το βρείτε με διάφορους τρόπους (ο πιό εύκολος είναι να κοιτάξετε την τιμή της παραμέτρου mid στο querystring, όταν βρίσκεστε στα settings του συγκεκριμένου module - στο listX μπορείτε να χρησιμοποιήσετε και τη λειτουργία debug για να το δειτε). Στην περίπτωσή μας, το id του "detail" module είναι το 375.&lt;BR&gt;
&lt;DIV&gt;&lt;/DIV&gt;&lt;BR&gt;
&lt;DIV&gt;Η δεύτερη παράμετρος δεν ειναι και τόσο σημαντική για τους σκοπούς αυτού του άρθρου - στο documentation του listX μπορείτε να βρείτε περισσότερα. Δινουμε την default τιμή 0. &lt;/DIV&gt;&lt;BR&gt;
&lt;DIV&gt;&lt;/DIV&gt;
&lt;DIV&gt;Η τρίτη παράμετρος είναι τα name/value pairs που θέλουμε να περάσουμε στο module που κάνουμε refresh. (Το "detail" listX module στην περίπτωσή μας). Το[pageid] θα αντικατασταθεί με την τιμή του πεδίου tabid της συγκεκριμένης κάθε φορά εγγραφής, και έτσι θα έχουμε μια διαφορετική τιμή για κάθε μας εγγραφή. Η τιμή αυτή θα περάσει στο δεύτερο ListX module μας (detail) ως μεταβλητή του querystring (αν και, λόγω του AJAX, η ίδια η σελίδα μας δεν θα ξαναφορτωθεί, οπότε μην περιμένετε να δείτε την μεταβλητή αυτή στο query string που σας δείχνει ο browser σας) και θα χρησιμοποιηθεί στο detail&amp;nbsp;query μας.&amp;nbsp;&lt;/DIV&gt;&lt;BR&gt;
&lt;DIV&gt;&lt;/DIV&gt;
&lt;DIV&gt;Το αποτέλεσμα είναι ένα master/detail interface στο οποίο τα περιεχόμενα του "detail" module αλλάζουν ανάλογα με τις επιλογές μας στο "master" module ΧΩΡΙΣ να ξαναφορτώνεται η σελίδα. Φυσικά, το layout μας εδώ είναι "παιδικό" και σίγουρα μπορείτε να κάνετε καλύτερη δουλειά από εμένα! :) &lt;/DIV&gt;&lt;BR&gt;
&lt;DIV&gt;&lt;/DIV&gt;&lt;BR&gt;
&lt;DIV&gt;Κάπως έτσι θα φαίνεται το τελικό μας αποτέλεσμα: &lt;/DIV&gt;
&lt;DIV&gt;&lt;BR&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35654/original.aspx"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;A href="http://bp3.blogger.com/_GEekUYeFuZ0/Rv6Czidd0FI/AAAAAAAAAGM/Wv8x7QX9gf0/s1600-h/listx_9.jpeg"&gt;&lt;/A&gt;&lt;BR&gt;
&lt;P&gt;Κάνοντας κλικ σε οποιδήποτε link του πρώτου listX module, τα περιεχόμενα του δεύτερου ListX module αλλάζουν χωρίς να ξαναφορτώνεται η σελίδα. &lt;/P&gt;
&lt;P&gt;Υπάρχουν φυσικα και άλλα ζητήματα, όπως π.χ. το τι μπορείτε να δειχνετε την πρώτη φορά που φορτώνεται η σελίδα (και που δεν έχετε επιλέξει κάτι από το πρώτο listX module), όμως είναι εκτός scope για αυτό το άρθρο. Είναι πάντως εύκολο να εμφανίσετε κάποιο μήνυμα ή ακόμα και να έχετε αρχικά κρυμμένο το δεύτερο module. &lt;/P&gt;
&lt;P&gt;Happy ListX'ing!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=35657" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>Τεχνική παρουσίαση DotNetNuke portal: New Generis</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/09/28/dotnetnuke-portal-new-generis.aspx</link><pubDate>Fri, 28 Sep 2007 18:23:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35550</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/35550.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=35550</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=35550</wfw:comment><description>&lt;P&gt;&lt;IMG src="http://www.dotnetzone.gr/cs/photos/cap/images/35549/original.aspx" align=right&gt;Η κατασκευή του &lt;A href="http://www.newgeneris.org"&gt;New Generis&lt;/A&gt; ξεκίνησε πέρυσι και σήμερα το&amp;nbsp;portal&amp;nbsp;"τρέχει" στην έκδοση 4.3.4 του DotNetNuke. Το portal έχει κατασκευαστεί εξ'ολοκλήρου με DotNetNuke και εδώ αποσκοπώ στο να δώσω κάποιες τεχνικές λεπτομέρειες για την κατασκευή του:&lt;/P&gt;
&lt;P&gt;To portal κατασκευάστηκε κατόπιν παραγγελίας, με προδημιουργημένο γραφικό interface από τον πελάτη (HTML) το οποίο και προσαρμόστηκε κατόπιν στο layout του DotNetNuke. Δεν δημιουργήθηκε νέο skin, αλλά έγινε απευθείας προσαρμογή. &lt;/P&gt;
&lt;P&gt;Για την πλοήγηση στο top level χρησιμοποιήθηκε static html με "καρφωτά" τα tab ids, ενώ για την πλοήγηση στο αριστερό κομμάτι χρησιμοποιήθηκε το module &lt;A href="http://sixxac.com/ccc/DotNetNuke/SixxacMenu/tabid/187/Default.aspx"&gt;Sixxac menu&lt;/A&gt;, το οποίο διατίθεται δωρεάν. Υπήρχαν ειδικές απαιτήσεις για το navigation στα αριστερά, τις οποίες έχω περιγράψει &lt;A href="http://www.dotnetzone.gr/cs/blogs/sfilip/archive/2006/06/18/navigation-dotnetnuke.aspx"&gt;σε προηγούμενο post μου&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Για την ενότητα &lt;A href="http://www.newgeneris.org/Default.aspx?tabid=69"&gt;News &amp;amp; Events&lt;/A&gt;&amp;nbsp;χρησιμοποιήθηκε το module &lt;A href="http://www.orizonti.com/Default.aspx?tabid=646"&gt;Orizonti NukeNews&lt;/A&gt;, κατάλληλα προσαρμοσμένο.&lt;/P&gt;
&lt;P&gt;Ειδική εργασία έχει γίνει και στην members-only ενότητα του portal, οπου ερευνητές συμμετέχουν σε 17 work packages, με δικαιώματα που ποικίλουν. Για το σκοπό αυτό δημιουργήθηκαν αντίστοιχα security groups και χρησιμοποιήθηκε εκτενώς το (core) &lt;A href="http://www.dotnetnuke.com/Products/Development/Projects/ModuleRepository/tabid/830/Default.aspx"&gt;repository module&lt;/A&gt;&amp;nbsp;στο οποίο προσαρμόστηκαν κατάλληλα τα security options για κάθε work package.&lt;/P&gt;
&lt;P&gt;Χρησιμοποιήθηκαν επίσης τα &lt;A href="http://www.dotnetnuke.com/DotNetNukeProjects/ModuleForums/tabid/820/Default.aspx"&gt;forums&lt;/A&gt; και &lt;A href="http://www.dotnetnuke.com/Products/Development/Projects/ModuleBlog/tabid/842/Default.aspx"&gt;blogs&lt;/A&gt; core DNN modules.&lt;/P&gt;
&lt;P&gt;Η παράδοση του portal έγινε χωρίς εισαγωγή περιεχομένου, το οποίο αργότερα εισήγαγαν οι υπεύθυνοι περιεχομένου του portal.&lt;/P&gt;
&lt;P&gt;Σημείωση: Ισως παρατηρήσετε οτι το layout "χαλάει" (τραβιέται προς τα δεξιά) σε ορισμένες σελίδες. Αυτό δυστυχώς προκαλείται λόγω κάποιων html tables που έγιναν paste από τους υπεύθυνους περιεχομένου του portal και οι οποίοι έχουν εξαιρετικά μεγάλο πλάτος που ξεπερνά το μέγιστο δοθέν πλάτος για το content pane. Δυστυχώς δεν υπάρχει κάποιος τρόπος να προφυλαχθεί κανείς από αυτό, πλην του να μειώσει το πλάτος των html tables. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;table style="background-color:#008888;" width="100%" cellpadding="2" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td align="center" style="background-color:#008888;"&gt;

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=35550" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>Καθυστερήσεις στα Vista κατά την αντιγραφή / διαγραφή μεγάλων αρχείων</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/09/22/vista.aspx</link><pubDate>Sun, 23 Sep 2007 03:29:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35250</guid><dc:creator>cap</dc:creator><slash:comments>5</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/35250.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=35250</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=35250</wfw:comment><description>&lt;P&gt;Ενα θέμα που επηρέασε και εμένα, όπως και πολλούς άλλους,&amp;nbsp;μετά την εγκατάσταση των Vista, ήταν ο ανορθόδοξα μεγάλος χρόνος που έκαναν να αντιγράψουν μεγάλους όγκους αρχείων μεταξύ του ίδιου ή διαφορετικών δίσκων, καθώς και ένα περίεργο error (insufficient system resources) που έβγαινε κατά καιρούς. Μαλιστα αντιγράφοντας από / προς τον δικτυακό μου δίσκο (Mybook 1TB) το πρόβλημα ήταν κάτι περισσότερο από εμφανές.&lt;/P&gt;
&lt;P&gt;Φαίνεται οτι&amp;nbsp;το θέμα αυτό έχει πάρει διαστάσεις, με τη&amp;nbsp;Microsoft να έχει ανακοινώσει ένα patch το οποίο όμως ΔΕΝ έχει εμφανιστεί ακόμα στο Windows update (&lt;A href="http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=1358057&amp;amp;SiteID=17"&gt;σχετικό thread στο Technet εδώ&lt;/A&gt;). Εχει εκδοθεί ένα hotfix, το οποίο όμως επιχείρησα να εγκαταστήσω και το σύστημά μου αρνήθηκε να εγκαταστήσει (δεν δίνω link γιατί φαίνεται οτι κυκλοφορούν παραπάνω από ένα hotfixes που απευθύνονται σε διαφορετικά προβλήματα).&lt;/P&gt;
&lt;P&gt;Φαίνεται οτι το πρόβλημα αυτό δεν εμφανίζεται σε όλους και δεν προκύπτει πάντοτε από τα ίδια αίτια. Η λύση που βρήκα όμως και δούλεψε για μένα είναι η εξής:&lt;/P&gt;
&lt;P&gt;1. Ανοίγουμε ένα command prompt.&lt;BR&gt;2. Δίνουμε την εντολή netsh int tcp set global autotuninglevel=disabled.&lt;BR&gt;3. Κάνουμε επανεκκίνηση.&lt;/P&gt;
&lt;P&gt;Με αυτό τον τρόπο λέμε στα Vista να σταματήσουν να κάνουν auto tuning στο δίκτυο, κάτι που φαίνεται οτι ευθύνεται για τα "δεινά" της μετακίνησης / αντιγραφής / διαγραφής αρχείων. (Τώρα μην με ρωτήσετε γιατί το ένα προκαλεί το άλλο, δεν είμαι τεχνικός! :) ) &lt;/P&gt;
&lt;P&gt;Σε περίπτωση που αντιμετωπίσετε οποιοδήποτε πρόβλημα, μπορείτε να γυρίσετε τη ρύθμιση στην αρχική της κατάσταση με την εντολή netsh int tcp set global autotuninglevel=normal.&lt;/P&gt;
&lt;P&gt;Για περισσότερες πληροφορίες, εδώ: &lt;A href="http://www.howtogeek.com/howto/windows-vista/fix-problems-with-copying-large-files-in-windows-vista/"&gt;http://www.howtogeek.com/howto/windows-vista/fix-problems-with-copying-large-files-in-windows-vista/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=35250" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_9303B503BD03B903BA03AC03_/default.aspx">Γενικά</category></item><item><title>Δέκα σημάδια που υποδεικνύουν οτι μάλλον χρεώνετε λίγα ως ελεύθερος επαγγελματίας</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/09/22/35248.aspx</link><pubDate>Sun, 23 Sep 2007 01:46:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35248</guid><dc:creator>cap</dc:creator><slash:comments>3</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/35248.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=35248</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=35248</wfw:comment><description>&lt;P&gt;Το συγκεκριμένο άρθρο το βρήκα εδώ: &lt;A href="http://freelanceswitch.com/humour/top-ten-signs-you-may-be-charging-too-little/"&gt;http://freelanceswitch.com/humour/top-ten-signs-you-may-be-charging-too-little/&lt;/A&gt;&amp;nbsp;και σκέφτηκα να το μεταφράσω στα Ελληνικά μια και κρύβει πολλές αλήθειες. :)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;10:&lt;/FONT&gt;&lt;/STRONG&gt; &lt;BR&gt;Οι πελάτες σας πιστεύουν οτι η τιμή που τους χρεώνετε ανά ανθρωποημέρα εργασίας είναι η τιμή ανά ανθρωποώρα.&lt;BR&gt;&lt;BR&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;9:&amp;nbsp;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;Για κάθε προσφορά που υποβάλλετε, παίρνετε αμέσως τη δουλειά. &lt;BR&gt;&lt;BR&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;8:&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;Αν και δουλεύετε 80 ώρες την εβδομάδα, το επίπεδο του εισοδήματός σας σας καθιστά υποψήφιους για επιδοτήσεις από την κοινωνική πρόνοια.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;7:&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;Οι καινούριοι πελάτες σας ρωτάνε πάντοτε που βρίσκεται η παγίδα.&lt;BR&gt;&lt;BR&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;6:&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;Οι πελάτες πληρώνουν τα τιμολόγιά σας σε μετρητά - από το πορτοφόλι τους.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;5:&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;Δέχεστε emails μίσους από συνάδελφους ελεύθερους επαγγελματίες.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;4:&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;Οι παλιοί σας πελάτες δεν ασχολούνται καν με το να σας ρωτήσουν πόσο θα στοιχίσει κάτι.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;3:&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;Δεν ξεμένετε ποτέ από δουλειά, παρ'όλα αυτά τρέφεστε με κονσέρβες και έτοιμο φαγητό.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;2:&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;Το 12χρονο αδερφάκι σας βγάζει περισσότερα από εσάς ψήνοντας μπιφτέκια σε καντίνα&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;Και το νούμερο ένα σημάδι οτι χρεώνετε ΠΟΛΥ λίγα:&lt;BR&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;1:&lt;BR&gt;&lt;/STRONG&gt;Δέχεστε τηλεφωνήματα από εταιρίες στην Ινδία που θέλουν να κάνουν outsource τη δουλειά τους σε εσάς.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=35248" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_9503C103B303B103C303B903B103BA03AC03_+_B803AD03BC03B103C403B103_/default.aspx">Εργασιακά θέματα</category></item><item><title>Jet Unspecified Error στον IIS7 όταν επιχειρούμε να συνδεθούμε σε MS Access Database</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/09/21/jet-unspecified-error-iis7-ms-access-database.aspx</link><pubDate>Sat, 22 Sep 2007 06:38:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35241</guid><dc:creator>cap</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/35241.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=35241</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=35241</wfw:comment><description>&lt;P&gt;Δημοσιεύω αυτό εδώ μια και αντιμετώπισα το πρόβλημα πρόσφατα και ίσως βοηθήσει και άλλους συναδέλφους.&lt;/P&gt;
&lt;P&gt;Πρόσφατα "μετακόμισα" στα Vista και τον αξιαγάπητο IIS7. Χρειάστηκε όμως να δουλέψω ένα παλιό site γραμμένο σε Classic ASP 3.0 και Access database. Αφού έκανα ο,τι χρειαζόταν, επιχείρησα να συνδεθώ και πήρα το φρικτό παρακάτω:&lt;/P&gt;
&lt;P&gt;Microsoft JET Database Engine&lt;FONT face="Times New Roman" size=3&gt; &lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;error '80004005'&lt;/FONT&gt;&lt;FONT face="Times New Roman" size=3&gt; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Unspecified error&lt;/FONT&gt; 
&lt;P&gt;Μην έχοντας κάποιο άλλο προφανές σφαλμα μια και το site έπαιζε αλλού, και εχοντας ακούσει οτι και σε παλιότερες εκδόσεις των Windows ενδέχεται να χρειάζεται να δοθούν δικαιώματα r/w στον IUSR_machinename χρήστη στον φάκελο %temp% (που υποτίθεται οτι είναι&amp;nbsp;φάκελος συστήματος), πήγα και έκανα αυτό ακριβώς. Αμ δε! Στα vista ο φάκελος %temp% κάνει map στον logged in χρήστη, δίνει δηλαδή κάτι σαν: C:\Users\sotirisf\AppData\Local\Temp&lt;/P&gt;
&lt;P&gt;Φυσικά με αυτό δεν λύνεται το πρόβλημα. Ομως μετά από ΠΟΛΥ ψάξιμο βρήκα το εξής το οποίο μου έλυσε το πρόβλημα: Ο φάκελος στον οποίο πρέπει να προστεθεί ο IUSR χρήστης (προσοχή: στα vista λέγεται ΑΚΡΙΒΩΣ IUSR χωρίς το underscore και το όνομα του μηχανήματος μετά) είναι ο &lt;STRONG&gt;c:\windows\serviceprofiles\networkservice\appdata\local\temp&lt;/STRONG&gt; !&lt;/P&gt;
&lt;P&gt;To original post εδώ: &lt;A href="http://www.issociate.de/board/post/408540/IIS7_and_Access_Database:_vague_error,_nothing_in_logs!.html"&gt;http://www.issociate.de/board/post/408540/IIS7_and_Access_Database:_vague_error,_nothing_in_logs!.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;My pills, my nerves and a taxi.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=35241" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category></item><item><title>Κυκλοφόρησε ο Maxthon 2.0</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/08/29/maxthon-2-0.aspx</link><pubDate>Thu, 30 Aug 2007 02:04:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:34583</guid><dc:creator>cap</dc:creator><slash:comments>2</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/34583.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=34583</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=34583</wfw:comment><description>&lt;P&gt;&lt;IMG hspace=5 src="http://www.dotnetzone.gr/cs/photos/general/images/34582/original.aspx" align=left&gt;Ο &lt;A href="http://www.maxthon.com"&gt;Maxthon&lt;/A&gt;, αν δεν τον ξέρετε ήδη, είναι ένα shell που χρησιμοποιεί τη μηχανή του IE αλλά τα κάνει όλα πολύ πιό γρήγορα και πιό καλά! (Τώρα το πώς γίνεται αυτό μόνο οι ίδιοι το ξέρουν). Ηδη από την έκδοση 1.0 και πολύ πριν τον IE χρησιμοποιούσε tabbed browsing, ενώ υποστηρίζει mouse gestures, drag&amp;amp;drop των links σε νέα tabs και διάφορα άλλα καλούδια που στον ΙΕ7.0 είναι εφικτά μόνο μέσω plugins όπως το &lt;A href="http://www.ie7pro.com"&gt;IE7Pro&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Και μια και μιλάμε για plugins, ο Maxthon έχει ένα εξαιρετικά μεγάλο &lt;A href="http://addons.maxthon.com/category/Plugins"&gt;οπλοστάσιο από plugins&lt;/A&gt; (μην ξεχάσετε να δείτε το&amp;nbsp;εκπληκτικό&amp;nbsp;&lt;A href="http://addons.maxthon.com/post/2007/03/30/del-icio-us-sidebar"&gt;del.icio.us sidebar&lt;/A&gt; που δεν το βρίσκετε - πιστεύω - πουθενά αλλού) καθώς και μια &lt;A href="http://addons.maxthon.com/category/MX2+Skins"&gt;πληθώρα skins&lt;/A&gt; τα οποία αλλάζουν κυριολεκτικά με το πάτημα ενός κουμπιού.&lt;/P&gt;
&lt;P&gt;Ταχύτατος, αξιόπιστος, και γεμάτος καλούδια όπως αυτόματη συμπλήρωση φορμών, ad blockers, file filters, undo features, screen capture tools και άλλα πολλά. Μοναδικό μειονέκτημα: Toolbars ειδικά για τον IE δεν "παίζουν" στο Maxthon (εμένα φυσικά διόλου δεν με πειράζει).&lt;/P&gt;
&lt;P&gt;Τον χρησιμοποιώ προσωπικά εδώ και αρκετά χρόνια, και, επειδή είναι IE χωρίς όμως τη βραδύτητα του κανονικού IE, δεν τον αλλάζω με τίποτα. Χρόνος φόρτωσης μηδενικός, η ταχύτητά του στο χειρισμό μπορεί άνετα να συγκριθεί με αυτή του Opera, ενώ διαθέτει αρκετά από τα καλούδια που θα βρείτε και στο Firefox. Η έκδοση 2.0 είναι συμβατή με Vista ενώ τα downloads του Maxthon συνολικά ξεπερνούν τα 100.000.000.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=34583" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A703C103AE03C303B903BC03B103_+_B503C103B303B103BB03B503AF03B103_/default.aspx">Χρήσιμα εργαλεία</category></item><item><title>Κυκλοφόρησε το DotNetNuke 4.5.3 Greek Language Pack </title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/08/01/dotnetnuke-4-5-3-greek-language-pack.aspx</link><pubDate>Wed, 01 Aug 2007 18:24:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:33984</guid><dc:creator>cap</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/33984.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=33984</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=33984</wfw:comment><description>&lt;P&gt;Χάρη στον κ. Αγγελο Ξυπολιά της &lt;A href="http://www.xelixis.net"&gt;Xelixis.NET&lt;/A&gt; έχουμε πλέον στα χέρια μας το φρεσκότατο Greek DNN Language Pack για την έκδοση 4.5.3 το οποίο &lt;A href="http://www.dotnetnuke.com/Products/Development/Projects/CoreLocalization/LanguagePacks/tabid/933/Default.aspx"&gt;μπορείτε να βρείτε εδώ&lt;/A&gt;. Συγχαρητήρια Αγγελε και συνέχισε να μας δίνεις όμορφα Ελληνικα localizations!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=33984" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>DotNetNuke Login Page: Κλειδωθήκατε έξω; Ο κλειδαράς!</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/07/25/dotnetnuke-login-page.aspx</link><pubDate>Wed, 25 Jul 2007 18:15:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:33762</guid><dc:creator>cap</dc:creator><slash:comments>3</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/33762.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=33762</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=33762</wfw:comment><description>&lt;P&gt;Εχει συμβεί σε πάρα πολλούς, συνέβη και σε μένα. Σε ένα πρόσφατο project, η συνεργάτις μου άλλαξε κατά λάθος την default login page του dotNetnuke (μέσα από τα site settings) και έβαλε μια σελίδα η οποία δεν περιείχε user login module. &lt;/P&gt;
&lt;P&gt;Αυτό είχε ως αποτέλεσμα, φυσικά, να μην έχουμε από πουθενά πρόσβαση σε login page και φυσικά να μην μπορούμε να κάνουμε login στο portal.&lt;/P&gt;
&lt;P&gt;Ψάχνοντας, ανακάλυψα οτι ένα σωρό κόσμος έχει "κλειδωθεί" έξω από το dotNetNuke του για τον ίδιο λόγο. Φυσικά, η λύση είναι απλή:&lt;/P&gt;
&lt;P&gt;1. Αν έχετε πρόσβαση στη database, μπορείτε να βρείτε τον πίνακα Portals και να αλλάξετε το πεδίο LoginTabId σε NULL ωστε το dotNetNuke να "σερβίρει" την default Login Page. (Το tab id που θα δείτε εκεί είναι το id της σελίδας που βάλατε κατά λάθος). Εναλλακτικά, μπορείτε να τρέξετε το εξής query: &lt;FONT color=#0000ff&gt;Update Portals Set LoginTabId=null Where PortalId=xx &lt;/FONT&gt;&lt;BR&gt;(οπου xx το id του portal - αν έχετε μόνο ένα portal, το id του θα είναι 0).&lt;/P&gt;
&lt;P&gt;2. Αν δεν έχετε πρόσβαση στη database, τότε ο John Mitchell έχει τη λύση: Σε &lt;A href="http://blogs.snapsis.com/PermaLink,guid,3078311e-6925-4c03-8243-d1b9c8a11906.aspx"&gt;αυτό εδώ το post του&lt;/A&gt; σας&amp;nbsp;δίνει μια σελίδα την οποία μπορείτε να ανεβάσετε στο portal σας, να την καλέσετε και να κάνει αυτή τη "βρώμικη" δουλειά της ενημέρωσης της database για σάς.&lt;/P&gt;
&lt;P&gt;Οποια από τις δύο λύσεις και αν ακολουθήσετε, το αποτέλεσμα φυσικά θα είναι να ξαναδείτε τα περιζήτητα login/password κουτάκια! :)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=33762" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>ResEx: Μεταφράστε resource files side-by-side (και όχι μόνο)</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/07/12/resex-resource-files-side-by-side.aspx</link><pubDate>Fri, 13 Jul 2007 05:17:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:33558</guid><dc:creator>cap</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/33558.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=33558</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=33558</wfw:comment><description>&lt;P&gt;&lt;A href="http://www.papadi.gr/resex.aspx" target=_new&gt;&lt;IMG src="http://www.papadi.gr/Portals/papadi/resex/resexsnapshot.png" align=right border=0&gt;&lt;/A&gt;Ο συν-moderator στο dotNetZone.gr, Δημήτρης Παπαδημητρίου (&lt;A href="http://www.papadi.gr"&gt;εδώ θα βρείτε περισσότερα για αυτόν&lt;/A&gt;) ολοκλήρωσε την πρώτη έκδοση του &lt;A href="http://www.papadi.gr/resex.aspx"&gt;ResEx&lt;/A&gt;, ενός&amp;nbsp;resource file editor που σας βοηθά να βλέπετε εύκολα (σε δενδρική μορφή) και να μεταφράζετε το περιεχόμενο resource files, side-by-side με την ξενόγλωσση έκδοση του αρχείου. Ο ResEx είναι εξαιρετικά απλός στη χρήση και προσφέρει εκπληκτική ευκολία στην μετάφραση. Αν - λέμε τώρα - έχετε προσπαθήσει να μεταφράσετε π.χ. τα resource files ορισμένων modules του dotNetNuke, θα καταλάβετε σίγουρα τι εννοώ!&lt;/P&gt;
&lt;P&gt;Ορίστε όρισμένα γνωρίσματα του ResEx όπως τα αναφέρει ο Δημήτρης στο site του: Translate values &lt;U&gt;side by side&lt;/U&gt; (just like the old time classic VB6 resource editor), &lt;U&gt;Lock specific strings&lt;/U&gt; so that translator does not translate them, Restrict &lt;U&gt;length&lt;/U&gt; of translating strings, Ensure correct translation of strings with &lt;U&gt;placeholders&lt;/U&gt; {0} {1} ..., Warnings about &lt;U&gt;shortcut characters&lt;/U&gt; (string containing &amp;amp;) , View resource strings in &lt;U&gt;tree&lt;/U&gt; form, Translate resources &lt;U&gt;without Visual Studio&lt;/U&gt; IDE, &lt;U&gt;Search inside&lt;/U&gt; resource files while translating. &lt;/P&gt;
&lt;P&gt;Θέλετε κι άλλα; Είναι τσάμπα, είναι .NET και είναι Ελληνικό! &lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.papadi.gr/resex.aspx"&gt;http://www.papadi.gr/resex.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=33558" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A703C103AE03C303B903BC03B103_+_B503C103B303B103BB03B503AF03B103_/default.aspx">Χρήσιμα εργαλεία</category></item><item><title>Υπαρξιακά προβλήματα WinForms controls: Το NumericUpdown control</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/07/02/winforms-controls-numericupdown-control.aspx</link><pubDate>Mon, 02 Jul 2007 09:39:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:33305</guid><dc:creator>cap</dc:creator><slash:comments>2</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/33305.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=33305</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=33305</wfw:comment><description>&lt;P&gt;Φτιάχτηκε για να μας διευκολύνει τη ζωή, αλλά γιά κοιτάξτε τι ωραία που μας την κάνει μαντάρα άμα το ζορίσουμε... Απλά πραγματάκια: Εχω ένα NumericUpDown control σε μια φορμίτσα και θέλω ο άμοιρος να του δίνω τιμές και αυτό να τις παίρνει. Ολα καλά.&lt;/P&gt;
&lt;P&gt;Ομως, για να πατήσουμε ένα Backspace εντός του NumericUpDown και να δούμε τι θα κάνει μόλις αλλάξουμε focus...ΣΩΣΤΑ μαντέψατε, δεν παίρνει default τιμή 0, αλλά κρατάει την παλιά του τιμή! Μόνο που το άτιμο δεν μας το δείχνει, και έτσι, ενώ είναι κενό οπτικά, στην πραγματικότητα έχει τιμή!&lt;/P&gt;
&lt;P&gt;(Για να μην πω τι @%$#@#% έριξα που το είχα και databound σε object και αναρωτιόμουνα "γιατί βάζει έκπτωση ενώ του την έσβησα"; ) &lt;/P&gt;
&lt;P&gt;Σαν να μην μας έφταναν αυτά τα ψυχοπλακωτικά, έρχεται και ο τρόπος επίλυσης να μας κάνει τα νεύρα ακόμα πιό τσατσάλια. Για να δούμε τι έκανα λοιπόν στο LostFocus event (άλλοι λένε οτι καλύτερα βέβαια να το βάλουμε στο Validating):&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; nmrDiscount_LostFocus(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Handles&lt;/SPAN&gt; nmrDiscount.LostFocus&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&lt;/SPAN&gt; nmrDiscount.Text.Equals(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;.Empty) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Then&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nmrDiscount.Value &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nmrDiscount.Text &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"0"&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;If&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Ωραία. Τι πιό απλό θα μου πείτε;&lt;/P&gt;
&lt;P&gt;Για να σας πω κι εγώ με τη σειρά μου: ΠΟΙΟ ΤΕΧΤ PROPERTY ΡΕ ΠΑΛΗΚΑΡΙΑ; Αφού ούτε το Intellisense το βγάζει! Οκ, όλα τα Winforms controls ΥΠΟΤΙΘΕΤΑΙ οτι έχουν ένα text property, αλλά ΕΛΕΟΣ, οχι απλά πρέπει να το ελέγξω (γιατί αυτό είναι τελικά που γίνεται string.empty και όχι το value, αλλά να το ΑΛΛΑΞΩ κιόλας, γιατί αλλιώς το value μεν θα γίνει 0, εγώ θα συνεχίσω να βλέπω το απέραντο κενό στο NumericUpDown μου...)&lt;/P&gt;
&lt;P&gt;Το πρόβλημα λύθηκε. Και τα νεύρα μου κορδέλες. Τα χάπια μου!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=33305" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category></item><item><title>DotNetNuke και δοκιμές με το ISearchable interface</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/02/21/dotnetnuke-isearchable-interface.aspx</link><pubDate>Wed, 21 Feb 2007 21:13:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:25259</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/25259.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=25259</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=25259</wfw:comment><description>&lt;P&gt;Οταν φτιάχνετε ένα custom module στο DotNetNuke, πολλές φορές μπορεί να χρειάζεται να υλοποιήσετε το ISearchable Interface, το οποίο σας επιτρέπει να ενσωματώσετε στο search του DotNetNuke αποτελέσματα που παράγονται από το δικό σας module. Για παράδειγμα, σε περίπτωση που το module σας αντλεί δεδομένα από δικούς του πίνακες (ας πούμε π.χ. δεδομένα πωλήσεων), υλοποιώντας στο module σας το ISearchable interface λέτε στον scheduler του DotNetNuke να συμπεριλάβει στη διαδικασία indexing και τα δικά σας δεδομένα. &lt;/P&gt;
&lt;P&gt;Το ISearchable είναι πολύ ισχυρό, αλλά δυστυχώς δεν υπάρχει εύκολος τρόπος να το δοκιμάσει κανείς παρά να αρχίσει να κάνει searches με λέξεις - κλειδιά, ελπίζοντας οτι μέσα σε αυτές θα βρίσκονται αποτελέσματα που θα προέρχονται από τα δεδομένα του custom module σας. (Η, εναλλακτικά, να "βουτήξετε" στη database και να δείτε τι έγινε index).&lt;/P&gt;
&lt;P&gt;O κ. Nik Kalyani εντόπισε το πρόβλημα και δημοσίευσε μια λύση εδώ:&lt;BR&gt;&lt;A href="http://www.dotnetnuke.com/Community/BlogsDotNetNuke/tabid/825/EntryID/1100/Default.aspx"&gt;http://www.dotnetnuke.com/Community/BlogsDotNetNuke/tabid/825/EntryID/1100/Default.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Η λύση ουσιαστικά είναι μια .aspx σελίδα την οποία βάζετε στο root του site σας. Δίνοντας το tabid και το moduleid σας επιστρέφει όλα τα αποτελέσματα που έχουν γίνει index για αυτό το συνδυασμό.&lt;/P&gt;
&lt;P&gt;Time-saver!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=25259" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category></item><item><title>Databinding και InotifyPropertyChanged - Μαμα, ο BindingManager κάνει του κεφαλιού του!</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/02/07/databinding-inotifypropertychanged-bindingmanager.aspx</link><pubDate>Wed, 07 Feb 2007 17:30:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:24620</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/24620.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=24620</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=24620</wfw:comment><description>&lt;P&gt;Στο &lt;A&gt;dotNETZone.gr&lt;/A&gt; είχαμε &lt;A href="http://www.dotnetzone.gr/cs/forums/thread/24270.aspx"&gt;μια ενδιαφέρουσα συζήτηση&lt;/A&gt; γύρω από ένα θέμα που προκύπτει με το databinding όταν χρησιμοποιούμε το &lt;A href="http://msdn2.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx"&gt;INotifyPropertyChanged&lt;/A&gt; και σηκώνουμε το PropertyChanged event. Σκέφτηκα λοιπόν να παραθέσω το θέμα εδώ για όποιον συνάδελφο ενδιαφέρεται.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;Το σενάριο (+ backgrounder):&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Εχουμε ένα custom business object το οποίο έχει κάποια properties. Θέλουμε να "δέσουμε" αυτά τα properties με simple binding σε αντίστοιχα controls (π.χ. labels) μιας φόρμας, έτσι ώστε όταν αλλάζει κάποιο property να ενημερώνονται οι τιμές των controls της φόρμας χωρίς άλλες διαδικασίες. Εύκολα, γρήγορα, και απλά. &lt;/P&gt;
&lt;P&gt;Για να το κάνουμε αυτό, εκτός από το γνωστό μακρινάρι:&lt;BR&gt;&lt;EM&gt;MyLabel.Databindings.Add ("Text", myObjectInstance, "ΜyObjectProperty") &lt;BR&gt;&lt;/EM&gt;για κάθε property MyObject Property του MyInstance που θέλουμε να "δέσουμε" σε κάποιο Text property ενός label οπως το MyLabel, θα πρέπει να υλοποιήσουμε στο Business Object (έστω myObject) το interface INotifyPropertyChanged. &lt;/P&gt;
&lt;P&gt;Ετσι, κάθε αλλαγή property θα σηκώνει ένα PropertyChanged event το οποίο θα "μιλάει" με τον υποβόσκων BindingManager και θα ενημερώνει αυτόματα την τιμή των labels στη φόρμα μας.&lt;/P&gt;
&lt;P&gt;Σύμφωνα με το MSDN, πρέπει να κάνουμε Implements INotifyPropertyChanged στην κλάση μας και να προσθέσουμε κώδικα όπως ο παρακάτω:&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Event&lt;/SPAN&gt; PropertyChanged &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; PropertyChangedEventHandler _&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Implements&lt;/SPAN&gt; INotifyPropertyChanged.PropertyChanged&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; NotifyPropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; info &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;)&amp;nbsp;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaiseEvent&lt;/SPAN&gt; PropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; PropertyChangedEventArgs(info))&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Ετσι θα μπορούμε να καλούμε την Sub NotifyPropertyChanged όταν η τιμή κάποιου property αλλάζει, όπως παρακάτω:&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Property&lt;/SPAN&gt; CompanyName() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt; &lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Get&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;.companyNameValue&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Get&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Set&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; value &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;)&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Not&lt;/SPAN&gt; (value &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; companyNameValue) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Then&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Me&lt;/SPAN&gt;.companyNameValue &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NotifyPropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"CompanyName"&lt;/SPAN&gt;)&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;If&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Set&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Property&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Οπως ισως προσέξατε, το propertyChanged event θέλει ως παράμετρο &lt;STRONG&gt;το όνομα του property που άλλαξε&lt;/STRONG&gt;. &lt;/P&gt;
&lt;P&gt;Από εδώ και πέρα, άν έχουμε "δέσει" την τιμή του property CompanyName στο label π.χ. lblCompanyName (κάπως έτσι: lblCompanyName.Databindings.Add ("Text", MyInstance, "CompanyName") οπου MyInstance το instance του class μας που περιέχει το property CompanyName, η τιμή του label θα ενημερώνεται αυτόματα όταν θα γίνονται αλλαγές στο property CompanyName. &lt;/P&gt;
&lt;P&gt;Φυσικά, για όσα properties καλούμε την NotifyPropertyChanged θα γίνεται το ίδιο. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;Το πρόβλημα &lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Εστω οτι υλοποιούμε αυτή τη λογική&amp;nbsp;για ένα object που έχει π.χ. 10 properties, με ισάριθμα labels σε μια Windows Form. Πολύ γρήγορα θα διαπιστώσουμε οτι συμβαίνει το εξής:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Οταν σηκώνεται ένα PropertyChanged event ενημερώνονται ΟΛΑ τα databound labels&lt;/STRONG&gt; της φόρμας με τις τιμές των properties του υποκείμενου business object instance, ανεξαρτήτως αν δεν αφορούν το property που άλλαξε ή άν έχουν αλλάξει ή οχι τιμή.&lt;/P&gt;
&lt;P&gt;Αυτό σημαίνει οτι &lt;STRONG&gt;για κάθε &lt;/STRONG&gt;PropertyChanged event που σηκώνεται θα έχουμε στο συγκεκριμένο σενάριο &lt;STRONG&gt;10 ενημερώσεις&lt;/STRONG&gt;! Και αυτό έχοντας αλλάξει &lt;STRONG&gt;μόνο την τιμή ενός property&lt;/STRONG&gt;!&lt;/P&gt;
&lt;P&gt;Αυτό μπορείτε να το επαληθεύσετε πολύ εύκολα αποφεύγοντας να "σηκώσετε" το PropertyChanged event σε κάποιο property του object σας. Αλλάζοντας την τιμή του property, φυσικά δεν ενημερώνεται το bound πεδίο μια και το PropertyChanged event δεν έχει σηκωθεί. Ομως, αν ενημερώσετε ΚΑΠΟΙΟ ΑΛΛΟ property που ΣΗΚΩΝΕΙ το PropertyChanged event, θα δείτε με έκπληξη οτι θα ενημερωθεί και η τιμή του control που είναι bound στο πρώτο property!&lt;/P&gt;
&lt;P&gt;Σύμφωνα με τη γνώμη ορισμένων &lt;A href="http://www.developersdex.com/vb/message.asp?p=2928&amp;amp;ID=%3C1j1er252pmquk9pi3786qocb32ahkqf38f%404ax.com%3E"&gt;όπως εδώ&lt;/A&gt;, συμβαίνει το εξής:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"Any property changed event will result in &lt;BR&gt;BindingManagerBase.PushData which causes a PushData on *all* its Bindings."&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Ομως, αυτό μας οδηγεί στο εξής συμπέρασμα:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Αν έχω 10 properties bound σε αντίστοιχα controls και ενημερώσω και τα 10, τότε ο συνολικός αριθμός ενημερώσεων που θα γίνει στα controls θα είναι 10 x 10 = 100! Γιατί για κάθε property που σηκώνει ένα PropertyChanged event γίνεται ενημέρωση σε ΟΛΑ τα bound controls που έχω!&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Και φυσικά στην εξής απορία:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Τότε ΤΙ το θέλουμε το όνομα του property στο event;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Για τη δεύτερη απορία είχαν την απάντηση στο &lt;A href="http://www.developersdex.com/vb/message.asp?p=2928&amp;amp;ID=%3C1j1er252pmquk9pi3786qocb32ahkqf38f%404ax.com%3E"&gt;DevelopersDex&lt;/A&gt;: &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;gt; What's the point of specifying a property name in the&lt;BR&gt;&lt;BR&gt;When it comes to WinForms databinding there is no point afaik. &amp;nbsp;&amp;nbsp; But &lt;BR&gt;remember that INotifyPropertyChanged can be used elsewhere too, eg. for the &lt;BR&gt;PropertyGrid (dunno if it refreshes all properties on change there) and also &lt;BR&gt;for WPF (where it doesn't refresh all properties on change).&lt;BR&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Το θέμα είναι όμως οτι έχουμε ένα πρόβλημα. Τις 100 ενημερώσεις! Πώς θα μπορούσαμε να αποφύγουμε αυτό το πρόβλημα; Για να το κάνω ακόμα πιό σοβαρό, φανταστείτε οτι έχουμε ένα ΜΕΓΑΛΟ object με 100 properties bound σε αντίστοιχα controls μιας φόρμας. Αν αλλάξουμε ΟΛΑ τα properties (π.χ. κάνοντας ένα fetch από τη βάση δεδομένων) τότε θα έχουμε 100 x 100 = &lt;STRONG&gt;10000 ενημερώσεις&lt;/STRONG&gt;!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;Η λύση (στο σημείο που μας ενδιαφέρει)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Αφού δεν μπορούμε να το αποφύγουμε, μαλλον πρέπει να καθήσουμε και να το απολαύσουμε. Ο κ. Κελαιδίτης (&lt;A href="http://www.dotnetzone.gr/cs/members/KelMan.aspx"&gt;kelman&lt;/A&gt;) όμως στο &lt;A&gt;dotNETZone.gr&lt;/A&gt; έχει διαφορετική άποψη. Μπορούμε, τουλάχιστον, να αποφύγουμε τις πολλαπλές ενημερώσεις ως εξής, σύμφωνα με τον κώδικα που παραθέτει:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Είναι αναπόφευκτο ωστόσο, όταν δεν ξέρεις ποιό από τα 1000 properties θα αλλάξει. Αν ξέρεις, βάζεις το PropeprtyChanged μόνο στο property που σε ενδιαφέρει. Από την άλλη, μπορείς να αποφύγεις έναν τέτοιο σενάριο υλοποιώντας τον κατάλληλο μηχανισμό. Πρόσεξε: Ο designer όταν σχεδιάζει τη φόρμα βάζει στην αρχή Me.SuspendLayout και αφού τοποθετήσει όλα τα controls, στο τέλος Me.ResumeLayout(False) ώστε να αποφύγει τον τμηματικό σχεδιασμό της φόρμας. Το ίδιο κάνει και το DataRow object όπου με DataRow.BeginEdit κάνεις suspend την ενεργοποίηση των events που προκύπτουν από τα validation rules και στο τέλος με DataRow.ΕndEdit κάνεις ένα συνολικό validate. Αντίστοιχα κι εσύ μπορείς να φτιάξεις ένα ζευγάρι Begin/End ή Suspend/Resume για τη business κλάση σου. Πχ:&lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Imports&lt;/SPAN&gt; System.ComponentModel&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt; Customer&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Implements&lt;/SPAN&gt; INotifyPropertyChanged&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Event&lt;/SPAN&gt; PropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; System.ComponentModel.PropertyChangedEventArgs) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Implements&lt;/SPAN&gt; System.ComponentModel.INotifyPropertyChanged.PropertyChanged&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; _CustomerID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; _CustomerName &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; notificationSuspended &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Boolean&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;False&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Property&lt;/SPAN&gt; CustomerID() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Get&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&lt;/SPAN&gt; _CustomerID&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Get&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Set&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; value &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;_CustomerID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaisePropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"CustomerID"&lt;/SPAN&gt;)&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Set&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Property&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Property&lt;/SPAN&gt; CustomerName() &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Get&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&lt;/SPAN&gt; _CustomerName&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Get&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Set&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; value &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;_CustomerName &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaisePropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"CustomerName"&lt;/SPAN&gt;)&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Set&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Property&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; SuspendNotification()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;notificationSuspended &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;True&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; ResumeNotification(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; notifyChanges &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Boolean&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;notificationSuspended &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;False&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&lt;/SPAN&gt; notifyChanges &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Then&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaisePropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;.Empty)&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;If&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt; RaisePropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;ByVal&lt;/SPAN&gt; propertyName &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;String&lt;/SPAN&gt;)&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Not&lt;/SPAN&gt; notificationSuspended &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Then&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RaiseEvent&lt;/SPAN&gt; PropertyChanged(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Me&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;New&lt;/SPAN&gt; PropertyChangedEventArgs(propertyName))&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;If&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Sub&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;Class&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Έτσι, αν πεις &lt;BR&gt;&lt;BR&gt;x.CustomerID &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"a"&lt;/SPAN&gt;&lt;BR&gt;x.CustomerName &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"b"&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;τρέχουν δύο events. Αν πεις&lt;BR&gt;&lt;BR&gt;x.SuspendNotification()&lt;BR&gt;&lt;BR&gt;x.CustomerID &amp;amp;= &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"2"&lt;/SPAN&gt;&lt;BR&gt;x.CustomerName &amp;amp;= &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"2"&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;x.ResumeNotification(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;True&lt;/SPAN&gt;)&lt;BR&gt;&lt;BR&gt;τρέχει ένα &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;event&lt;/SPAN&gt;. Και αν πεις &lt;BR&gt;&lt;BR&gt;x.SuspendNotification()&lt;BR&gt;&lt;BR&gt;x.CustomerID &amp;amp;= &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"3"&lt;/SPAN&gt;&lt;BR&gt;x.CustomerName &amp;amp;= &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"3"&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;x.ResumeNotification(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;False&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=24620" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category></item><item><title>IE7Pro plugin: Η απάντηση του IE7 στον Maxthon</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/02/03/ie7pro-plugin-ie7-maxthon.aspx</link><pubDate>Sat, 03 Feb 2007 21:59:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:24467</guid><dc:creator>cap</dc:creator><slash:comments>4</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/24467.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=24467</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=24467</wfw:comment><description>&lt;P&gt;Εδώ και καιρό, παρ'ότι έχω εγκαταστήσει τον ΙΕ7 στο σύστημά μου, χρησιμοποιούσα τον Maxthon λόγω των περισσότερων ευκολιών που μου προσέφερε. Ουσιαστικά, βέβαια, χρησιμοποιούσα τον IE7 ούτως η άλλως, μια και ο &lt;A href="http://www.maxthon.com/" target=_blank&gt;Maxthon&lt;/A&gt; είναι απλά ένα shell για τον IE, χρησιμοποιεί δηλαδή τη μηχανή του IE. Ομως, ο Maxthon μου προσέφερε (από τότε που ο IE ήταν στην έκδοση 6) τα εξής: Tabbed browsing, mouse gestures, super drag &amp;amp; drop (σέρνεις ένα link σε μια κενή περιοχή της σελίδας και αυτό ανοίγει σε νέο tab).&lt;/P&gt;
&lt;P&gt;Σήμερα ανακάλυψα &lt;A href="http://www.windowsmarketplace.com/details.aspx?itemid=3210084" target=_blank&gt;ένα πανέμορφο plugin για τον IE7&lt;/A&gt; που του προσφέρει όλα αυτά που με έκαναν να προτιμώ (παλιότερα) τον Maxthon. Το όνομα αυτού IE7Pro. Τι κάνει αυτό;&lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;Mouse gestures&lt;/STRONG&gt;: Για παράδειγμα, σέρνοντας το ποντίκι με πατημένο το πλήκτρο κάτω και δεξιά κλείνει το current tab. Σέρνοντας το ποντίκι προς τα αριστερά κάνετε back στη σελίδα, και πολλά άλλα.&lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;Super drag &amp;amp; drop&lt;/STRONG&gt;: Σερνετε ένα link σε ένα κενό χώρο στη σελίδα και αυτό ανοίγει σε νέο tab.&lt;/P&gt;
&lt;P&gt;Φανταστείτε τώρα εμένα, ο οποίος πολλές φορές θέλω να ανοίξω τα 20 πρώτα results μιας μηχανής αναζήτησης, να ρίξω μια γρήγορη ματιά και να τα κλείσω. Με το συνδυασμό super drag &amp;amp; drop και mouse gestures, η διαδικασία παίρνει μερικά δευτερόλεπτα!&lt;/P&gt;
&lt;P&gt;Η αλήθεια είναι οτι άργησε να φτιαχτεί ένα τέτοιο plugin, για τον Firefox υπάρχει ήδη εδώ και αρκετό καιρό, και ο Οpera υποστηρίζει αυτή τη λειτουργικότητα. Ομως, εχω τώρα ένα λόγο παραπάνω για να χρησιμοποιήσω τον ΙΕ7 πλέον. &lt;/P&gt;
&lt;P&gt;Επιπρόσθετα να σας πω οτι το IE7Pro σας παρέχει ad filter (whitelist/blacklist με wildcards), και αλλαγή του user agent. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;div align="left"&gt;

&lt;/div&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=24467" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A703C103AE03C303B903BC03B103_+_B503C103B303B103BB03B503AF03B103_/default.aspx">Χρήσιμα εργαλεία</category></item><item><title>ConnectionStrings.com: Φτιάξτε εύκολα το connection string σας</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/01/06/23120.aspx</link><pubDate>Sat, 06 Jan 2007 22:22:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:23120</guid><dc:creator>cap</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/23120.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=23120</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=23120</wfw:comment><description>&lt;P&gt;&lt;IMG hspace=5 src="http://images.websnapr.com/?size=s&amp;amp;url=http://www.connectionstrings.com" align=left vspace=5&gt; Ειναι παλιό, αλλά μπορεί να μην το έχετε πάρει χαμπάρι ακόμα: Οι τύποι στο &lt;A href="http://www.connectionstrings.com"&gt;www.connectionstrings.com&lt;/A&gt; έχουν συγκεντρώσει μια τεράστια συλλογή από πρότυπα connection strings για κάθε είδους database (και όχι μόνο). Την επόμενη φορά λοιπόν που θα έχετε απορία για το πώς πρέπει να συντάξετε το δικό σας connection string, ανατρέξτε εκεί και δεν υπάρχει περίπτωση να μην σας λυθεί.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;br /&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=23120" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A003B103C103BF03C503C303B903AC03C303B503B903C203_+_C003C103BF03CA03CC03BD03C403C903BD03_+_BA03B103B903_+_C503C003B703C103B503C303B903CE03BD03_/default.aspx">Παρουσιάσεις προϊόντων και υπηρεσιών</category></item><item><title>Φύλλα γρήγορης αναφοράς (cheat sheets)</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/01/06/23119.aspx</link><pubDate>Sat, 06 Jan 2007 22:06:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:23119</guid><dc:creator>cap</dc:creator><slash:comments>2</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/23119.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=23119</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=23119</wfw:comment><description>&lt;P&gt;Ο κύριος που θα βρείτε σε αυτή τη διεύθυνση: &lt;A href="http://www.ilovejackdaniels.com/cheat-sheets/"&gt;http://www.ilovejackdaniels.com/cheat-sheets/&lt;/A&gt;&amp;nbsp;έχει μαζέψει ένα πακέτο από cheat sheets που είναι σχεδιασμένα για να τα τυπώσετε σε μια Α4 σελιδούλα και να τα έχετε δίπλα σας για γρήγορη αναφορά. Μεταξύ αλλων περιλαμβάνονται τα εξής: HTML, CSS, ASP 3.0, Regular Expressions κλπ. Τα cheat sheets διατίθενται σε μορφή PDF και PNG.&lt;/P&gt;
&lt;P&gt;Επίσης μπορείτε να παρακολουθείτε αυτόν εδώ τον κύριο: &lt;A href="http://john-sheehan.com/blog/index.php/net-cheat-sheets/"&gt;http://john-sheehan.com/blog/index.php/net-cheat-sheets/&lt;/A&gt;&amp;nbsp;ο οποίος όχι μόνο παρακολουθεί τον απο πάνω κύριο αλλά μαζεύει και υλικό για cheat sheets από άλλες πηγές. Τελευταία του προσφορά ένα &lt;A href="http://john-sheehan.com/blog/wp-content/uploads/msnet-formatting-strings.pdf"&gt;.NET String Format Quick Reference&lt;/A&gt;&amp;nbsp;(σε μορφή PDF)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=23119" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category></item><item><title>DotNetKicks.com: Social bookmarking for the .NET Framework</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2007/01/05/23053.aspx</link><pubDate>Fri, 05 Jan 2007 12:17:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:23053</guid><dc:creator>cap</dc:creator><slash:comments>1</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/23053.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=23053</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=23053</wfw:comment><description>&lt;P&gt;&lt;IMG hspace=5 src="http://images.websnapr.com/?size=s&amp;amp;url=http://www.dotnetkicks.com" align=left vspace=5&gt; Δεν χρειάζεται να πω παραπάνω. Είναι μια μηχανή social bookmarking η οποία εξειδικεύεται στο περιεχόμενο για .NET. Μπορείτε να τη δείτε στη διεύθυνση &lt;A href="http://www.dotnetkicks.com"&gt;http://www.dotnetkicks.com&lt;/A&gt;, και αν εγγραφείτε έχετε και την προσωπική σας σελίδα. Ορίστε η δική μου: &lt;A href="http://www.dotnetkicks.com/users/sotirisf"&gt;http://www.dotnetkicks.com/users/sotirisf&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Δυστυχώς οι δημιουργοί ήταν διστακτικοί στο να απαντήσουν θετικά στην ερώτηση που τους έκανα για δημοσίευση περιεχομένου σε γλώσσα άλλη πλην της Αγγλικής, με το επιχείρημα οτι η πλειοψηφία του κόσμου διαβάζει Αγγλικά. Παντως ακομα και έτσι παραμένει μια αξιόλογη υπηρεσία. Ειναι στα πρώτα της βήματα και καλό είναι να την γνωρίσει ο κόσμος γιατί φαίνεται οτι οι άνθρωποι έχουν όρεξη. &lt;/P&gt;
&lt;P&gt;Δινουν και κουμπάκι να βάζετε στις δημοσιεύσεις, καθώς και script για τα feeds τους. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=23053" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/_A003B103C103BF03C503C303B903AC03C303B503B903C203_+_C003C103BF03CA03CC03BD03C403C903BD03_+_BA03B103B903_+_C503C003B703C103B503C303B903CE03BD03_/default.aspx">Παρουσιάσεις προϊόντων και υπηρεσιών</category></item><item><title>Introducing System.Transactions in .NET 2.0</title><link>https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/2006/12/13/22162.aspx</link><pubDate>Thu, 14 Dec 2006 04:35:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22162</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/blogs/sfilip/comments/22162.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/blogs/sfilip/commentrss.aspx?PostID=22162</wfw:commentRss><wfw:comment>https://www.dotnetzone.gr:443/cs/blogs/sfilip/rsscomments.aspx?PostID=22162</wfw:comment><description>&lt;P&gt;Επεσα σήμερα επάνω σε αυτό το πολύ εκτενές document που έχει δημοσιεύσει η Microsoft και διαθέτει προς download, το οποίο περιγράφει αναλυτικά τη χρήση του νέου System.Transactions namespace.&lt;/P&gt;
&lt;P&gt;Ελπίζω να σας φανεί χρήσιμο.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=AAC3D722-444C-4E27-8B2E-C6157ED16B15&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=AAC3D722-444C-4E27-8B2E-C6157ED16B15&amp;amp;displaylang=en&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="https://www.dotnetzone.gr:443/cs/aggbug.aspx?PostID=22162" width="1" height="1"&gt;</description><category domain="https://www.dotnetzone.gr:443/cs/blogs/sfilip/archive/tags/Development/default.aspx">Development</category></item></channel></rss>