Laden...

Forenbeiträge von C#Gustl Ingesamt 36 Beiträge

25.06.2021 - 10:43 Uhr

Hallo zusammen,

ich habe mir eine DesktopApp in C#/xaml erstellt. Dort habe ich nugets hinzugefügt.

Beim Build ist der debug/release Ordner jetzt ziemlich voll mit den Framework Dateien.

Gibt es eine Möglichkeit diese in ein Unterverzeichnis erstellen zu lassen?

Wenn ja, wie? Habt ihr hierfür Links oder suchbegriffe die mir weiter helfen? Habe schon gesucht, aber kam nicht so recht weiter 🙁

Vielen Dank im Voraus.

Grüße
Jörg

12.12.2018 - 08:22 Uhr

Hallo zusammen,

über Lazy rufe ich eine Liste ab. Da die Liste eventuell Abhängigkeiten unter den einzelnen Items hat muss ich das nachdem sie geladen sind noch einmal durchgehen.

Also muss ich nachdem über Lazy der Werte zugewiesen wurde eine Methode ausführen. Aber eben nur wenn sie das erste Mal zugewiesen wurde.

Ich dachte hier an IsValueCreated.
Aber wie warte ich auf IsValueCreated == true ? Gibt es da ein Event welches ausgelöst wird?
Oder wie würdet ihr das umsetzen?

Vielen Dank schonmal für die Hilfe.

Gruß

28.09.2017 - 09:49 Uhr

Hallo,

ja, warum eigentlich. Weil wenn der Benutzer am Anfang nur das Minus eingibt er das dann nicht zulässt. Ist ja klar.

Ich habe es nun so gelöst:

private void NumberMinusValidationTextBox(object sender, TextCompositionEventArgs e)
        {   
            if((sender as TextBox).Text.Equals("") && e.Text.Equals("-"))
            {
                e.Handled = false;
                return;
            }
            decimal result;
            e.Handled = !decimal.TryParse((sender as TextBox).Text + e.Text, out result);
        }

Danke.

Gruß

28.09.2017 - 08:45 Uhr

Hallo,

ich möchte das in einer Textbox nur die Eingabe von Decimal erlaubt ist.
Folgende sollen erlaubt sein:
-12,2
-12.2
12
32.5
23,4

Nicht erlaubt sollen nicht Nummern, außer Minus am Anfang und einem Punkt oder Komma zwischen den Zahlen.

Folgendes erlaubt das Minuszeichen, Komma oder Punkt irgendwo im Text und auch mehrmals.
Zudem werden auch Leerzeichen erlaubt.


private void NumberMinusValidationTextBox(object sender, TextCompositionEventArgs e)
        {
            Regex regex = new Regex(@"[^-0-9,\.]+");
            e.Handled = regex.IsMatch(e.Text);
        }

Hat da wer ein Snippet was auf meinen Anforderungen passt?

Danke im Voraus.

Gruß

31.05.2017 - 14:43 Uhr

Hallo,

ich habe ein ViewModel, aber ich verstehe nicht wie ich das Image von der Auswahl in der ListBox in ein public Property im ViewModel bekommen kann. Nehmen wir mal an Object1 ist im ViewModel.

xaml von Window1:

<ListBox x:Name="lb1" ItemsSource="{Binding Object1}"/>

<Image Name="img_Vorschau" Source="{Binding ElementName=lb1,Path=SelectedItem.Img}"/>

Wie bekomme ich nun das angezeigte Image in eine Variable, welche sich beim Ändern auch aktualisiert?

Wenn ich im ViewModel ein Property ImageSource erstelle und diesem dann img_Vorschau.Source zuweise, wird set nur bei der Zuweisung aufgerufen, aber nicht wenn sich das Binding ändert...

31.05.2017 - 13:13 Uhr

Hallo,

ich habe an einem Fenster Object1 gebunden, in diesem Object1 gibt es eine Liste welche ich an einer Listbox lb1 binde. Die Liste besteht aus einer Klasse mit Property Text und einem Bild.

Dieses Bild soll ich Abhängigkeit der Auswahl in einem neuen Fenster Windwo2 gebunden werden.
Genau das bekomme ich nicht hin:

in Class Window1:


private Windwo2 w2;
w2 = new w2(this);
w2.Show();

Class Window2:


public partial class Window2 : Window
    {
        private Window1 WindowsOwner;
        public Window2(Window1 WindowsOwner)
        {
            InitializeComponent();
            this.Window1 = WindowsOwner;
            
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = Window1;
        }
    }

xaml Window2:


<Image Name="img_VorschauFenster" Source="{Binding ElementName=lb1,Path=SelectedItem.Img}"/>

Mit meinen Verständnis übergebe ich ihn die Referenz von Window1 und sage ihn das dies der datacontext sein soll. In Window1 gibt es die ListBox lb1, und vonm ausgewähltem Element soll der das Img anzeigen. Aber da tut sich leider nichts. 😦

Danke schon mal.

Gruß,
Gustl

28.04.2017 - 10:29 Uhr

Das würde gehen, wäre aber unschön, da es auch noch zwei andere Reiter gibt wo ich die Liste eben nicht brauche...

Wenn das so nicht geht dann muss ich bei einem TabWechsel die Selektion gleich halten.
Ist halt auch unschön da ich den Code von der Liste 3x drin habe.

28.04.2017 - 10:17 Uhr

Hallo zusammen,

ich möchte in 3 TabItems ein und die selbe ListBox zur Auswahl haben, ItemsSource kann ich ja an eine Liste binden, aber ich muss immer einen anderen Namen vergeben.


<TabControl>
   <TabItem>
       <TabItem.Header>
               ...
       </TabItem.Header>
        <ListBox x:Name="lst_A" ItemsSource="{Binding Layouts}" />
   </TabItem>
   <TabItem>
       <TabItem.Header>
               ...
       </TabItem.Header>
        <ListBox x:Name="lst_B" ItemsSource="{Binding Layouts}" />
   </TabItem>
   <TabItem>
       <TabItem.Header>
               ...
       </TabItem.Header>
        <ListBox x:Name="lst_C" ItemsSource="{Binding Layouts}" />
   </TabItem>
</TabControl>

Wie bekomme ich es hin das es eine Liste wäre die unter jedem TabItem sichtbar ist?
(Damit der Name der Listbox gleich bleiben kann)

Geht das?

Danke schon mal.

Gruß,
Gustl

09.03.2017 - 12:31 Uhr

Alles klar, vielen Dank.

Gruß,
Jörg

09.03.2017 - 10:37 Uhr

Vielen Dank, genau das hat gefehlt.

Jetzt frag ich mich warum ich hier noch den TargetType angeben muss obwohl ich den Style direkt in einer GroupBox definiere.

Gibt es denn einen Anwendungsfall wo der TargetType anders sein soll als in dem Type wo man den Style definiert?

Gruß

09.03.2017 - 10:04 Uhr

Hallo,

ich habe in Window.Resources einen Style für GroupBox definiert.
Nun möchte ich im Window einer bestimmten GroupBox einen DataTrigger hinzufügen, also muss ich noch einen Style in der GroupBox definieren. Somit greift aber der Style in Window.Resources nicht mehr.

In Zeile 13 probiere ich mit BasedOn von dem Style in Window.Resources zu erben, klappt aber nicht.

<Window.Resources>
  <Style x:Key="GroupBoxWindow" TargetType="GroupBox" BasedOn="{StaticResource GroupBoxBase}">
    <Setter Property="BorderThickness" Value="0"/>
    <Style.Triggers>
      <Trigger Property="Control.IsEnabled" Value="False">
        <Setter Property="Control.Foreground" Value ="#FF6D6D6D" />
      </Trigger>
    </Style.Triggers>
  </Style>
</Window.Resources>
<GroupBox>
  <GroupBox.Style>
    <Style BasedOn="{StaticResource GroupBoxWindow}">
      <Style.Triggers>
        <DataTrigger Binding ="{Binding ElementName=lst_Clients, Path=SelectedIndex}" Value="-1">
          <Setter Property="GroupBox.IsEnabled" Value="false"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </GroupBox.Style>
</GroupBox>

Was mache ich hier falsch? Kann wer helfen?

24.01.2017 - 16:49 Uhr

Hallo,

ich möchte in der Druckerauswahl ComboBox die Drucker mit einem Icon vorne weg unterscheiden.

Habe folgenden XAML-Code:


<ComboBox ItemsSource="{Binding PrinterList}" Name="cbo_Drucker" Grid.Column="1" IsEditable="False" Margin="4">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="IsEnabled" Value="{Binding IsSelectable}"/>
        </Style>
    </ComboBox.ItemContainerStyle>
    <ComboBox.ItemTemplate>
        
        <DataTemplate>
            <StackPanel Margin="0" Orientation="Horizontal">
                <Image VerticalAlignment="Top" MaxWidth="16" MaxHeight="16" Margin="0,0,4,0" Name="ImgPrinter" Source="{StaticResource computer_16}"/>
                <TextBlock Text="{Binding PrinterName}" Name="TextPrinter"/>
            </StackPanel>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IrisPrinter}" Value="True">
                    <Setter TargetName="ImgPrinter" Property="Source" Value="Images/iris_16.png"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsSelectable}" Value="False">
                    <Setter TargetName="TextPrinter" Property="Foreground" Value="#c9c9c9"/>
                    <Setter TargetName="ImgPrinter" Property="Opacity" Value="0.3"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Es funktioniert auch, aber bei der DropDown ist der Abstand zwischen den Items zu gering. Also hatte ich bei den StackPanel Margin="4" drin. Dann aber vergrößert sich nach der Auswahl die Anzeige was ausgewählt wurde. Das möchte ich aber nicht.

Meine Frage: Wie kann ich den margin NUR für die DropDownAuswahl bestimmen? Bei der Anzeige was gewählt wurde soll Margin wieder 0 sein.

Hoffe es ist klar was gemeint ist.

Danke.

Gruß,
Gustl

24.11.2016 - 15:55 Uhr

Vielen dank für die Antworten.

So werde ich es tun, werde mich mit dem Buch auseinandersetzen und parallel, damit ich das gelesene besser verinnerliche, kleine Projekte programmieren.

Danke.

Gruß,
Gustl

24.11.2016 - 00:51 Uhr

Hallo,

Jetzt muss und will ich mich näher mit c# befassen und nicht nur an der Oberfläche kratzen.
Ich möchte mit einem Buch beginnen, das Visual C# 2010 habe ich mal geschenkt bekommen. Damals leider nur angerissen... jetzt frage ich mich ob ich die 50€ für ein neues Buch 2016 von Matthias geirhos investieren sollte, oder gibt es im Vergleich von 2010 nicht sooo viel Neues? Lamda etc. ist auch im 2010 erklärt.

Würde mich auf eine Antwort freuen.

Hier der Vergleich.
Neu: https://www.amazon.de/Professionell-entwickeln-Visual-Studio-2015/dp/3836239299/ref=lp_166028031_1_6?s=books&ie=UTF8&qid=1479944409&sr=1-6

Alt: https://www.amazon.de/Professionell-entwickeln-mit-Visual-2010/dp/3836214741/ref=sr_1_4?s=books&ie=UTF8&qid=1479944946&sr=1-4&keywords=C%23+2010

Gruß Gustl

02.11.2016 - 08:19 Uhr

Guten Morgen,

ich möchte einen Druck zu einem lokalen Drucker anstoßen, und zwar mit einem Byte Array.

Leider bekomme ich das nicht hin. Folgenden Code verwende ich:


private void bt_show_printer_Click(object sender, RoutedEventArgs e)
{
            choosePrinter = @"PDF-XChange Printer 2012";
            Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
            Nullable<bool> result = ofd.ShowDialog(this);
            if (result == true)
            {
                RawPrintHelper.SendFileToPrinter(choosePrinter, ofd.FileName);
            }
}

public class RawPrintHelper
    {
        // Structure and API declarions:
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDataType;
        }
        [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

        [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool ClosePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

        [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool EndDocPrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool StartPagePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool EndPagePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

        // SendBytesToPrinter()
        // When the function is given a printer name and an unmanaged array
        // of bytes, the function sends those bytes to the print queue.
        // Returns true on success, false on failure.

        public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
        {
            Int32 dwError = 0, dwWritten = 0;
            IntPtr hPrinter = new IntPtr(0);
            DOCINFOA di = new DOCINFOA();
            bool bSuccess = false; // Assume failure unless you specifically succeed.

            di.pDocName = "My C#.NET RAW Document";
            di.pDataType = "RAW";

            // Open the printer.
            if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
            {
                // Start a document.
                if (StartDocPrinter(hPrinter, 1, di))
                {
                    // Start a page.
                    if (StartPagePrinter(hPrinter))
                    {
                        // Write your bytes.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            // If you did not succeed, GetLastError may give more information
            // about why not.
            if (bSuccess == false)
            {
                dwError = Marshal.GetLastWin32Error();
            }
            return bSuccess;
        }

        public static bool SendFileToPrinter(string szPrinterName, string szFileName)
        {
            // Open the file.
            FileStream fs = new FileStream(szFileName, FileMode.Open);
            // Create a BinaryReader on the file.
            BinaryReader br = new BinaryReader(fs);
            // Dim an array of bytes big enough to hold the file's contents.
            Byte[] bytes = new Byte[fs.Length];
            bool bSuccess = false;
            // Your unmanaged pointer.
            IntPtr pUnmanagedBytes = new IntPtr(0);
            int nLength;

            nLength = Convert.ToInt32(fs.Length);
            // Read the contents of the file into the array.
            bytes = br.ReadBytes(nLength);
            // Allocate some unmanaged memory for those bytes.
            pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
            // Copy the managed byte array into the unmanaged array.
            Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
            // Send the unmanaged bytes to the printer.
            bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
            // Free the unmanaged memory that you allocated earlier.
            Marshal.FreeCoTaskMem(pUnmanagedBytes);
            return bSuccess;
        }

        public static bool SendStringToPrinter(string szPrinterName, string szString)
        {
            IntPtr pBytes;
            Int32 dwCount;
            // How many characters are in the string?
            dwCount = szString.Length;
            // Assume that the printer is expecting ANSI text, and then convert
            // the string to ANSI text.
            pBytes = Marshal.StringToCoTaskMemAnsi(szString);
            // Send the converted ANSI string to the printer.
            SendBytesToPrinter(szPrinterName, pBytes, dwCount);
            Marshal.FreeCoTaskMem(pBytes);
            return true;
        }
    }

Resultat z.B.: bei dem PDF Printer, in dem Fenster vom Drucker (Druckaufträge anzeigen) kommt der Druckauftrag "My C#.NET RAW Document" kurz, aber es kommt kein Dialog wo ich die PDF speichern möchte. Wenn ich nun einen anderen StandardDrucker anspreche, verarbeitet er den Druckauftrag, nur kommen , bei einer BildDatei PNG, ich glaube mehr als 50 Blätter raus... (Bis ich herausgefunden habe wie ich den Druckauftrag bei dem Drucker abbrechen kann 😃 ).

Habe es auch mit SendStringToPrinter oder einem Textfile probiert, aber es will leider nicht funktionieren...

Auch WinForm habe ich getestet, Quelle: https://support.microsoft.com/de-de/kb/322091

Das gleiche Ergebnis 😦

Wenn ich mich im Web umschaue funktioniert es wohl bei allen die die Klasse RawPrintHelper verwenden nur bei mir nicht.

Kann mir wer einen Schubs in die richtige Richtung geben, wäre super!

Gruß,
Gustl

28.01.2014 - 18:59 Uhr

Hallo,

das Programm soll ja im Hintergrund laufen.

Ja, ich hab das Problem den eingescannten String zu überprüfen, und zwar egal welches Programm gerade aktiv ist.

Mein Ziel ist es eben einen 2D Barcode am unteren Bildschirmrand zu kleben welches bei einem Scan das Fenster, quasi via ALT-TAB (Windows), switcht.

Und genau da weiß ich nicht welches Event ich da benötige.
Wenn zb ein anderes Programm mit einer Textbox geöffnet ist und ich da einen Nummer quasi mit dem Scanner einscanne erscheint sie auch ganz normal in der Textbox. Aber wenn der String zb.: #+***+# eingescsnnt wird, soll er eben nicht in der Textbox erscheinen sondern das Fenster wechseln.

Hoffe ich habe es verständlich erklärt. So etwas gibt es vielleicht auch schon, würde ich dann auch nehmen.

Gruß Gustl

28.01.2014 - 18:17 Uhr

Guten Abend,

ich hatte die Idee ALT-TAB in einem Barcode zu speichern, wobei man diesen dann nur mit einem Barcodescanner abscannen muss um in das andere Fenster zu switchen. Soweit die Idee.

Da ich aber im Web gelesen habe das dies nicht möglich ist, habe ich mir gedacht ich schreibe ein kleines Programm welches dann beim Einscannen eines bestimmten Strings ALT-TAB simuliert.

Das Programm sollte dann im Hintergrund darauf hören was gerade eingescannt wird und dann bei richtigem String ALT-TAB auslösen.

ALT-TAB mit C# zu simulieren ist ja denkbar einfach:

SendKeys.Send("%{TAB}");

Aber ich benötige ja das WindowsEvent das ausgelöst wird. Und genau da komme ich nicht weiter. Wie frage ich das ab? Ist es überhaupt möglich? Gibt es für meinen Fall vielleicht auch eine einfachere Lösung?

Freue mich auf Antworten.

Gruß Gustl

01.02.2013 - 18:05 Uhr

Hallo, danke für die Antworten.

Ich habe es nun folgendermaßen mit einem kleinen Testprogramm gelöst:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Globalization;

namespace Konsole_Spielwiese
{
    class Program
    {
        static void Main(string[] args)
        {           
            byte[] iv = new byte[] { 65, 110, 68, 26, 69, 178, 200, 219 };
            byte[] passwort_key;
            // der Vergleichstext der das Passwort kontrolliert.
            string vergleichtext = "VERGLEICHTEXT";
            string passwort;
            string falsches_passwort = "FALSCHES_PASSWORT";
            string passwort_md5;
            string ftp_passwort;

            Console.WriteLine("Gebe ein Passwort ein, mit welchem verschlüsselt werden soll:");
            passwort = Console.ReadLine();
            passwort_md5 = GenerateHash(vergleichtext, passwort);

            //Passwort kontrollieren
            if (passwort_md5.Equals(GenerateHash(vergleichtext, passwort)))
            {
                Console.WriteLine("Passwort richtig!");
            }
            if (!passwort_md5.Equals(GenerateHash(vergleichtext, falsches_passwort)))
            {
                Console.WriteLine("Passwort falsch!");
            }

            Console.WriteLine("Gebe ein FTP-Passwort ein, dieses soll mit dem Passwort verschlüsselt werden:");
            ftp_passwort = Console.ReadLine();


            passwort_key = get_passwort_key(passwort);

            byte[] ftp_passwort_crypt_byte = StringVerschluesseln(ftp_passwort, passwort_key, iv);
            Console.Write("ftp_passwort_crypt_byte: ");
            foreach (byte b in ftp_passwort_crypt_byte)
            {
                Console.Write(b + ", ");
            }
            Console.WriteLine();
            string ftp_passwort_encrypt = StringEntschluesseln(ftp_passwort_crypt_byte, passwort_key, iv);
            Console.WriteLine("ftp_passwort_encrypt: " + ftp_passwort_encrypt);

            Console.ReadLine();

        }

        public static byte[] get_passwort_key(string passwort)
        {
            byte[] pwd = Encoding.Unicode.GetBytes(passwort);
            byte[] salt = CreateRandomSalt(7);
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            try
            {
                PasswordDeriveBytes pdb = new PasswordDeriveBytes(pwd, salt);
                tdes.Key = pdb.CryptDeriveKey("TripleDES", "SHA1", 192, tdes.IV);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                ClearBytes(pwd);
                ClearBytes(salt);            
            }
            return tdes.Key;
        }
 
        public static byte[] CreateRandomSalt(int length)
        {
            byte[] randBytes;

            if (length >= 1)
            {
                randBytes = new byte[length];
            }
            else
            {
                randBytes = new byte[1];
            }

            RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();
            rand.GetBytes(randBytes);
            return randBytes;
        }

        // aus Speicher löschen
        public static void ClearBytes(byte[] buffer)
        {
            if (buffer == null)
            {
                throw new ArgumentException("buffer");
            }

            for (int x = 0; x < buffer.Length; x++)
            {
                buffer[x] = 0;
            }
        }

        // Generiert einen MD5 Hash mit Salt(Passwort)
        public static string GenerateHash(string value, string salt)
        {
            byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value);
            data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
            return Convert.ToBase64String(data);
        }

        /// <summary>
        /// Verschlüsselt einen Eingabestring.
        /// </summary>
        /// <param name="input">Der zu verschlüsselnde String.</param>
        /// <returns>Byte-Array mit dem verschlüsselten String.</returns>
        public static byte[] StringVerschluesseln(string input, byte[] key, byte[] iv)
        {
            try
            {
                // MemoryStream Objekt erzeugen
                MemoryStream memoryStream = new MemoryStream();

                // CryptoStream Objekt erzeugen und den Initialisierungs-Vektor
                // sowie den Schlüssel übergeben.
                CryptoStream cryptoStream = new CryptoStream(
                memoryStream, new TripleDESCryptoServiceProvider().CreateEncryptor(key, iv), CryptoStreamMode.Write);

                // Eingabestring in ein Byte-Array konvertieren
                byte[] toEncrypt = new ASCIIEncoding().GetBytes(input);

                // Byte-Array in den Stream schreiben und flushen.
                cryptoStream.Write(toEncrypt, 0, toEncrypt.Length);
                cryptoStream.FlushFinalBlock();

                // Ein Byte-Array aus dem Memory-Stream auslesen
                byte[] ret = memoryStream.ToArray();

                // Stream schließen.
                cryptoStream.Close();
                memoryStream.Close();

                // Rückgabewert.
                return ret;
            }
            catch (CryptographicException e)
            {
                Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "Fehler beim Verschlüsseln: {0}", e.Message));
                return null;
            }
        }

        /// <summary>
        /// Entschlüsselt einen String aus einem Byte-Array.
        /// </summary>
        /// <param name="data">Das verscghlüsselte Byte-Array.</param>
        /// <returns>Entschlüsselter String.</returns>
        public static string StringEntschluesseln(byte[] data, byte[] key, byte[] iv)
        {
            try
            {
                // Ein MemoryStream Objekt erzeugen und das Byte-Array
                // mit den verschlüsselten Daten zuweisen.
                MemoryStream memoryStream = new MemoryStream(data);

                // Ein CryptoStream Objekt erzeugen und den MemoryStream hinzufügen.
                // Den Schlüssel und Initialisierungsvektor zum entschlüsseln verwenden.
                CryptoStream cryptoStream = new CryptoStream(
                memoryStream,
                new TripleDESCryptoServiceProvider().CreateDecryptor(key, iv), CryptoStreamMode.Read);
                // Buffer erstellen um die entschlüsselten Daten zuzuweisen.
                byte[] fromEncrypt = new byte[data.Length];

                // Read the decrypted data out of the crypto stream
                // and place it into the temporary buffer.
                // Die entschlüsselten Daten aus dem CryptoStream lesen
                // und im temporären Puffer ablegen.
                cryptoStream.Read(fromEncrypt, 0, fromEncrypt.Length);

                // Den Puffer in einen String konvertieren und zurückgeben.
                return new ASCIIEncoding().GetString(fromEncrypt);
            }
            catch (CryptographicException e)
            {
                Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "Fehler beim Entschlüsseln: {0}", e.Message));
                return null;
            }
        }
    }
}

Anfangs wird ein Passwort gefragt welches ich als salt in GenerateHash() benutze und einen Vergleichtext habe, der festist. kommt dann der gleiche hash wert raus ist das Passwort richtig.

Von diesem Passwort generiere ich ein byte array ( get_passwort_key() ), also einen key welchen ich für das ftp-Passwort zum verschlüsseln benutze. Dafür benutze ich dann StringVerschluesseln() und StringEntschluesseln().
Die 2 Werte (passwort_md5 und ftp_passwort_crypt_byte) speichere ich dann in einer Datei ab.

Das Passwort muss dann als Klartext dann immer im Speicher stehen (Variable). Oder ich rufe dies dann bei jeder Aktion wo ich die verschlüsselten Daten benötige jedesmal erneut ab. Das möchte ich aber nicht.

Zudem kann man das Passwort oder User dann aber auch bei der Internetübertragung herausfiltern. Oder?

So wäre es zumindest von irgendwelchen Trojaner die die Festplatte ausspionieren sicher... Aber da wird wohl auch keiner extra wegen meinem kleinen Programm einen Bot erstellen. 😃

Wenn wer noch einen bessere Idee hat, würde ich mich freuen die hier zu lesen. 😃

Gruß Gustl

27.01.2013 - 11:27 Uhr

Hallo,

ich bin gerade dabei ein kleines Tool zu schreiben womit ich alle Bilder in einem Ordner "webfähig" umwandeln kann, das heißt in Vorschaubild (breite max 200) und das eigentliche Bild (breite max 600) und eben kleiner als 70kb. ein wenig geschärft wird es auch noch.

Danach sollen die fertigen Bilder auf der Webseite hochgeladen werden. Und eventuell für jedes Bild einen Datenbankeintrag geben, zwecks BEschreibung zu dem Bild.

Beim Start des Programms gibt es eine Passwortabfrage, das Passwort wird mit MD5 in einer Datei gespeichert und verglichen.

Dann sollen aber die Zugriffsdaten auch in einer Datei abgelegt werden, und zwar verschlüsselt. Anfangs dachte ich das ich die Verschlüsselung und Entschlüsselung dann abhängig von dem Passwort mache.
Dann habe ich dieses Verschlüsselungsverfahren entdeckt: Strings Verschlüsseln mit C#

Fragen:

  1. Ist dieses Verfahren sicher genug für mein Vorhaben?
  2. Würdet ihr das ganze vielleicht komplett anderes angehen?

Bin für jeden Tipp dankbar. 😃

Gruß Gustl

05.11.2012 - 08:29 Uhr

Hallo, und erstmal danke für die Antworten, haben mir etwas weitergeholfen.

Ich habe es nun so lösen können:

Process p = new Process();
                  ProcessStartInfo psI = new ProcessStartInfo("cmd");
                  psI.UseShellExecute = false;
                  psI.RedirectStandardInput = true;
                  psI.RedirectStandardOutput = true;
                  psI.CreateNoWindow = false;
                  p.StartInfo = psI;
                  p.Start();
                  p.StandardInput.AutoFlush = true;
                  p.StandardInput.WriteLine("echo hallo");
                  p.StandardInput.WriteLine("echo %username%");
                  char[] bufferr = new char[10000];
                  int readr = 0;

                  Thread.Sleep(500);
                  while (p.StandardOutput.Peek() > 0)
                  {
                      readr += p.StandardOutput.Read(bufferr, readr, 10000);
                  }
                  Console.WriteLine(new string(bufferr).Remove(readr));
                  Console.ReadLine();

Allerdings kann ich diesen Prozess (cmd) so nicht über einen anderen Benutzer (Admin) starten (ohne das Passwort eingeben zu müssen). Ziel ist es ja, das das Passwort nicht eingeben werden muss.

Ich habe mir diese Klasse mal angesehen: RunAs Class

Dort kann ich über CreateProcessWithLogonW aus der advapi32.dll einen Prozess mit einem beliebigen Benutzer und Passwort starten. Allerdings finde ich dort keine ProcessStartInfo wo ich RedirectStandardInput auf true setzen kann und somit nachträglich noch befehle in der Konsole zu schreiben.

@herbivore: Das wäre eine Möglichkeit, allerdings müsste ich dafür erst eine Batch erstellen und nach der Ausführung wieder löschen. Da mehrere Benutzer darauf zugreifen könnten, könnte es vorkommen dass die Datei dann überschrieben wird, bzw. Zugriff verweigert wird. ist schwer zu erklären. Würde gehen, ist aber unschön. Wenn ich es nicht hinbekomme, werden die Netzlaufwerksverbindungen fest in einer Batch geschrieben.

Gruß Gustl

31.10.2012 - 13:29 Uhr

Hallo,

folgendes Vorhaben:

Ich erstelle mir gerade eine kleine C#-Anwendung womit ich über eine Batchdatei und eines verschlüsseltem Parameter eine Datei aufrufen kann via runas mit Passwortübergabe. Die Datei sollte dann auch von einem Netzlaufwerk gestartet werden können. Dazu muss ich vorab das Laufwerk über dem jeweiligen Benutzer (dann admin) verbinden.
Mein Gedanke ist, eine console mit dem user admin (mit passwort) zu öffnen. Dann dort die nötigen Laufwerke verbinden und dann die entsprechende Datei (Batch, Installationsprogramm,etc.) aus der console starten und nach Abschluss die console beenden.

Ich starte also eine console (jetzt ohne runas):


ProcessStartInfo startInfo = new ProcessStartInfo("cmd");
Process proc = Process.Start(startInfo);

Nun soll in der gestarteten console 5x net use x: \server\share
gemappt werden. Danach eine Datei gestartet die eben auf den Netzlaufwerken zugreifen will.

Doch wie sende ich jetzt zusätzliche Befehle zu dieser console?

Danke schonmal.

Gruß Gustl

09.08.2012 - 21:52 Uhr

Hallo herbivore,

nein, im Moment geht das nicht, aber das ist natürlich eine guter Tipp. Werde ich mit aufnehmen und umsetzen. Danke.

Gruß Gustl

09.08.2012 - 21:31 Uhr

Hallo,

ich habe mir jetzt etwas Zeit genommen und die Seite weiter aufgebaut.

Nun können dort Aufgaben und Lösungen eingereicht werden. kommentare zu den Lösungen können auch gepostet werden.
Email Benachrichtigung und ein eigenens internen "Postfach" ist vorhanden.

Aber das wichtigste fehlt noch, die Aufgaben, der Inhalt. im Moment habe ich nur ein paar leichte Aufgaben hochgeladen. Das soll sich aber ändern. In diesem Zuge wollte ich gleich hier nachfragen, ob ich mir ein paar Aufgaben aus dem Thread:
"Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch" übernehmen könnte? Wäre super. 😃

Vielleicht hat der ein oder andere auch Lust sich anzumelden und die ein oder Aufgabe zu schreiben. CodeTags - Highlighter, Dateienupload ist vorhanden. Punktesystem steht auch.

Was jetzt noch fehlt ist ein kleines, sehr kleines Feedback "Forum", die Profilansicht und die Übersicht für jeden Benutzer.

Freue mich über jede Kritik und Verbesserungsvorschläge.

Hier der Link: http://trainyourprogrammer.de

Gruß Gustl

16.07.2012 - 18:52 Uhr

Die Panels oder UserControls müssen natürlich alle direkt im Form liegen und auf keinen Fall ineinander geschachtelt.

Hallo,

genau da lag der Hund begraben, dachte da nicht dran das das panel dann im anderen panel liegt. hmpf, hätte ich auch selbst drauf kommen können. 😃 Danke.

Gruß Gustl

16.07.2012 - 13:59 Uhr

Hallo,

ich versuche mich das 1.Mal an einem Menü in C#.
Mein Grundgedanke ist, dass ich zu jedem Menüpunkt ein eigenes Panel erzeuge, und nur die Komponenten in dem Panel erzeuge die ich für dem Menüpunkt benötige.
Bei wechseln durch das Menü werden alle Panels auf Visible false gesetzt und nur das eine, welches benötigt wird auf true.

Aber leider funktioniert das bei mir nicht so wie ich mir das vorstelle. Wenn ich die ganzen Panels genau aufeinander lege, zeigt er mein zweites Panel nicht an wenn ich es aufrufe. Aber wenn ich es ein klein wenig verschiebe, zb. nach oben, dann wird es bei klick im menü sichtbar.

Komisch, ich kann mich auch täuschen...

Mein Frage jetzt, ist das der richtige Weg mit Panels oder macht man das in C# üblicherweise doch anders?

Danke.
Gruß

19.06.2012 - 17:19 Uhr

Hallo,

ich möchte in einem kleinen Programm eine "Zurück"-Funktion einbauen.
In diesem Prog wird immer ein DataGrid verändert, dieses speichere ich in einer Liste von DataGrids. Wenn dann auf dem Zurück-Button geklickt wird, soll die vorherige Tabelle im DataGrid wieder erscheinen.

Es reicht leider nicht einfach den ItemsSource zuzuweisen, da sich die Struktur verändern kann. Und DataGrid = DataGrid funktioniert auch nicht, weil das DataGrid in der Liste ja eine Referenz ist.

Jetzt müsste ich doch das Objekt DataGrid klonen und dann zuweisen? Oder wie geht dies?

Bin für jeden Tipp dankbar. 😃

Gruß Gustl

11.06.2012 - 12:44 Uhr

Hallo,

ich habe die Suchfunktion schon bemüh, habe jedoch nichs passendes finden können.

Ich möchte bei Exceptions die Fehlermeldung in einer errlog.txt umleiten. Dort soll dann die ex.message vorhanden sein, der user, der hostname, datum und, was ich nicht weiß wo ich das in ex finde, Methode, File und Zeile wo die Exception ausgelöst wurde.

wenn ich mit ex.ToString(9 ausgeben lasse, kommt folgendes:> Fehlermeldung:

...
...
bei System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
bei System.Data.SqlClient.SqlConnection.Open()
bei SMT_JEDEC.station.get_ruestungsnummer() in C:\c#_projekte\SMT-JEDEC\SMT-JEDEC\station.cs:Zeile 314

Genau die letzte Zeile in der Ausgabe würde ich gern in die errorlog.txt speichern.
Habe auch schon in ex.getType() gesucht, aber dort finde ich wohl nicht die entsprechenden Eigenschaften etc., die ich dafür benötige.

Für einen Hinweis wäre ich dankbar.

Wenn nicht nehme ich einfach ex.ToString() und hole mir die letzte Zeile raus. Aber sollte doch auch anderes gehn?

Danke.

Gruß Gustl

07.06.2012 - 19:07 Uhr

Hallo,

stimmt, Tutorial gibt es schon viele. Dann würde ich einfach eine Webseite erstellen wie es @herbivore mit dem Programmier-Spiel gepostet hat.

Ich kann die Seite ja mal in paar Wochen soweit ausbauen das alles was ich auf dieser Entwurfseite geschrieben habe funktioniert.

Wenn sich dann ein paar Leute finden, und es vielleicht mehr Interessanten gibt, würde ich dann der Seite noch mehr Funktionen hinzufügen. Man könnte dann zb. auch andere Programmiersprachen (Java, Perl, etc.) mit einbauen, oder Datenbanksprachen (MySQL, T-SQL, Oracle, etc.).

Natürlich ist das ganze ein Schritt ins Ungewisse, aber ist es das bei Webseiten nicht meistens? 😃

Eine Forumsoftware würde ich eher ablehnen, da dort die Möglichkeiten begrenzt sind, und wenn ich die Seite dann selbst programmiere ist es zwar mehr Aufwand, aber ich kann sie so erstellen bzw. verändern wie es die User dann wünschen. (Vorausgesetzt die Seite kommt an).

Zuerst werde ich mal ein kleines Pflichtenheft schreiben und dann gehts dran der Entwurfseite Leben einzuhauchen.

Danke euch für eure Antworten, ich werde euch hier auf dem Laufenden halten.

Gruß Gustl

07.06.2012 - 11:27 Uhr

Hallo,

ich habe gerade eine Idee und möchte Wissen wie es ankommt, ich denke das hier die Zielgruppe für meine Idee ist.

Ich würde eine Webseite aufbauen, auf der sich jeder anmelden kann, der C# lernen und üben kann. Und zwar gibt es Lektionen, wo dann zb. in der ersten Lektion erklärt wird wie ein Konsolenprogramm erstellt werden kann und es danach eine Übung gibt. zb. Soll der User ein Konsolenprogramm erstellen in der eine Eingabe solange abgefragt wird, bis diese eine int zahl ist. Dann soll das Programm hochgeladen werden. Nach dem Hochladen kann der User auch andere Vorschläge von den anderen Usern anschauen und somit vergleichen und lernen wie es anders und vielleicht besser geht. Zudem können dann die Vorschläge auch bewertet werden.

Das ganze kann dann auch mit komplexere Methoden gemacht werden. Und diese können dann auch hochgeladen werden. etc.

Das ist jetzt meine Grundidee, wie würde die ankommen?

Gruß Gustl

15.05.2012 - 16:53 Uhr

Ich habe das mit einem Thread probiert, aber da ist es schwierig die berechnung von der GUI zu trennen.

mit this.refresh();
hat das dann aber funktioniert. Wohl eine unschöne Lösung, aber es tut den Zweck.

Das mit dem Trennen von Berechnungen und GUI muss ich mir nochmal genauer anschauen.

Danke.

Gruß Gustl

15.05.2012 - 09:45 Uhr

Hallo,

ich habe ein DataGridView, welches nur eine Zeile hat, auch keinen header.
Ich befülle das Grid mit dGV.DataSource. Dann habe ich ca. 10 Spalten.

Wenn ich aber jetzt über einen Button dGV.DataSource=null; anstoße, dann verschwinden nur die ersten 2 Spalten, aber der Rest bleibt leider stehen.

Was kann ich tun, damit auch der Rest von dem DataGridView verschwindet?

Danke im voraus.
Gruß

08.05.2012 - 13:23 Uhr

Hallo,

da ich jeder Spalte eine feste Breite vergebe, bringt mir dein Tipp leider nichts.

Danke.
Gruß

08.05.2012 - 13:10 Uhr

Hallo,

ich möchte um meinen DataGridView einen Rahmen. Dann stellte ich die BorderStyle-Eigenschaft auf FixedSingle.

Leider schließt der Rahmen rechts und unten nicht mit der Tabelle selbst ab. siehe Bild.
Ich lade die Daten von einem SQL-Reader in ein DataTable und dann in das DataGridView.

Habe schon Eigenschaften gesucht die mein Problem vielleicht beheben könnten, aber leider ohne Erfolg.

Würde mich freun wenn mir einer einen Tipp geben könnte.

Gruß Gustl

24.04.2012 - 10:09 Uhr

Hi, kann mir keiner helfen?

Habs schon mit Binding probiert, aber dann kommt folgender Fehler:

Die Items-Auflistung muss vor dem Verwenden von "ItemsSource" leer sein.

Ich möchte doch nur DateTime in einem gewissen Format in DataGrid ausgeben, und zwar so, dass die DataGrid auch richtig nach Datum formatiert.

Ist es wirklich so schwer? Oder zu einfach?

23.04.2012 - 08:43 Uhr

Hallo, erstmal danke für die Antworten.

Mein DataTable wird mit einem dbReader(SQL-Abfrage) gefüllt, und die Spalten sind dynamisch aufgebaut.

Ich habe nun folgendes versucht:


dbReader = dbCommand.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dbReader);
dt.Columns["Starttermin"].DataType = typeof (DateTime);

Jetzt wird eine Exception geworfen mit folgeder Fehlermeldung:

Der DataType einer Spalte kann nicht geändert werden, wenn diese Daten enthält.

Aber die Daten sind alle aus einer DateTime -Spalte von SQL, also haben diese das richtige Format... Was kann ich tun?

@DaMoe80: Ich benutze doch gar kein DataGridView. Oder kann ich das an mein DataGrid binden?

Edit: Ok, ich habe die Spalte nun vor dem dt.Load(dbReader) erzeugt und DateTime als Format angegeben.

Nun funktioniert es, die Spalte ist zwar nicht an der richtigen Stelle aber es funktioniert schonmal.

Nun ist das Format aber anders... Anstatt "27.09.2012" habe ich nun "9/27/2012 12:00:00 AM" Wie kann ichd as Ändern, sodass die Sortierung auch funktioniert?

Danke im voraus.
Gruß Gustl

17.04.2012 - 16:39 Uhr

Hallo,

ich befülle mein DataGrid mit einer DataTable über folgendem Aufruf:

dG_erg_table.ItemsSource = erg_datatable.DefaultView;

Nun ist eine Spalte(Header) dabei welche "Starttermin" heißt.
Alle Spalten werden alphabetisch sortiert.

Nun möchte ich aber, das bei Klick auf den header der Spalte Starttermin, das DataGrid nach diesem Datum sortiert.
Spalte Starttermin zb.: "10.09.2012"

Ich habe es so probiert:


foreach (DataGridColumn col in dG_erg_table.Columns)
{
   if (col.Header.Equals("Starttermin"))
   {
     col.SortMemberPath = "xx.xx.xxxx"; //Ist natürlich falsch
     col.SortDirection = ListSortDirection.Ascending; //Nur auf bzw. absteigend
   }                          
}

Kann ich ein selbst geschriebene compare-Methode für diese Spalte einfügen? Wenn ja wie/wo? Oder gibt es hier doch eine andere, sich besser anbietende, Lösung?

Stehe irgendwie im Wald.. 😦 ..und bin für jeden Tipp dankbar.

Gruß
C#Gustl