Visual Studio 2005 – mitgelieferte Icon-Sammlung

 Allerlei, Entwicklung, Software  Kommentare deaktiviert für Visual Studio 2005 – mitgelieferte Icon-Sammlung
Sep 212007
 

Ich lese zuhause gerade folgendes Buch.

Etwa in der Mitte, es geht um das Thema Windows Form, stiess ich auf
ein Hinweis der mich neugierig machte. 😀

Visual Studio 2005 liefert angeblich eine Icon-Sammlung mit.
Das musste ich mir natürlich mal ansehen.

Zu finden ist die Datei unter:
x:\programme\microsoft visual studio 8\common7\vs2005imagelibrary\
wobei x für das Laufwerk steht wo man Visual Studio 2005 installiert hat.

Die Datei VS2005ImageLibrary.zip muss nur noch entpackt werden.

Danach findet man Icons und Animationen, die in den Windows-Systemen
Verwendung finden. Echt Cool.

Zudem gibt es in jeder Kategorie noch eine HTML-Datei wo alle Icons
und Animationen des jeweiligen Ordner’s angezeigt werden.

Ich habe so einige interessante Icons gefunden.

es läuft: Nightwish – Once – Planet Hell
Aug 182006
 

Ich habe mir wieder mal zwei neue Fachbücher besorgt.
Kam in letzter Zeit nicht mehr ganz so oft vor.

Thema ist ASP.NET 2.0 und Winforms mit Visual C# 2005.
Grund: Meine Webseite läuft jetzt unter ASP.NET 2.0 und
das Coole Tool LiveWriter kann ich auch mit dem 2.0’er Framework
gebrauchen. Jetzt steht dem Umstieg nichts mehr im Weg.

Beim ASP.NET 2.0 Buch hätte ich aber wahrscheinlich zuerst
die einfachere Version nehmen sollen.

Gemäss der Einleitung hat Dino Esposito ein Buch über 1600 Seiten gemacht. Das ist nicht ganz so handlich wie man es sich vorstellt. Deshalb wurde es in zwei Teile aufgeteilt. Im ersten Teil geht es um Klassischen ASP.NET 2.0. In diesem Teil geht es vielfach um die Interna der 2’er Version. Deshalb vermute ich, dass das nicht ganz das Richtige für mich ist.

Allerdings finde ich den Teil 1 nicht. Wer den kennt soll es mir doch bitte mitteilen.

Zu dem Teil kann ich noch nichts sagen. Ich habe beim lesen mit dem ASP.NET 2.0 Buch begonnen. Aber über kurz oder lang wird auch dieses Buch gelesen. Dann mehr dazu.

DataGridTableStyle Problem doch noch gelöst

 Entwicklung  Kommentare deaktiviert für DataGridTableStyle Problem doch noch gelöst
Feb 202006
 

Daran habe ich jetzt lange gesucht.
Ich will einem DataGrid in einer WinForm App ein neues Aussehen verpassen.
Das kann man ja mit DataGridTableStyle machen.

public static DataGridTableStyle GetGridStyle()
{
     DataGridTableStyle tableStyle = 
new DataGridTableStyle();
     tableStyle.MappingName = “CATI_History“;

     DataGridTextBoxColumn id = new DataGridTextBoxColumn();
     id.HeaderText = “DB ID“;
     id.MappingName = “ID“;
     id.Width = 2;
     id.ReadOnly = 
false;
     tableStyle.GridColumnStyles.Add(id);

     DataGridTextBoxColumn studNr = new DataGridTextBoxColumn();
     studNr.HeaderText = “Studien Nr.“;
     studNr.MappingName = “StudienNummer“;
     studNr.Width = 100;
     studNr.ReadOnly = 
false;
     tableStyle.GridColumnStyles.Add(studNr);

     return tableStyle;
}

Das Ding muss man ja noch an das DataGrid binden.

if(dgCatiLzData.TableStyles.Count == 0)
{
     dgCatiLzData.TableStyles.Clear();
     dgCatiLzData.TableStyles.Add(Helper.GetGridStyle());
}

Leider brachte das kein Erfolg. Das Problem lag bei der Zeile

tableStyle.MappingName = “CATI_History“;

Ich habe hier die Tabelle der SQL DB angegeben. Gebunden an das DataGrid
habe ich aber eine Collection vom Typ Records. Gesucht wie blöd.
Die Lösung:

tableStyle.MappingName = “Records“;

Ich muss also die Klasse angeben und nicht die Tabelle aus der DB. Irgend wie logisch. 🙂

Identität bei einer Applikation wechseln

 Entwicklung  Kommentare deaktiviert für Identität bei einer Applikation wechseln
Okt 062005
 

Das kann man immer wieder gebrauchen. Man hat ein Programm, dass unter einem
anderen Benutzer als dem angemeldeten, ausgeführt werden soll.
Dazu habe ich bei MS einen Link gefunden der zeigt, wie man es macht, allerdings
in einer Konsolenanwendung.

 
Im Prinzip funktioniert das auch. Ich habe mir jetzt eine Klasse gemacht, die
mir das ganze einwenig einfacher zur Verfügung stellt.
Sie hat zwei öffentliche statische Methoden. Eine zum ändern der Identität, die
andere um zur alten zurück zu kehren.
Hier der Code.


/*
Original habe ich bei MS gefunden.
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfSystemSecurityPrincipalWindowsIdentityClassImpersonateTopic.asp
*/

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace Test
{
    /// <summary>
    /// Zusammenfassung für ChangeIdentity.
    /// </summary>
    publicclass ChangeIdentity
    {
        #region Variabeln

        /****************************************************************************/
        /***** Variablen                                                        *****/
        /****************************************************************************/
        privatestatic IntPtr tokenHandle =new IntPtr(0);
        privatestatic IntPtr dupeTokenHandle =new IntPtr(0);
        //Deklaration benötigter API-Funktionen und Konstanten
        privateconstint LOGON32_PROVIDER_DEFAULT = 0;
        privateconstint LOGON32_LOGON_INTERACTIVE = 2;
        privateconstint SecurityImpersonation = 2;

        [DllImport(„advapi32.dll“, SetLastError=true)]
        privatestaticexternbool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        [DllImport(„kernel32.dll“, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
        privatestaticexternunsafeint FormatMessage(int dwFlags, ref IntPtr lpSource, int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, IntPtr* Arguments);

        [DllImport(„kernel32.dll“, CharSet=CharSet.Auto)]
        privatestaticexternbool CloseHandle(IntPtr handle);

        [DllImport(„advapi32.dll“, CharSet=CharSet.Auto, SetLastError=true)]
        privatestaticexternbool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

        //Das wird benötigt um die Personifizierung wieder rückgängig zu machen.
        privatestatic WindowsImpersonationContext impersonatedUser =null;
        /****************************************************************************/
        /***** Ende Variablen                                                    *****/
        /****************************************************************************/

        #endregion

        #region Methoden

        /****************************************************************************/
        /***** Methoden                                                            *****/
        /****************************************************************************/

        /// <summary>
        /// Wechselt den Benutzer, unter dem das Programm ausgeführt werden soll.
        /// </summary>
        /// <param name=“Domain“>Name der Domäne</param>
        /// <param name=“UserName“>User Name, unter dem das Programm laufen soll</param>
        /// <param name=“Passwort“>Das passende Passwort</param>
        publicstaticvoid ImpersonateUser(string Domain, string UserName, string Passwort)
        {
            tokenHandle = IntPtr.Zero;
            dupeTokenHandle = IntPtr.Zero;
            
            //Mit dem gewünschten User anmelden.
            bool returnValue = LogonUser(UserName, Domain, Passwort, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
            
            //Bei einem Fehler, z.b. falschen Namen, falsches Passwort, soll eine Exception geworfen werden.
            if(false == returnValue)
            {
                int ret = Marshal.GetLastWin32Error();
                string fehler = GetErrorMessage(ret);
                string f =„Errorcode: „+ ret.ToString() + Environment.NewLine;
                f += fehler;
                thrownew Exception(f);
            }

            //Für was??? Weiss ich nicht so genau. :-)s
            bool retVal = DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle);
            
            if(false == retVal)
            {
                CloseHandle(tokenHandle);
                thrownew Exception(„Fehler beim Dublizieren des Token.“);
            }
            
            //Die Intentität wechseln.
            WindowsIdentity newId =new WindowsIdentity(dupeTokenHandle);
            impersonatedUser = newId.Impersonate();
            
            //Die Token wieder freigeben.
            if(tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);
            if(dupeTokenHandle != IntPtr.Zero)
                CloseHandle(dupeTokenHandle);
        }

        /*———————————————————————————————-*/
        /// <summary>
        /// Die Identität wieder zurücksetzen.
        /// </summary>
        publicstaticvoid UndoImpersonateUser()
        {
            if(impersonatedUser !=null)
            {
                impersonatedUser.Undo();
            }
        }
        /*———————————————————————————————-*/
        /// <summary>
        /// Gibt den letzten Win32Error zurück.
        /// Habe ich 1:1 aus dem Beispiel übernommen.
        /// </summary>
        privatestaticunsafestring GetErrorMessage(int errorCode)
        {
            int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
            int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
            int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;
            //int errorCode = 0x5; //ERROR_ACCESS_DENIED
            //throw new System.ComponentModel.Win32Exception(errorCode);
            int messageSize = 255;
            String lpMsgBuf =„“;
            int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
            IntPtr ptrlpSource = IntPtr.Zero;
            IntPtr prtArguments = IntPtr.Zero;
            int retVal = FormatMessage(dwFlags, ref ptrlpSource, errorCode, 0, ref lpMsgBuf, messageSize, &prtArguments);
            if(0 == retVal)
            {
                thrownew Exception(„Failed to format message for error code „+ errorCode +„. „);
            }
            return lpMsgBuf;
        }

        /****************************************************************************/
        /***** Ende Methoden                                                    *****/
        /****************************************************************************/

        #endregion
    }
}

Anwenden kann man sie wie folgt. Gemacht habe ich es bei einer WinForm Anwendung.



/// <summary>


/// Der Haupteinstiegspunkt für die Anwendung.

/// </summary>

[STAThread]
staticvoid Main()
{
    Application.ThreadException+=new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

    try
    {
        ChangeIdentity.ImpersonateUser(„DOMAIN“, „USERNAME“, „PASSWORT“);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message, „Fehler“, MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    Application.Run(new FrmMain());

    ChangeIdentity.UndoImpersonateUser();
}

 
Zu beachten ist, dass es, so viel ich mitbekommen habe, nur mit Windows XP und Windows Server 2003 so einfach funktioniert.
Unter Windows 2000 und NT4 muss der Benutzer, der das Programm ausführt, das Privileg SE_TCP_NAME besitzen.

Bei einer Textbox auf das Enter reagieren

 Entwicklung  Kommentare deaktiviert für Bei einer Textbox auf das Enter reagieren
Mai 042005
 
Das kann man auch immer wieder gebrauchen.
Man hat eine Textbox, wo man beim drücken der Entertaste
eine aktion auslösen möchte.
 
Für das nutzt man das KeyPress Event der Textbox


private
void tbPasswort_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(e.KeyChar == ‚\r‘)
    {
        e.Handled =true;
        //Weitere Logik, z.B: Methode für das Login aufrufen
    }
}

PropertyGrid in Windows Forms

 Entwicklung  Kommentare deaktiviert für PropertyGrid in Windows Forms
Jan 212005
 
Heute habe ich in einer WinForm Anwendung das PropertyGrid benutzt. Coole Sache. Viel geholfen hat mir der Beitrag auf Microsoft’s MSDN Seiten.
Hier ist sehr gut beschrieben was und wie man damit umgeht. Vor dem Artikel hatte ich keine Ahnung wie man damit umgeht.
Nach dem Artikel hate ich das PropertyGrid in meine Anwendung integriert.