Blog Home  Home Feed your aggregator (RSS 2.0)  
artiso Blog - Tipps und Tricks
Neues rund um's Thema .Net
 
 Friday, May 16, 2008

Für eine ASP.Net Anwendung möchte ich gerne die Versionen meiner Anwendung und aller referenzierten Assemblies ausgeben. Bei Winforms kann ich für die Anwendung mit Application.ProductVersion die Version meiner Anwendung abfragen, die ich in der AssemblyInfo.cs eingestellt habe. Das geht bei ASP.Net nicht. Hier die Lösung, wie man das im Web macht, gleich mit Sortierung:

Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();

if (assembly != null)
{
    lblProductVersion.Text = assembly.GetName().Name + " - " + assembly.GetName().Version.ToString();

    var referenceAssemblies = from a in assembly.GetReferencedAssemblies()
            orderby a.Name 
            select a;
    foreach (AssemblyName referenceAssemblyName in referenceAssemblies)
    {
        lblProductVersion.Text += "<br>" + referenceAssemblyName.Name + " - " + referenceAssemblyName.Version;
    }
}

 

Die Ausgabe sieht dann ungefähr so aus:

MyApplication - 1.0.3058.30144
AjaxControlToolkit - 1.0.10618.0
ArtisoAssertLib - 1.0.0.0
CommonComponents - 1.0.3056.28557
CommonContracts - 1.0.3056.28555
CrystalDecisions.CrystalReports.Engine - 11.5.3700.0
CrystalDecisions.ReportSource - 11.5.3700.0
CrystalDecisions.Shared - 11.5.3700.0
cTextBox - 1.0.3058.27781
DataContracts - 1.0.0.0
Infragistics35.WebUI.Misc.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.Shared.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.UltraWebChart.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.UltraWebGrid.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.UltraWebNavigator.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.UltraWebTab.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.UltraWebToolbar.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.WebDataInput.v8.1 - 8.1.20081.1000
Infragistics35.WebUI.WebDateChooser.v8.1 - 8.1.20081.1000
ListValuesComponents - 1.0.3057.30147
ListValuesContracts - 1.0.3057.30146
LoginManagerComponents - 1.0.3033.29632
LoginManagerContracts - 1.0.0.0
mscorlib - 2.0.0.0
NavigationComponents - 1.0.3058.27781
NavigationContracts - 1.0.3058.27780
PCMAreaComponents - 1.0.3058.27781
PCMAreaContracts - 1.0.3058.27779
ProductsAreaComponents - 1.0.3058.27779
ProjectsAreaComponents - 1.0.3058.27780
ProjectsAreaContracts - 1.0.3058.27778
ReportingComponents - 1.0.3058.27781
ReportingContracts - 1.0.3058.27780
SearchComponents - 1.0.3058.27779
SearchContracts - 1.0.3058.27779
System - 2.0.0.0
System.Configuration - 2.0.0.0
System.Core - 3.5.0.0
System.Data - 2.0.0.0
System.Data.DataSetExtensions - 3.5.0.0
System.Data.Linq - 3.5.0.0
System.Drawing - 2.0.0.0
System.Web - 2.0.0.0
System.Web.Extensions - 3.5.0.0
System.Web.Services - 2.0.0.0
System.Xml - 2.0.0.0
TaskListComponent - 1.0.3056.28564
TaskListContract - 1.0.3056.28560
TypesComponents - 1.0.3057.30147
TypesContracts - 1.0.3057.30147
UserManagementContracts - 1.0.0.0
Validators - 1.0.0.0
wwDataBinder - 1.0.2908.21817

Friday, May 16, 2008 4:50:11 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
 Sunday, May 11, 2008

Ich wollte aus Excel auf einen Webservice zugreifen. Also kurz gegoogelt (oder gelived ;-)), eigentlich gar nicht so schwer...

Aber wie so oft liegt der Teufel im Detail und es waren doch ein paar Kleinigkeiten zu beachten, deshalb hier nochmals der komplette Lösungsweg:

Zunächst habe ich einen WebService erstellt, zum Testen was ganz triviales, eigentlich das Webservice Template nur noch um den Parameter Name erweitert:

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    public Service () 
    {
    }

    [WebMethod]
    public string HelloWorld(string Name) {
        return "Hello World " + Name;
    }    
}

 

Die URL um auf den Webservice mit ausgefülltem Parameter zuzugreifen lautet http://localhost:49408/WebSite2/Service.asmx/HelloWorld?Name=Test, jedoch funktioniert das standardmäßig noch nicht. Wir müssen erst noch in der web.config folgenden Eintrag hinzufügen:

<webServices>
    <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
    </protocols>
</webServices>

Nun bekommen wir mit diesem Aufruf den XML-Response des Webservices direkt zurückgegeben. Nun wollen wir den Webservice aus VBA aufrufen.

Sub CallWebService()
    Dim MSXML As New MSXML2.DOMDocument
    Dim strAnfrage As String
    strAnfrage = "http://localhost:49408/WebSite2/Service.asmx/HelloWorld?Name=Test"
    With MSXML
        .async = False
        .preserveWhiteSpace = False
        .validateOnParse = True
        .resolveExternals = False
    End With

    If MSXML.Load(strAnfrage) = True Then
        Response = MSXML.DocumentElement.Text
    Else
        Response = "Fehler"
    End If
End Sub
 
Damit das funktioniert müssen wir noch die Bibliothek "Microsoft XML, vx.0" einfügen. Wir werten im Moment das XML-Dokument sehr einfach aus, da wir davon ausgehen, dass der Rückgabewert einfach als Textim XML-Dokument zurückgegeben wird. Damit können wir einfach mit MSXML.DocumentElement.Text den gewünschten Wert auslesen. Natürlich können auf diese Weise auch komplexer Rückgabewerte ausgewertet werden, aber das wollen wir hier nicht näher beleuchten.
Sunday, May 11, 2008 8:54:13 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2]    |   | 
 Thursday, May 08, 2008

Verwendet man ein DataSet mit DateTime-Werten in unterschiedlichen Zeitzonen, wird man zu seiner Überraschung feststellen, dass das DataSet eine Umrechnung der Zeiten vornimmt. Bei uns war das Problem konkret, dass ein DataSet per WCF zu einem Service übertragen wurde. Der Service war aber in einer anderen Zeitzone als der Client. In einem DateTime-Feld wurde ein Datumswert abgelegt, also z.B. 08.05.2008. Die automtische Umrechnung hat davon jedoch eine Stunde abgezogen, so dass am Service 07.05.2008 23:00 ankam. Damit war das Datum immer um einen Tag verschoben.

Das Problem kann aber behoben werden, indem man auf dem Client und auf dem Service den DateTime-Wert vor bzw. nach der Serialisierung konvertiert.

Auf dem Client sieht das dann z.B. so aus:

   1: foreach (DataSet1.DataTable1Row dr in ds.DataTable1.Rows)
   2: {
   3:     dr.Date = dr.Date.ToLocalTime();
   4: }

Und dann auf dem Service das Gegenstück:

   1: foreach (DataSet1.DataTable1Row dr in ds.DataTable1.Rows)
   2: {
   3:     dr.Date = dr.Date.ToUniversalTime();
   4: }

Damit kommt genau der Wert, der im Client eingetragen wurde auch im Service an. Zwar gibt es wohl auch eine Möglichkeit, die Datumskonvertierung zu unterdrücken, aber das hat bei mir nicht sauber funktioniert. Wenn also jemand eine elegantere Lösung kenn, nur her damit ;-)

Update:

Wir habe doch noch eine elegantere Lösung gefunden. Auf dem DataSet kann man auf der DateTime Column das Property DateTimeMode auf Unspecified umstellen. Dann wird die Zeitzonen-Konvertierung nicht durchgeführt. Danke an Luke für den Tipp.

image

Thursday, May 08, 2008 7:36:13 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Wednesday, April 30, 2008

Oft hat man einen bestimmten Ordner, auf den man of zugreifen muss. Hier ist mir nun ein Feature von Vista aufgefallen (gab es wohl auch schon in früheren Windows-Versionen, aber da habe ich das gar nicht bemerkt). Man kann Toolbars einrichten und diese einfach oben, rechts oder links am Desktop andocken. Mit der AutoHide-Funktion benötigen die Toolbars auch keinen unnötigen Platz. Ein nettes Feature, das ich bei meinen Vorträgen gut gebrauchen kann.

Das Video zeigt, wie's gemacht wird.

Wednesday, April 30, 2008 7:58:27 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Monday, April 21, 2008

Gerade hatte ich eine vermeintlich Fragestellung. ich wollte einfach nur wissen, wieviel Platz auf einem Laufwerk im Netzwerk noch frei ist. Das hat sich aber als problematischer herausgestellt als gedacht, da ich nur eine Freigabe auf dem Laufwerk hatte. Das ist wohl gar nicht so einfach, damit herauszufinden, wieviel Platz auf der entsprechenden Platte noch frei ist. Erst über die gute alte Command-Shell und den dir-Befehl hat das geklappt. Damit wird der freie Plattenplatz problemlos angezeigt.

Na ja, es scheint manchmal wirklich so, dass früher einiges besser war ;-)

image

Monday, April 21, 2008 8:45:50 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [2]    | 
 Thursday, April 17, 2008

Möchte man aus Anwendungen wie z.B. Word auf Dokumente auf einem SharePoint Portal zugreifen. kann man dies sowohl über einen UNC-Pfad (\\ServerName\sites\SiteName) oder über eine URL (http://ServerName/sites/SiteName) zugrifen. Nöch schöner wäre allerdings, wenn man eine direkte Verknüpfung hätte, die auch im Browse-Fenster der Anwendungen genutzt werden kann. Wie man eine solche Verknüpfung einrichtet, zeige ich im folgenden Video:

Thursday, April 17, 2008 9:48:02 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Sunday, April 13, 2008

Jens Häupel beschreibt in einem Blog-Eintrag, wie man per ClickOnce Setup DateiTypen mit seiner Anwendung verknüpfen kann. Klasse, dass das nun endlich funktioniert. Danke für den Artikel Jens.

File Extension per ClickOnce mit Anwendung assoziieren

Sunday, April 13, 2008 11:16:09 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Friday, April 04, 2008

Über das PropertyGrid-Control habe ich ja mehrmals gebloggt (z.B. hier). Dieses Control verwendie ich recht häufig um z.B. den Inhalt eigene Konfigurations-Klassen zu editieren. Zusammen mit der XML-Serialisierung lassen sich so sehr flexible Konfigurationsmöglichkeiten schaffen.

Nun hatte ich die Anforderung eine dynamische Datenstruktur an ein PropertyGrid zu binden. Da stand ich zunächst vor einem Problem. Bisher habe ich nur Objekte mit Properties unterschiedlicher Typen an das PropertyGrid gebunden. Nun habe ich eine Liste von Objekten, die die Elemente im PropertyGrid beschreiben. Wie aber diese an das PropertyGrid binden?

Das schöne ist, das das PropertyGrid sich hier als sehr flexibel erweist. Man muss folgende Schritte durchführen:

  1. Man brauch eine Klasse für ein einzelnes Property
  2. Dann brauchen wir eine Collection für diese Properties. Diese leiten wir von CollectionBase und ICustomTypeDescriptor ab und implementieren die Interfaces. Entscheidend ist hier die Methode GetProperties. Hier werden nun ine PropertyDescriptionCollection aus unseren Properties aufgebaut. Diese Methode ruft das PropertyGrid auf um sich dieProperties zu besorgen, die es rendern soll. Hier können wir nun also von einer belibigen Datenstruktur die benötigten
    Informationen für das PropertyGrid aufbauen.
  3. Dafür brauch wir jetzt noch einen cCustomPropertyDescriptor. Diesen leiten wir von PropertyDescriptor ab und implementieren es.
  4. Nun können wir unsere Properties aufbauen und an das PropertyGrid binden. Ich habe das CustomPropertyGrid als eigenes Control angelegt. Der Code ist nun sehr simpel:
   1: private void Form1_Load(object sender, EventArgs e)
   2: {
   3:     cPropertyCollection props = new cPropertyCollection();
   4:     props.Add(new cPropertyItem("BoolValue", "This is a boolean value", false, true, "Properties"));
   5:     props.Add(new cPropertyItem("StringValue", "This is a string value", false, "Test123", "Properties"));
   6:     props.Add(new cPropertyItem("Folder", "Path for folder", false, "", "Path"));
   7:  
   8:     this.artisoPropertyGrid1.SelectedObject = props;
   9: }


Damit erhält man folgendes Ergebnis. Man sieht die dynamisch angelegten Properties mit ihrem Name, in die Kategorien untergliedert und mit der Beschreibung. Das PropertyGrid wählt automatisch die gewohnten Controls abhängig vom Datentyp aus.

image

Dis ist schon ganz nett. Ich möchte aber für das Folder-Property einen entsprechenden Editor angeben können. Bei statischen Klassen vrwendet man einfach Attribute, aber bei dynamischen? Dazu wird die verfügbare Dokumentation sehr, sehr dünn. Hierzu haben wir auf der Property-Klasse eine Attribute-Arary. Diese Attribute können wir nun in der GetProperties-Klasse an den cCostomPropertyDescriptor übergeben. Der Aufbau der Properties sieht dann so aus:

   1: private void Form1_Load(object sender, EventArgs e)
   2: {
   3:     cPropertyCollection props = new cPropertyCollection();
   4:     props.Add(new cPropertyItem("BoolValue", "This is a boolean value", false, true, "Properties"));
   5:     props.Add(new cPropertyItem("StringValue", "This is a string value", false, "Test123", "Properties"));
   6:     props.Add(new cPropertyItem("Folder", "Path for folder", false, "", "Path",
   7:         new TypeConverterAttribute(),
   8:         new EditorAttribute(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))));
   9:  
  10:     this.artisoPropertyGrid1.SelectedObject = props;
  11: }

 

Nun kann man im Feld für den Wert für das Property "Folder" auf einen Button klicken und erhält einen Dialog zur Auswahl eines Verzeichnisses.

image

Friday, April 04, 2008 11:17:09 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
 Thursday, March 20, 2008

Weitgehend unbemerkt von der breiten Masse der Entwickler bringt das .net Framework 3.0 auch eine Bibliothek zum Erstellen von automatisierten UI-Tests mit. Unter %PROGRAMFILES%\Reference Assemblies\Microsoft\Framework\v3.0 finden sich folgen sich die benötigten DLLs. Damit kann man UI-Tests selbst programmieren und auch in Unit-Tests integrieren. Das entspricht zwar nicht der weit verbreiteten Erwartungshaltung, die eher von einer "Record & Play" Methode ausgehen, bietet aber verschiedene Vorteile in Bezug auf Wartbarkeit und Stabilität.

Ich habe hier mal ein kleines Beispiel gebaut, das den Einsatz demonstriert:

Ich werde in Kürze weitere Details bloggen und verschiedene Einsatzgebiete, Erweiterungen und auch Grenzen aufzeigen. Auch ein Webcast ist zu dem Thema geplant. Bis dahin erst mal ein paar weiterführende Dokumente. Leider ist da im Moment noch nicht sehr viel publiziert worden.

http://msdn2.microsoft.com/en-us/magazine/cc163288.aspx
http://msdn2.microsoft.com/en-us/accessibility/bb892133.aspx

Das Tool ist auf jeden Fall interessant und da es kostenlos mit dem .net Framework mitkommt, sollte jeder der sich mit Software-Tests beschäftigt mal einen Blick drauf werfen.

Thursday, March 20, 2008 12:45:12 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |  |   | 
 Thursday, February 14, 2008

Habe gerade einen guten Tipp gefunden. Über eine entsprechende Optionseinstellung kann man im Management-Studio beim Copy & Paste die Spaltenüberschriften der Results mit kopieren.

HP's Blog - Microsoft SQL Server Management Studio - Spaltenüberschriften fehlen beim kopieren der Abfrageergebnisse

Thursday, February 14, 2008 11:17:21 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 

Ich war am 13.02 und 14.02 auf der VSOne und habe dort insgesamt 4 Sessions gehalten. Für mich war es eine tolle Veranstaltung, die Resonanz auf meine Vorträge war sehr positiv und ich konnte viele interessante Diskussionen mit Teilnehmern und Sprecherkollegen führen.

P1000618

Hier nun meine Slides und den Code zum Download:

Session Requirement Management mit Team Foundation Server
Bei dieser Session habe ich vorgestellt, wie wir bei uns im Hause mit Hilfe des Team Foundation Servers Requirements verwalten. Hierbei kommt auch der artiso Workitem-Manager zum Einsatz um Workitems hierarchisch zu strukturieren.

Spezifikationsdokumente Verwalten
Spezifikationsdokumente werden oft als monolithische Worddokumente verwaltet Daraus ergeben sich eine Reihe von Problemen, die wir mit unserem Ansatz lösen, die Spezifikation in kleine Dokumente aufzuteilen und so jede einzelne Funktion zu Spezifizieren. Hierzu nutzen wir ein Word-AddIn das Bestandteil des artiso Workitem-Managers ist.

Mit 3 Schichten zum Erfolg
Das war der Titel meiner Architektur-Session. Hier habe ich zunächst den Aufbau und die Vorteile einer 3-Schicht-Architektur beschrieben. Anschließend erläuterte ich Komponentenorientierung. An einem kleinen Demo-Projekt zeigte ich die Planung und den Aufbau eines Projektes vom Architekturdesign bis zur Implementierung und demonstrierte dabei einige Best Practices aus unseren Projekten. Am Ende beschrieb ich noch die Auswirkungen für verteilte Systeme. Interessant für mich war, dass der Meister der Komponentenorientierung Ralf Westphal der Session beiwohnte uund den Vortrag mit interessanten Fragen bereicherte.

                   

XML-Serialisierung zur Persistierung von Objekten
XML-Serialisierung ist eine Technologie, mit der Objekte schnell und einfach in ein XML-Format überführt und auch wieder zurück konvertiert werden kann. Dies Technik ist nicht neu und viele Entwickler kennen und nutzen sie. Ich habe in der Session verschiedene Möglichkeiten aufgezeigt, wie sich XML-Serialisierung nutzen lässt, von der Persistierung von kompletten Datenobjekten über Konfigurationsdateien bis hin zur Optimierung der Speicherung von Listenobjekten in der Datenbank.

              

Nächste Woche bin ich dann auf dem Launch Event als ATE. Das wird sicher interessant bei diesem Mega-Event (6.500 Teilnehmer!).

Thursday, February 14, 2008 9:46:01 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
 Monday, January 07, 2008

Unter Access 2003 gabe es Access-Datenbankprojekte (*.adp) mit denen man wunderbar auf bestehende SQL-Datenbanken zugreifen konnten. Sind diese mit Access 2007 verloren gegangen? Das nicht, aber sie sind jetzt gut versteckt. Um ein Datenbankprojekt mit Access 2007 anzulegen geht man wie folgt vor:

  1. Access ganz normal starten
  2. Access fragt nun nach einer Vorlage für eine neue Datei. Hier das Icon "Blank Database" auswählen.
  3. Im rechten Bereich kann man nun den Dateiname angeben. Hier den File-Dialog öffnen.
  4. In diesem Dialog kann man nun als Dateityp "Microsoft Office Access Projects" auswählen.

     image
  5. Wenn mann dann auf den "Create"-Button klickt kann man noch auswählen, ob man sich zu einer bestehenden Datenbank verbinden möchte oder eine neue anlegen will. Der Rest dürfte dann wieder vertraut erscheinen.
Monday, January 07, 2008 6:16:04 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Sunday, December 30, 2007

Schick ist es, wenn man in der Anwendung demBenutzer die verfügbaren SQL-Server als Auswahl anzeigt. Die kann man mit folgendem Code bewerkstelligen:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace SQLInstances
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable dataTable = System.Data.Sql.SqlDataSourceEnumerator.Instance.GetDataSources();

            foreach (DataRow datarow in dataTable.Rows)
            {
                string datasource = datarow["ServerName"].ToString();
                if (datarow["InstanceName"] != DBNull.Value)
                {
                    datasource += String.Format("\\{0}", datarow["InstanceName"]);

                    ComboBox1.Items.Add(datasource);
                }

                DataGridView1.DataSource = dataTable;
            }
        }
    }
}

 

Das Beispiel gibt die verfügbaren SQL-Server in einem GridVie aus.

Um auch Zuisatzinformationen wie Version etc. zu erhalten, muss auf dem SQL-Server der SQL-Browser laufen:

clip_image001

Sunday, December 30, 2007 9:20:27 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
 Tuesday, December 04, 2007

Durch Zufall habe ich gerade herausgefunden, dass man im IE auch mehrere Startseiten eintragen kann. Einfach in der Liste mehrere zeilen mit den verschiedenen URLs eingeben. Die werden dann beim Start alle geöffnet.

image

image

Tuesday, December 04, 2007 10:35:10 AM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
 Wednesday, November 21, 2007

Das Problem:

Ich habe in C# ein Objekt vom Typ System.Drawing.Color. Dieses möchte ich in einen String-Konvertieren, den ich im HTML verwenden kann. Das funktioniert gut bei benannten Farben wie z.B. "red". Dort kann man Color.Name verwenden. Aber bei nicht benannten Farben liefert dies einen ARGB-Wert mit dem HTML nichts anfangen kann. Dehalb habe ich diese kleine Mthode geschrieben:

private string GetColorString(Color color)
{
    if (color.ToKnownColor() != 0)
        return color.Name;
    else
        return "#" + color.Name.Substring(2);
}

 

Wenn jemand eine einfachere Lösung weiss, einfach her damit!

Update:

Jürgen hat noch eine viel einfacher Lösung (siehe Kommentar) mit
string htmlcolor = ColorTranslator.ToHtml(Color.Bisque)
Kannte ich bisher noch nicht, aber man lernt ja nie aus!

Wednesday, November 21, 2007 12:31:43 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1]    | 
 Tuesday, November 13, 2007

Damit Ich habe ein Web User Control bei dem ich eine TextBox als Property nach außen geben möchte, damit man die Eigenschaften der Textbox editieren kann. Das kann man durch ein paar Attribute erreichen.

[Browsable(true),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
RefreshProperties(RefreshProperties.Repaint)]
public TextBox DropDownTextbox
{
    get
    {
        return this.TextBox1;
    }
    set
    {
        this.TextBox1 = value;                
    }
}
 
Damit werden auf dem UserControls zusätzliche Properties angelegt und zwar alle Properties einer Textbox mit dem Prefix "DropDownTexbox" also dem Namen des Properties auf dem Control.
 
image
 
Im Markup werden die Properties ganz normal als Attribute eingefügt. Was mich allerdings etwas gewundert hat war, dass ich im Markup über Intellisense die Textbox allerdings auch als separates Tag angeben kann und darauf meine Attribute definiere. Allerding wird das denn im Designer nicht mehr sauber gerendert.

 

<uc1:WebUserControl1 ID="WebUserControl11" runat="server" DropDownTextBox-BackColor="#FFCC00">
    <DropDownTextbox BackColor="red"></DropDownTextbox>
</uc1:WebUserControl1>

Tuesday, November 13, 2007 5:53:32 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    |   | 
 Wednesday, November 07, 2007

Ich hatte gerade ein Aha-Erlebnis der etwas anderen Art. Im Infragistics-Chart gibt es eine Zoom-Funktion für die Achsen. Bei einem Composite-Chart scheint das aber nicht zu funktionieren. Ich habe folgendes im Code stehen:

ChartObj.CompositeChart.ChartAreas[0].Axes[0].

Aber mein Intellisense zeigt kein passendes Property an. Im Forum steht auch die Aussage von einem Infragistics-Mitarbeiter, dass das nicht geht. Wenn ich dann "blind" das vervollständige zu

ChartObj.CompositeChart.ChartAreas[0].Axes[0].ScrollScale.Visible = true;


funktioniert der Code wunderbar! Mal abgesehen davon, dass ich gar nicht wüsste, wie man Properties im Intellisense versteckt aber dennoch verfügbar macht, warum um alles in der Welt haben die Jungs dieses Property nicht öffentlich zugänglich gemacht?

Wednesday, November 07, 2007 7:51:22 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1]    | 
 Thursday, October 25, 2007

Wenn man eine Datei löscht, die in der Quellcode-Verwaltung eingecheckt war, kann man diese leicht aus der Quellcode-Verwaltung wiederherstellen. Dazu muss man aber zuerst eine kleine Einstellung vornehmen. Unter Tools / Options / Source Control / Visual Studio Team Foundation Server kann man die Option "Show deleted items in the Source Control Explorer" aktivieren.

image

Dann werden im Source Control Explorer gelöschte Elemente angezeugt, die man einfach "undeleten" kann.

image

Thursday, October 25, 2007 5:09:17 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [1]    |   |