iSven

Unwichtiges nach Relevanz sortieren...

.NET Assemblys in Excel verwenden

.NET Assemblies in VBA, sprich Excel oder Access zu verwenden hat einen gewissen Charme. Komplexe Businesslogik lässt sich dann an einer Stelle pflegen und verwenden.

Unter http://dsmyth.blogspot.com/2006/03/calling-managed-code-from-vba-using.html gibt es gute Hintergrundinfos, wie ein 'Hello World' zustande kommt. Allerdings bin ich dabei auf Probleme gestossen. Denn wenn man mit Visual Studio 2005 unter .NET 2.0 entwickelt und versucht das mit Excel XP aka Excel 2002 aka Excel 10.0 zum Laufen zu bekommen, erscheint lediglich ein Automatisierungsfehler beim Aufruf der Assembly unter Excel. Dieser Fehler rührt daher, dass Excel 10.0 als Standard die .NET 1.1 Runtime verwendet. Abhilfe ist eine Excel.EXE.config Datei im Installationsverzeichnis von Excel mit folgendem Inhalt:
<!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: Consolas, "Courier New", Courier, Monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">configuration</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">startup</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">supportedRuntime</span> <span class="attr">version</span><span class="kwrd">="v2.0.50727"</span> <span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">startup</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">configuration</span><span class="kwrd">&gt;</span>
</pre>


Allerdings hat man dann Excel 10.0 komplett auf .NET 2.0 umgestellt. Das kann also noch andere Auswirkungen nach sich ziehen.

Was weiterhin im oben erwähnten Artikel nicht erwähnt wurde, ist das setzen von [assembly: ComVisible(true)]in der AssemblyInfo.cs.

 

Page Events feuern nicht

Wieder mal ein Fehler der Kategorie: Aua!

Auf einer ASP.NET Seite sitzt ein Button und nach der Umstellung der Anwendung von .NET 1.1 auf .NET 2.0 feuern die Events der Seite nicht mehr... nach ziemlich langem herumprobieren stellte sich die folgende Zeile im Header als Übeltäter heraus:<!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: Consolas, "Courier New", Courier, Monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">language</span><span class="kwrd">="javascript"</span> <span class="attr">src</span><span class="kwrd">="JavaScript/General.js"</span>
<span class="attr">type</span><span class="kwrd">="text/javascript"</span><span class="kwrd">/&gt;</span></pre>Nach Umstellen auf <!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: Consolas, "Courier New", Courier, Monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}

.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">language</span><span class="kwrd">="javascript"</span> <span class="attr">src</span><span class="kwrd">="JavaScript/General.js"</span>
<span class="attr">type</span><span class="kwrd">="text/javascript"</span><span class="kwrd">&gt;&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span>
</pre>
feuerten auch wieder die Events!

Ich bin eigentlich ein Freund der kurzen Schreibweise der Tags, doch hier scheint mehr mal wieder mehr zu sein...

 

Kommunikation mit UserControls über eine MasterPage in ASP.NET

Die in ASP.NET 2.0 eingeführte MasterPage erfreut sich zunehmender Beliebtheit. Denn mittels dieser lassen sich Elemente, die auf allen Seiten einer Anwendung gleich sein sollen, einmalig erstellen und verwenden. Damit ist die MasterPage ein Pflichtelement für jede ASP.NET Webanwendung.
Nun stellt sich aber die Frage, wie Controls, die in der MasterPage liegen mit anderen Controls bzw. UserControls auf der jeweiligen Seite (bzw. im ContentPlaceHolder) kommunizieren sollen? Die MasterPage weiss ja noch gar nicht, welche Controls in der Seite enthalten sind. Eine mögliche Lösung möchte ich hier skizzieren:
Bei diesem Beispiel enthält die MasterPage einen Button und eine TextBox. Sobald auf den Button geklickt wird, soll der Text an die UserControls geschickt werden, die sich für diesen Text interessieren. Das Interesse an einem Text lässt sich recht gut über ein Interface definieren:

public interface ITextConsumer
{
    void HandleTextEvent(object sender, TextEventArgs e);
}


Die Nutzinformation, also der Text wird mittels eines Event Arguments übermittelt:

public class TextEventArgs : EventArgs
{
    private string text;

    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}


Die UserControls, die sich nun für den Text interessieren müssen einfach das Interface ITextCosumer implementieren:

public partial class WebControls_DataControl : System.Web.UI.UserControl, ITextConsumer
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    #region ITextConsumer Member
    public void HandleTextEvent(object sender, TextEventArgs e)
    {
        ' Process the Text. E.g. search in the database etc.
    }
    #endregion
}


In der MasterPage muss nun im Click Ereignis des Buttons die Controls Collections des ContentPlaceHolders durchlaufen werden. Dabei wird jedes Controls auf das Interface ITextCosnumer gecastet. Klappt der Cast, wird der Text über die im Interface definierten Methode übermittelt.

protected void Button1_Click(object sender, EventArgs e)
{
    TextEventArgs text = new TextEventArgs();
    text.Text = this.TextBox1.Text;
       
    foreach (Control cntl in this.ContentPlaceHolder1.Controls)
    {
        ITextConsumer eventConsumer = cntl as ITextConsumer;
        if (eventConsumer != null)
        {
            eventConsumer.HandleTextEvent(this.Page, text);
        }
    }
}


Das war's! Diese Lösung funktionert recht gut mit direkt in den Seiten implementierten UserControls. Enthalten die UserControls selbst noch weitere Controls, die sich für den Text interessieren, muss diese Information evtl. weitergereicht werden (hier auch wieder die Controls Collection durchlaufen).


Setzen von Properties in Subversion

Subversion erlaubt für jede Datei und jedes Verzeichnis im Repository das Setzen von Metadaten bzw. Properties. Über diese Properties werden zum Beispiel der Mime-Type, Ersetzungszeichenfolgen (svn:keywords) oder Ingnore-Patterns definiert.
Damit man nicht immer alle Properties per Hand setzen muß, kann dies automatisch beim Hinzufügen von Dateien zum Repository geschehen. Dazu muß in der lokalen Config-Datei des Subversion-Clients folgende Zeile in der Section [miscellany] auskommentiert werden:

enable-auto-props = yes

Anschliessend lassen sich für beliebige Dateitypen die Auto-Properties in der Section [auto-props] definieren. Beispiel:

*.txt = svn:eol-style=native
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
*.cs = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.aspx = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.ascx = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.sql = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.css = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.skin = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.js = svn:keywords=HeadURL LastChangedBy LastChangedRevision LastChangedDate
*.doc = svn:needs-lock=*

Dies gilt allerdings nur für Dateien, die sich noch nicht im Repository befinden! Bei schon im Repository vorhandenen Datei muß dies explizit eingestellt werden (über den Eigenschaftendialog):

Howto debug Javascript in Visual Studio

In Zeiten, in denen immer mehr Javascript in ASP.NET Webanwendungen Einzug hält, ist das Debuggen von Javascript unumgänglich. Mit folgenden Handgriffen wird das Debuggen in Visual Studio ermöglicht:

1. JavaScript Debugging im Internet Explorer einschalten (durch deaktivieren der Skriptdebuggingeinträge):


2. Im Javascript Code die Zeile

debugger;

hinzufügen. Das Debugging wird dann genau an dieser Stelle bei in Visual Studio gestarteten Anwendungen aktiviert.

 

Lokalisierung in ASP.NET 2.0

Die Lokalisierungsmöglichkeiten von ASP.NET 2.0 sind schon recht cool, aber immer wieder muss ich nach der genauen Schreibweise zur Verwendung von Resourcedateien in aspx oder ascx Seiten bei Goolge forschen. Daher

<%$ Resources:Resource,TextInResourceDatei %>

Hierbei wird die Resource TextInResourceDatei aus dem Resourcefile Resource.resx verwendet.