Laden...

Forenbeiträge von oli001 Ingesamt 449 Beiträge

13.06.2007 - 14:35 Uhr

Hi,

eine maskedTextBox kann man ja so maskieren, dass nur Zahlen zugelassen werden. Allerdings muss ich dann vorher die Länge der Zahl bestimmen.

Wenn ich das nicht möchte, also die MTB so maskiert haben will, dass nur Zahlen zugelassen sind, aber die Länge vorher nicht definiert ist, welche Möglichkeiten gibt es da? (KeyEvents abfangen ist klar, aber geht´s auch einfacher?)

Grüße Oli

29.05.2007 - 12:47 Uhr

Hallo an Alle,

ich habe nun eine Möglichkeit gefunden, mit der die Applikation nur einmal aufgerufen und (wenn bereits geöffnet) in den Vordergrund gebracht werden kann. Das ganze funktioniert über die Windows API.

In program.cs :



using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace TEST
{
    static class Program
    {

        /* Deklaration der benötigten API-Funktionen */
        [DllImport("user32", SetLastError = true)]
        private static extern int FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32", SetLastError = true)]
        private static extern int GetWindowTextLength(IntPtr hWnd);

        [DllImport("user32", SetLastError = true)]
        private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

        [DllImport("user32", SetLastError = true)]
        public static extern int SetForegroundWindow(IntPtr hwnd);

        [DllImport("user32", SetLastError = true)]
        public static extern int IsIconic(IntPtr hwnd);

        [DllImport("user32", SetLastError = true)]
        public static extern int OpenIcon(IntPtr hwnd);

        [DllImport("user32", SetLastError = true)]
        private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,
           int nMaxCount);

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            bool OwnMutex = false;

            //Versuchen den Zugriff auf den Mutex zu bekommen
            System.Threading.Mutex Mutex = new System.Threading.Mutex(true, "HLT_MUTEX", out OwnMutex);

            //Zugriff auf Mutex erfolgt, Applikation starten, sonst existierenden Prozess nach vorne bringen
            if (OwnMutex)
            {
                Application.Run(new Main());
                Mutex.ReleaseMutex();
            }
            else
            {
                ActivateApplicationByPartialTitle("Name des Fensters");
            }
        }

        public static void ActivateApplicationByCompleteTitle(string mainWindowTitle, string mainWindowClassName)
        {
            // Fenster mit dem übergebenen Klassennamen und Titel suchen
            int windowHandle = FindWindow(mainWindowClassName, mainWindowTitle);

            if (windowHandle != 0)
            {
                // Fenster gefunden: Überprüfen, ob das Fenster verkleinert ist
                if (IsIconic((IntPtr)windowHandle) != 0)
                {
                    // Fenster wiederherstellen
                    if (OpenIcon((IntPtr)windowHandle) == 0)
                    {
                        throw new Exception("Windows-Fehler " +
                           Marshal.GetLastWin32Error() + " beim Wiederherstellen " +
                           "des Fensters mit dem Titel '" + mainWindowTitle +
                           "' aus dem minimierten Zustand.");
                    }
                }

                // Fenster in den Vordergrund holen
                if (SetForegroundWindow((IntPtr)windowHandle) == 0)
                {
                    throw new Exception("Windows-Fehler " +
                       Marshal.GetLastWin32Error() + " beim Nach-Vorne-Holen " +
                       "des Fensters mit dem Titel '" + mainWindowTitle + "'");
                }
            }
            else
            {
                throw new Exception("Fenster mit Titel '" + mainWindowTitle +
                   "' nicht gefunden");
            }
        }

        public static void ActivateApplicationByCompleteTitle(string mainWindowTitle)
        {
            ActivateApplicationByCompleteTitle(mainWindowTitle, null);
        }

        public static string GetWindowClassName(string windowTitle)
        {
            int windowHandle = FindWindow(null, windowTitle);
            if (windowHandle != 0)
            {
                StringBuilder className = new StringBuilder(255);
                if (GetClassName((IntPtr)windowHandle, className, 255) > 0)
                {
                    return className.ToString();
                }
                else
                {
                    throw new Exception("Windows-Fehler " +
                       Marshal.GetLastWin32Error() + "beim Ermitteln des " +
                       " Klassennamens des Fensters mit dem Titel '" +
                       windowTitle + "'");
                }
            }
            else
            {
                throw new Exception("Fenster mit dem Titel '" + windowTitle +
                   "' nicht gefunden");
            }
        }

        public static void ActivateApplicationByPartialTitle(string mainWindowTitle, string mainWindowClassName)
        {
            string errors = null;
            int count = 0;
            // Alle Prozesse durchgehen
            foreach (Process process in Process.GetProcesses())
            {
                if ((int)process.MainWindowHandle != 0)
                {
                    // Ermitteln der Länge des Textes des Hauptfensters
                    int windowTextLength = GetWindowTextLength(process.MainWindowHandle);

                    // Einlesen des Textes des Hauptfensters
                    StringBuilder windowTextBuilder = new StringBuilder(
                       windowTextLength + 1);
                    if (GetWindowText(process.MainWindowHandle,
                       windowTextBuilder, windowTextLength + 1) > 0)
                    {
                        // Ermitteln, ob der übergebene Titel in dem Text 
                        // des aktuellen Fensters vorkommt und Aktivieren
                        // dieses Fensters im positiven Fall
                        string windowText = windowTextBuilder.ToString();
                        if (windowText.Contains(mainWindowTitle))
                        {
                            try
                            {
                                ActivateApplicationByCompleteTitle(
                                   windowText, mainWindowClassName);
                                count++;
                            }
                            catch (Exception ex)
                            {
                                if (errors != null)
                                {
                                    errors += Environment.NewLine;
                                }
                                errors += ex.Message;
                            }
                        }
                    }
                }
            }

            // Fehler auswerten
            if (errors != null)
            {
                throw new Exception(errors);
            }
            else if (count == 0)
            {
                // Es wurde kein Fenster mit dem übergebenen Titel
                // gefunden
                throw new Exception("Fenster mit Titel '" + mainWindowTitle +
                   "' nicht gefunden");
            }
        }

        public static void ActivateApplicationByPartialTitle(
           string mainWindowTitle)
        {
            ActivateApplicationByPartialTitle(mainWindowTitle, null);
        }
    }
}


Funktioniert auch mit Teilen eines Fensternamens...

Viele Grüße,

Oli

29.05.2007 - 09:12 Uhr

Hallo,

wie kann ich erreichen, dass ein Benutzer eine Applikation nur einmal aufrufen kann?

Grüße Oli

25.05.2007 - 11:03 Uhr

Falls es jemanden interessiert:

Das Problem war, dass eine Source an das DGV gebunden war. Da funktioniert es scheinbar nicht, die RowHeaders zu bearbeiten.

Source nicht mehr gebunden, RowHeaders werden angezeigt.

25.05.2007 - 10:14 Uhr

Nochmal ich,

ich habe jetzt einen Event auf das Grid gelegt und lasse mir den CellHeader auf ein Label schreiben. Die Headers sind definitiv vorhanden. Das Problem ist nur das sie nicht angezeigt werden.

Hat keiner eine Idee wo der Fehler liegen kann?

Viele Grüße, Oli

25.05.2007 - 09:51 Uhr

Moin,

ich meinte natürlich eine DataGrisdView. Ich habe folgenden Code. Funktioniert aber nicht. Die Strings aus dem Arrray werden nicht in den RowHeaders angezeigt.


int i = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
  {
      row.HeaderCell.Value = _rowHeaders[i];
      i++;
   }
dataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);

woran kann das liegen?

Grüße,

Oli

25.05.2007 - 09:02 Uhr

Guten Morgen,

entwerder hab ich gestern die Feier net vertragen oder ich bin zu doof. Ich möchte in einer DataTable den RowHeaders Namen geben.
Kann mir jemand sagen, wie des geht?

Viele Grüße

Oli

24.05.2007 - 16:57 Uhr

Hi,

also wenn ich das richtig verstanden habe ist das DataGridView am Anfang weiß und erst wenn deine Frage beantwortet wurde und nach dem die Funktion SetStyles() ausfegrufen wurde nicht mehr?

Gruß Oli

24.05.2007 - 11:17 Uhr

Hallo,

gibt es eine Komponente mit der ich eine Excel Tabelle in .NET darstellen kann. Also etwas ähnliches wie das WebBrowser Control?

WebBrowser.Navigate(file) ----> ExcelViewer.Source(file)

Vielen Dank,

Oli

22.05.2007 - 16:02 Uhr

Super, vielen Dank.

Gruß Oli

22.05.2007 - 15:55 Uhr

Hallo,

ich möchte meine Applikation hart beenden, Application.Exit(); wird aber erst ausgeführt, wenn alle vorherigen Funktionsafrufe durchgeführt wurden.

Gibt´s da keine Möglichkeit den Prozess hart abzuschießen??

Grüße Oli

22.05.2007 - 12:32 Uhr

Hallo,

wie kann ich erzwingen, dass nach einer Textfolge eine neue Seite angefangen wird, mit e.hasMorePages funktionierts irgendwie nicht.

Gruß Oli

21.05.2007 - 15:09 Uhr

Hallo herbivore,

naja, es besteht eine Datenbank (Sybase), gespeicherte Prozeduren sind soweit vorhanden.
Die Applikation dient hauptsächlich zur Visualisierung und Berechnung von den werten auf der Datenbank.
Weiterhin sollen die Daten auch graphisch dargestellt werden können (Mehrfache Y-Achsen) (geht in PB schonmal nicht, soviel ich weiß).
Außerdem sollen die Daten auch in Excel, bzw. csv-Files exportierbar sein, usw...

Gruß Oli

21.05.2007 - 15:02 Uhr

Hallo,

kann mir jemand ein paar Schlagwörter liefern um jemanden davon zu überzeugen, dass C# dem Powerbuilder von Sybase vorzzuziehen ist?

Grüße Oli

21.05.2007 - 10:58 Uhr

Hallo herbivore,

das Programm wurde noch unter .NET 1.x geschrieben und es gab da keine Probleme.
Aber ich denke das Problem liegt schon am neu aufgerufenen Thread. Mit deiner Beschreibung kann das ja auch so gelöst werden.

Viele Grüße

Oli

21.05.2007 - 10:50 Uhr

Hallo,

ich hatte ein ähnliches Problem, versuch mal im Thread myBGWorker den Cursor ebenfalls auf WaitCursor zu setzen.
Wie gesagt, hat bei mir geholfen, allerdings war das Problem ein bisschen anders, also keine Garantie...

Grüße Oli

21.05.2007 - 10:46 Uhr

Hi,

wie kann ich erzwingen, dass in einem DGV eine bestimmte Zeile als selektiert angezeigt wird. (RowSelect ist aktiviert).

Also z.B. beim Öffnen immer Zeile 5 als selected anzeigen (dgv.select ist ja read-only)...

Danke Oli

15.05.2007 - 14:25 Uhr

An alle, die ein ähnliches Problem haben, ich habe jetzt folgende Lösung gefunden:


 private void dynDGV_Scroll(object sender, ScrollEventArgs e)
 {
     foreach (Control c in tableLayoutPanel1.Controls)
     {
         if (c is DataGridView)
         {
             ((DataGridView)c).FirstDisplayedScrollingRowIndex = e.NewValue;
         }
     }
 }

Es werden alle Elemente des TableLayoutPanels durchsucht, wenn sie vom Typ DataGridView sind, wird ihnen der neue Wert der ScrollBar zugewiesen.

Viele Grüße,

Oli

15.05.2007 - 13:33 Uhr

Hi,

sollte eigentlich funktionieren. Kannst du mal deinen Code heir posten oder mir per email schicken?

Gruß Oli

15.05.2007 - 13:20 Uhr

Hi,

da haben wir das Problem!

DockStyle.Fill darfst du nicht verwenden. Das Control "weiß" selber, wann es die ScrollBars einfügen soll.
Ich nehme an, dass dein Text nach rechs aus dem Panel wandert. Also nehme DockStyle.Left, das füllt auch den ganzen Bereich aus, aber nach rechts ist das Panel noch offen.

Gruß Oli

15.05.2007 - 13:15 Uhr

Hi,

also ich habe ein tableLayoutPanel auf dem dynamisch DataGrids gelegt werden und die können je nach Anzahl auch außerhalb des Fensterbereiches liegen.

Hab ich so gelöst:


this.tableLayoutPanel1.VerticalScroll.Enabled = true;
this.tableLayoutPanel1.AutoSize = true;
this.tableLayoutPanel1.Dock = DockStyle.Left;

Funktioniert einwandfrei.
Das Dock muß nicht zwingend sein...

Grüße Oli

15.05.2007 - 13:11 Uhr

Hi,

hast du das AutoScroll auch noch dort stehen?

Gruß Oli

15.05.2007 - 13:09 Uhr

Hi,

das kann man im .NET Framework einstellen.

Gruß Oli

15.05.2007 - 13:03 Uhr

Hi,

also panel1.SetAutoScrollMargin(5, 5); ist meines Erachtens nicht nötig,



this.panel1.VerticalScroll.Enabled = true;
this.panel1.HorizonzalScroll.Enabeld = true;


sollte eigentlich dein Problem lösen.
AutoScroll() bewirkt meines Wissens nur dass bei der Initialisierung automatisch zu den Enden gescrollt wird.

Grüße Oli

15.05.2007 - 12:47 Uhr

Hi,

ich habe auf einem TableLayoutPanel mehrere DGViews. Nun möchte ich, dass wenn ich in einem DGView nach unten scrolle, auch alle anderen DGViews in diesem TableLayoutPanel mitscrollen.
Dazu meine Frage:

  1. Kann ich diese DataGridViews ansprechen etwa mit foreach(DatagridView dg in tableLayoutPanel.Controls)?

  2. Wie kann ich einen ScrollEvent auslösen (abfangen is ja kein Problem)

Viele Grüße,

Oli

14.05.2007 - 09:27 Uhr

Sch... 😉

Danke Oli

14.05.2007 - 08:48 Uhr

Hallo Herbivore,

ClientSize war klar, aber wie gesagt, ToolStrip und Menüleiste werden nicht abgezogen. Da ich ne Applikation habe, die auf mehreren Rechnern läuft und einige Mitarbeiter lustige XP - Styles verwenden (sauwichtig!!!) bleibt mir also nix anderes übrig als zur Laufzeit das Problem zu beheben.
Hab ich des richtig verstanden ?

Grüße Oli

14.05.2007 - 08:40 Uhr

Moin,

gibt´s ne Möglichkeit die Innenmaße eines Fensters, also den nutzbaren Bereich ohne Ränder und Menü auszulesen?

Grüße Oli

07.05.2007 - 14:56 Uhr

Hi,

verscuchs mal mit e.cancel nach this.Dial.....

Oli

07.05.2007 - 14:17 Uhr

Hi,

also des passt so meines erachtens. Was Du noch probieren kannst ist nach dem Markieren des Textes

suchen.bringToFront

versuchst.

Gruß Oli

07.05.2007 - 13:43 Uhr

Hi,

textBox1.scrollToCaret();

Damit sollte es funktionieren. Oder welches Problem hast du sonst?

Gruß Oli

07.05.2007 - 13:40 Uhr

Hi, budili

suchen.topMost=true;

Gruß Oli

07.05.2007 - 13:37 Uhr

Danke budili,

aber wie gesagt, wes geht um den print Dialog, mit allen Funktionen, den werd ich aber net neu implementieren. Wegen des Textes in einem Button wäre der Aufwand denke ich nicht gerechtfertigt.

Gruß Oli

07.05.2007 - 13:27 Uhr

Hi,

Kann ich den Texte eines Buttons von einem SystemDialog ändern? z.B. beim Printdialog soll nicht "Drucken" sondern z.B. "Jetzt drucken" stehen.

Hab versucht mit printDialog.Container auf die Objekte zu kommen, wirft mir aber ne NullReferenceExc..

Grüße Oli

07.05.2007 - 12:57 Uhr

Hi,

also nach genauerm Suchen habe ich das Problem gefunden. Der XML Serialiser kann keine Konvertierungen von readOnly Properties, somit wirft er diese Exception.
Die Lösung ist hier leider nur mit einem binärem File machbar.

Schade.

Gruß Oli

07.05.2007 - 10:48 Uhr

Hallo,

ich habe jetzt alles gelesen, was ich zu XML Serialisierng finden konnte, aber ich kann keinen Fehler entdecken.
Folgenden Code hab ich jetzt:


PrinterSettings psFromUser = new PrinterSettings();
psFromUser = printDialog1.PrinterSettings;
XmlSerializer serToXML = new XmlSerializer(typeof(PrinterSettings));
_appData += @"\printerSettings.xml";
 try
 {
   Stream stream = new FileStream(_appData, FileMode.Create);
   XmlWriter writer = new XmlTextWriter(stream, Encoding.Unicode);
   serToXML.Serialize(writer, psFromUser);
   writer.Close();                        
  }
  catch (Exception ex) 
  {
    string x = ex.Message;
    Messages.UserError ms = new BAT_Hausleittechnik.Messages.UserError(x);
  }

Dann wird folgende Exception geworfen:

The process cannot access the file 'C:\Documents and Settings\t0f4\Application Data\printerSettings.xml' because it is being used by another process.

Inner Exception:

The given path format is invalid.

Versteh ich aber net, denn das File wird definfitiv angelegt. Schreibrechte sind auch vorhanden und das File wird nicht von einem anderen Prozess benutzt (Zumindest habe ich das File nicht geöffnet.)

Ich hoffe mir kann jemend helfen, bon schn am verzweifeln. X(

Grüße Oli

07.05.2007 - 09:36 Uhr

Hallo,

jetzt bekomme ich eine Exception ("The given path is not valid") bei der Serialisierung.
Kann mir jemand sagen was ich falsch mache?



  string _appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

 PrinterSettings psFromUser = new PrinterSettings();
 psFromUser = printDialog1.PrinterSettings;
 XmlSerializer serToXML = new XmlSerializer(typeof(PrinterSettings));
 
_appData += @"\printerSettings.xml";
 StreamWriter writer = new StreamWriter(_appData);
 serToXML.Serialize(writer, psFromUser);
 writer.Close();

07.05.2007 - 09:14 Uhr

Hi,

also etwa XMLSerializer xml = new XMLSerializer(typeof(PrinterSettings)) würde funktionieren?

Gruß Oli

07.05.2007 - 09:00 Uhr

Hi,

jetzt komm ich net ganz klar. Mach ich schon einen Fehler beim ermittlen des Druckers?


  if (printDialog1.ShowDialog() == DialogResult.OK)
  {
    printDocument1.DocumentName = "Dokument";
    printDocument1.PrinterSettings.PrinterName = printDialog1.PrinterSettings.PrinterName;
    printDocument1.PrinterSettings = printDialog1.PrinterSettings;
    seitenNummer = 1;
     printDocument1.Print();
    }

Wie kann ich die Einstellungen der PrinterSettings dann in eine Datei packen?

07.05.2007 - 08:42 Uhr

Hi,

Da war ich wohl mit dem Edit meines PS zu spät...
ICh such was, womit ich die Druckereinstellungen in zb ein XML packen kann und dann benutzerspezifisch wieder reinladen...

Gruß Oli

07.05.2007 - 08:36 Uhr

Hallo,

ich drucke aus einer Anwendung heraus. Nun möchte ich, dass einmal gemachte Einstellungen an einem Drucker, die von den Standarteinstellugnen abweichen, beibehalten werden, also nicht bei jedem erneuten Druck abgeändert werden müssen.
Welche Möglichkeiten gibt es da?

Viele Grüße

Oli

P.S.: Den Beitrag weiter unten habe ich gelesen, aber ich will nicht nur den Drucker speichern, sondern alle Einstellungen. Da gibt es ja bei verschiedenen Druckenr auch verschiedene Möglichkeiten. Duplex, Mehrschacht, Papierformat....

27.04.2007 - 10:26 Uhr

Hi,

ich drucke Tabellen auf einem Drucker aus, der auch A3 unterstützt. Wenn ich meinen PrinterDialog aufrufe und dem Drucker über Preferences sage er soll die Tabellen auf A3 ausdrucken bekomme ich trotzdem einen A4 - Ausdruck.
Bekomme ich nicht vom Drucker die marginbounds? Denn darüber berechne ich, wie die Seiten dargestellt werden sollen. Sind die marginbounds default-mäßig eingestellt und wenn ja, wie bekomme ich heraus was der Benutzer in den Preferences verstellt hat.

Vielen Dank,

Oli

27.04.2007 - 10:20 Uhr

Hi nin,

habe es mit einem Interface gelöst. Da ich ja mehrere Aktionen druchführen will (Drucken, Vorschau, Export in Excel usw.) erschien mir das am vernünftgsten...

Vielen Dank nochmal...

27.04.2007 - 09:24 Uhr

Hallo,

yipieee funktioniert! Vielen Dank.

Grüße Oli

27.04.2007 - 09:09 Uhr

Hi nochmal,

irgendwie gluab ich ich sitz auf der Leitung.

Also ich hole mir mit


 Form toPrint = this.ActiveMdiChild;

das aktive Fenster. Aber ich kann ja nicht sagen


toPrint.print();

Ich weiß ja nicht vorher ob in dem Child das Drucken überhaupt zugelassen ist.

27.04.2007 - 08:55 Uhr

Hallo,

Äh, ich hab mich glaub ich ein bisschen falsch ausgedrückt. Also das aktuelle Fenster zurückzubekommen ist nicht das Problem.
Wenn ich ein MdiChild instanziiere, wird im Konstruktor z.B. eine DataTable erstellt und diese möchte ich nun ausdrucken. Aber eben nicht vom Child aus sondern vom Parent aus. Wie komme ich also über das aktive (ermittlete) Child an die in der Klasse hinterlegten Daten?

Danke Oli

27.04.2007 - 08:34 Uhr

Guten Morgen allerseites,

Ich habe eine Anwendung in der ich eine Menüleiste habe. Wenn ich einen Menüpunkt anzeige, wird ein MdiChild erzeugt und angezeigt. Wenn ich in der Menüleiste nun "Drucken" anwähle, möchte ich bestimmte Inhalte aus diesem aktiven MdiChild drucken.
Aber wie bekomme ich das aktuelle Fenster zurück.
Ich habe ja das MdiChild-Array zur verfügung, allerdings komme ich da auch nicht weiter. Kann mir jemand einen Tipp geben?

Vielen Dank,

Oli

26.04.2007 - 17:12 Uhr

Hi,

ich arbeite auf einer SybaseDB und habe folgendes Problem. In den storedProcedures kommt ein "print"-Befehl vor. Dieser "print"--Befehl lässt allerdings den Sybase ASE Client an die Wand fahren.(Exeption wenn auf e print-Befehl aufgelaufen wird). Weiß jemand wie ich das umgehen kann, also diesen Output in ein "null" laufen lassen kann?
Sonst wäre die Konsequenz, dass ich ca. 80 Prozeduren mit jeweis 8-15 print-Befehlen ändern müsste.

Viele Grüße,

Oli

25.04.2007 - 15:41 Uhr

Hi,

ich hab folgendes Problem:
Ich lade mir Daten in ein DataGridview. Wenn der User die Tabelle nun nach einer beliebeigen Spalte sortiert, soll er diese ausdrucken können. Nun ändert sich aber ja die Source des gridViews nicht sondern nur die Anzeige.
Wie bokomme ich die angezeigten(sortierten) Daten in eine Tabelle zurück?

Grüße Oli

23.04.2007 - 10:30 Uhr

Graphics.MeasureString war´s

Supi, besten Dank