Laden...

Forenbeiträge von ChrisProg Ingesamt 174 Beiträge

25.01.2017 - 16:20 Uhr

Also das heißt dann im Klartext, das so ziemlich jedes Objekt auf einer Form das OnKeyDown-Ereignis auslöst, unabhängig, ob es den Fokus hat, oder nicht 🤔 - welcher Sinn steckt dahinter ?

MfG Christian

25.01.2017 - 16:08 Uhr

Hallo LaTino,

danke für die Info´s ...

Dank deinem Hinweis "jump to reference source" konnte Tante "Google" hierfür die Seite MS Reference Source ermitteln, auf der ich dann auch OnKeyDown finden konnte ...

Und diese Seite kann man in VS für jedes Control individuell aufrufen oder nur gesamt und dann suchen, oder gibt es gar eine Offline-Version davon ???

Gibt es eigentlich eine Möglichkeit in VS in den Eigenschaften direkt anzuzeigen, das da Methoden sind, die aus der Klasse kommen ??? (auch wenn VFP leider tot ist, aber so etwas war unter Eigenschaften sofort zu sehen...)

Aber ich verstehe immer noch nicht, warum das für das TabControl ausgeführt wird, wo doch die TextBox den Fokus hat ...

MfG Christian

25.01.2017 - 11:46 Uhr

Erklär mal bitte, denn ich für mich ist es das nicht, da definitiv die TextBox den Fokus hat - u. somit das TabControl nicht den Fokus haben kann, oder ?

(geht das unter .NET doch ? - bei VFP war das jedenfalls ausgeschlossen !)

MfG Christian

25.01.2017 - 11:08 Uhr

Ja, einfach aus dem Grund heraus, das wenn doch mal der Fokus auf dem TabControl liegen sollte, soll es ebenfalls auf {ESC}-Taste reagieren ...

MfG Christian

25.01.2017 - 08:58 Uhr

In der Ansicht unter der entsprechenden Eigenschaft im DropDown auswählen - also nichts besonderes ...

Sei´s drum, danke für deinen Input 🙂

MfG Christian

24.01.2017 - 16:08 Uhr

Debug gibt leider nicht viel neues her:

Fehlermeldung:
System.Windows.Forms.TabControl, TabPages.Count: 6, TabPages[0]: TabPage: {Kuh}
System.Windows.Forms.MaskedTextBox, Text: 276 05 366 96090
Eine Ausnahme (erste Chance) des Typs "System.ArgumentOutOfRangeException" ist in mscorlib.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.ArgumentOutOfRangeException" ist in mscorlib.dll aufgetreten.

Wie gesagt die Pageframe feuert noch vor der TextBox ...

Was dieses "ArgumentOutOfRangeException" in diesem Zusammenhang bedeutet - k.A.

Ich habe das ja mit "e.Handled = true" lösen können, nur verstehen würde ich das jetzt auch noch gerne ...

MfG Christian

24.01.2017 - 11:32 Uhr

Hallo Alf,

OK, das löst das Problem, erklärt aber immer noch nicht, warum eine Pageframe, die nicht den Fokus hat, auf das KeyDown einer Textbox reagiert, und das auch noch **vor **der Textbox ...

Trotzdem Danke für den Tip (kannte ich noch nicht ...)

MfG Christian

24.01.2017 - 10:53 Uhr

Hallo zusammen,

ich habe eine Form, mit einer Pageframe und mehreren Textboxen.

Das Event KeyDown bei allen objekten mit der folgenden Methode verknüpft:


        private void Feld_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                SendKeys.Send("{TAB}");
            }
            if (e.KeyCode == Keys.Escape && !aenderungsmodus)
            {
                Close();
            }
        }


Wenn ich nun in einer Textbox "{Enter}" drücke wird diese Funktion zweimal(!) durchlaufen, einmal für die Pageframe(?) und einmal für die Texbox, die den Focus hat... 🤔

Kann mir jemand erklären, warum das so ist ? (Die Pageframe hat ja nicht den Focus; und die Form macht das nicht ...)

Im Moment habe ich mir geholfen, in dem ich das KeyPress-Event der Pageframe zurückgesetzt habe, aber das kann ja eigentlich nicht die Lösung sein, zumal die Pageframe ja auf Keys.Escape reagieren soll !

MfG Christian

05.01.2017 - 15:21 Uhr

OK, Du sprichst von WPF ...

Ich arbeite mit Windows Form u. da scheint es das nicht zu geben...

Ich glaube ich muss mich doch mal bei Zeiten in WPF einlesen, obwohl ich eigentlich mit xml so ein bisschen auf Kriegsfuss stehe 😜

Bestehende Projekte kann man nicht so einfach umsetzen, oder ?

Danke für den Input 👍

05.01.2017 - 13:09 Uhr

weil ich beim Treeview

  • nicht erst das expandieren / verbergen, und den Knotenpunkt programmieren muss
  • auch optisch der Treeview besser aussieht (zumindest bei meinen Tests...)

Weiterhin weiß ich im Moment auch gar nicht, ob mit deinem Vorschlag (eingebettete ListBox/ListView) so einfach Drag&Drop möglich wäre (habe ich noch nie gemacht ...) ?

Hättest Du ein Besipiel / Bild von deinem Vorschlag ?

P.S.:In dem Bild ist der Kunde die Gruppe und der Artikel das Item ...

MfG Christian

05.01.2017 - 10:12 Uhr

Hallo,

@Taipi88:
von Grundsatz her, erst einmal nichts.

Nur die Optik ist halt nicht so toll 🙁

Im Moment habe ich ObjectListView gefunden, das sieht doch deutlich ansprechender aus.

Was mir aber bei beiden Lösungen gar nicht gefällt, ist das man immer Columnheader hat, also kommt das ListView wohl so nicht in Frage X(

Ich werde es dann wohl mit einem Treeview versuchen.

wenn man das mit


[System.Runtime.InteropServices.DllImport("uxtheme.dll", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int SetWindowTheme(IntPtr hwnd, string pszSubAppName, string pszSubIdList);

public static void SetTreeViewTheme(IntPtr treeHandle)
{
     SetWindowTheme(treeHandle, "explorer", null);
 }

und im Form.Load() mit


SetTreeViewTheme(treeView1.Handle);

versieht, sieht das auch schon ganz ansprechend aus ...

Wäre halt nur schön gewesen wenn es das so von MS auch für alle geben würde ...

MfG Christian

04.01.2017 - 15:20 Uhr

Hallo zusammen,

irgendwie stehe ich gerade wohl auf der Leitung ...

Ich suche ein Control, welches im Prinzip so aufgebaut ist, wie das Toolbox-Control im Designer.

Ich muß Kunden (also die Gruppen) und deren dazugehörigen Artikel (also Elemente) dynamisch anzeigen können, zudem muß es auch noch Drag&Drop-fähig sein.

Dafür scheint mir ein solches Control ideal, zumal es ja auch noch eine Scrollbar enthält...

Ich weiss, das ich das auch mit einem ToolStrip und DropDown-Buttons machen könnte, das ist aber schon rein optisch nicht so schön ...

MfG Christian

19.08.2016 - 07:44 Uhr

Hallo T-Virus,

(Sorry für die späte Antwort ... Urlaub 😁 )

Natürlich ist das der Weg (also SqlLiteDB) aber meine Frage zielte ja auf das **wie ** des automatisierten Übertragens hin, nicht auf die Art der DB...

MfG ChrisProg

04.08.2016 - 16:24 Uhr

Hallo Tom,

da ich vor dem selben Problem stehe, wollte ich mal nachfragen, wie Du das jetzt gelöst hast ?

Für mich kommen eigentlich auch nur Verbindungen ohne Internet in Frage.

Zu Zeiten von Window Mobile gab es ja noch die Möglichkeit mit Hilfe vom WindowsMobileDeviceCenter und BalticSD.WindowsMobile.dll zu prüfen, ob ein MDE angeschlossen war, aber so etwas scheint es ja bei Windows Phone nicht mehr zu geben und unter Windows 10 lässt sich das WindowsMobileDeviceCenter ja auch nicht mehr installieren 🙄

Alles nur noch Online 😜

Das sieht zwar alles nach schöner neuer Welt aus (immer und überall Zugriff, etc.), aber die Firmenkunden wollen das nicht ("meine Daten bleiben hier im Haus")

MfG Christian

06.07.2016 - 16:41 Uhr

Danke für schnelle Hilfe und das Brainstorming ... 👍 👍

Christian

06.07.2016 - 15:29 Uhr

na hier in der Prozedur (im default-Zweig):

private static Exception GetDateTimeParseException(ref DateTimeResult result) {
            switch (result.failure) {
                case ParseFailureKind.ArgumentNull:
                    return new ArgumentNullException(result.failureArgumentName, Environment.GetResourceString(result.failureMessageID));
                case ParseFailureKind.Format:
                    return new FormatException(Environment.GetResourceString(result.failureMessageID));
                case ParseFailureKind.FormatWithParameter:
                    return new FormatException(Environment.GetResourceString(result.failureMessageID, result.failureMessageFormatArgument));
                case ParseFailureKind.FormatBadDateTimeCalendar:
                    return new FormatException(Environment.GetResourceString(result.failureMessageID, result.calendar));
                default:
                    Contract.Assert(false, "Unkown DateTimeParseFailure: " + result);
                    return null;

            }

Du hast völlig Recht, es funktioniert auch im Debugger, wenn ich die entsprechende Ausnahme deaktiviere...

Aber kann man das nicht hinbekommen trotz aktivierter Ausnahme ?

Denn die Frage die jetzt auftaucht, ist doch: ist das "sauberer Quellcode" oder etwas was man so eigentlich nicht machen sollte, denn damit habe ich doch jede Möglichkeit beendet, diesen Fehler (egal wo im Quellcode) mittels Debugger zu finden ...

Gedanklich denke ich an einen Befehl der nur innerhalb der Klasse wirksam ist ...

Unter FoxPro hatten wir diese Möglichkeit mit Hilfe von Set-Systembefehlen.

MfG Christian

06.07.2016 - 13:33 Uhr

wobei hier aber ja als default null zurückgegeben wird (und schon sind wir wieder am Anfang 🤔 )

Aber: irgendetwas übersehe ich hier (oder verstehe es nicht ...)

Ich habe mal deinen Quellcode übernommen und bekomme auch hier bei

return new IbanString(value.Replace(" ", ""));

eine Fehlermeldung > Fehlermeldung:

FormatException wurde nicht von Benutzercode behandelt

Liegt es vielleciht daran, das ich

Mask = "CCC CC CCC CCCCC";
CutCopyMaskFormat = MaskFormat.ExcludePromptAndLiterals;
TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;

vorbelegt habe ???

MfG Christian

06.07.2016 - 12:38 Uhr

Hallo LaTino,

funktioniert leider auch nicht, wenn ich

 throw new ArgumentException();

statt

return null;

schreibe, erhalte ich einen Fehler "ArgumentException wurde nicht vom Benutzercode behandelt. Der Wert liegt außerhalb des erwarteten Bereichs." - was ich dahingehend interpretiere, das die MaskedTextBox eine Exception nicht verarbeiten kann , richtig ?

MfG Christian

06.07.2016 - 11:09 Uhr

Hallo nochmals,

nachdem ich mir nun diese Klasse geschrieben habe

public class ohrmarke
    {
        string x_ohrmarke;

        public static ohrmarke Parse(string xx_input)
        {
            if (xx_input.Length < 13)
            {
                // validierung ungültig
                return null;
            }
            else
            {
                return new ohrmarke();
            }

        }
    }

und diesen Typ auch bei der MaskedTextBox als

ValidatinType = typeof(ohrmarke)

hinterlegt habe, hätte ich jetzt eigentlich erwartet, das beim return null das Ereignis TypeValidationCompleted nicht mehr ausgelöst wird - MaskedTextBox.TypeValidationCompleted - wird es aber dennoch und auch e.IsValidInput ist true ...

Was habe ich da denn jetzt wieder nicht verstanden ???

MfG Christian

06.07.2016 - 09:04 Uhr

So dank der beiden Ausführungen, habe ich das nun auch verstanden 🙂

Das mit der IBAN war eigentlich nur als Beispiel gedacht, in diesem (aktuellen) Fall handelt es um eine Ohrmarke (nur so am Rande...)

@LaTino:

"Habe ich nicht verstanden und deshalb ignoriert" - ja, nun, so wird das nicht 😉 genau deshalb habe ich ja dieses Thema eröffnet, um es zu verstehen - dafür ist doch das Forum auch da, oder nicht 🤔

MfG Christian

06.07.2016 - 08:25 Uhr

Ganz ehrlich: nein !

An diesem Punkt verstehe ich es nicht mehr ...

Ich habe den entsprechenden Passus zwar auch gelesen, aber ich verstehe nicht, was oder warum ich einen String "parsen" soll/muß - es bleibt doch ein String ?(

Er hat doch nur ein paar Leerstellen zur Formatierung hinzubekommen, aber es bleibt ein String.

Zu IBAN: natürlich weiß ich, das eine IBAN über die Prüfsumme definiert wird, aber ich weiß auch das sie in D immer 23 Stellen und international min 16 Stellen (Belgien) und max. 30 Stellen haben kann, das kann man ja auch schon vorher abprüfen.

MfG Christian

05.07.2016 - 16:32 Uhr

Hallo zusammen,

die Frage ist hier schon mehrfach aufgetaucht, aber doch nie beantwortet worden ...

Ausgangslage:

ein MaskedTextBox mit folgenden Vorgaben:

Mask = "CCC CC CCC CCCCC";
CutCopyMaskFormat = MaskFormat.ExcludePromptAndLiterals;
TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
ValidatingType = typeof(string);
PromptChar = ' ';

den ValidatingType "typeof(string)" habe ich hier genommen, damit die Methode TypeValidationCompleted überhaupt durchlaufen wird.

Nur: bei diesem ValidatingType ist e.IsValidInput immer true, ganz gleich ob es jetzt 16 Stellen oder nur drei sind, deshalb mus ich wohl lt. MS einen benutzedefinierten Datentyp erstellen.

Ich finde einige Beispiel wie ich verschieden Felder zu einer Gruppe zusammenfügen kann, aber nirgendwo einen Hinweis, wie ich es schaffe, einen in Länge definierten String (alles andere prüft die Mask ja schon ...) zu erstellen - wenn das überhaupt geht.

Das wäre mit Sicherheit ja auch für die Überprüfung einer IBAN hilfreich ...

Für Anregungen und Hilfe dankbar...

Christian

24.03.2016 - 11:50 Uhr

Ok, ich sehe schon ein, das ich mein "altes" Konzept überdenken muss ...

Irgendwelche konstruktiven Vorschläge (Ideen), was den versteckten Counter betrifft ???

MfG Christian

24.03.2016 - 07:49 Uhr

Mit dieser Herangehensweise habe ich doch nichts gewonnen ...

Ok, mit dem Installer könnte ich die Schlüssel anlegen, aber wenn ich den Counter hochsetzen will,
muß ich ja wieder schreibend zugreifen.

Würde ich das mit dem Counter außerhalb der Registry machen, dann könnte man ja wieder relativ leicht manipulieren.

Bei abschließenden der Lizensierung könnte man ja bewusst "als Admin" starten, um die Werte zu setzen, aber das Setzen des Counters muß unbemerkt passieren.

MfG Christian

23.03.2016 - 15:36 Uhr

Ich will (muß) beim Start des Programms überprüfen, ob dieses Programm schon mal auf diesem Rechner ausgeführt wurde...

Wenn nein, erstelle ich einen Schlüssel unter HKLM; wenn ja und noch nicht lizensiert, dann setzte ich einen Zähler hoch...

War bis jetzt kein Problem, da alle Kunden bisher mit Admin-Rechten einverstanden waren, nur jetzt habe ich einen, der das eben nicht will 🙁

Ich sehe gerade, das ich im falschen Thread gelandet bin ( X( ) - Asche auf mein Haupt ...

Das passiert, wenn man zu viele Tasks offen hat ...

Aber trotzdem bleibt die Frage nach dem warum .

@ für die Admin´s - warum erhalte ich keine E-Mail-Benachrichtigung mehr ???

MfG Christian

23.03.2016 - 14:59 Uhr

Hallo Abt,

leider funktioniert die E-Mail-Benachrichtigung nicht 🤔, sonst hätte ich eher geantwortet...

Definitiv verweise ich auf das Manifest - siehe Anhang...

Im Ausgabeverzeichnis erscheint dann nach dem Kompilieren eine <Progname>.vshost.manifest mit genau den Einstellungen, wie ich sie in der app.manifest vorgenommen habe ...

Btw. warum kann man nur eine Datei anhängen ???

MfG Christian

23.03.2016 - 08:57 Uhr

Hallo,

um diesen Thread noch einmal aufzugreifen...

Wenn ich, wie von Lars angeregt, eine Manifest-Datei entsprechend eingebunden und angepasst habe, wird beim Kompilieren trotzdem im Ausgabeverzeichnis eine Manifest-Datei generiert.

Aber lt. Projekteigenschaften soll sie doch eingebunden werden ???

Muß ich diese Manifest-Datei jetzt mit zum Kunden ausliefern, oder nicht ???
(das wäre ja fatal, da der Kunde sie dann ja ändern könnte ...)

MfG Christian

05.11.2015 - 16:30 Uhr

Danke für die Ideen,

hat wunderbar geklappt 👍

(man lernt doch nie aus ...)

MfG Christian

04.11.2015 - 15:02 Uhr

Also keine Chance ???

04.11.2015 - 12:20 Uhr

Hallo zusammen,

kann mir irgendjemand sagen, was ich falsch mache ?(

Ausgangssituation:

Ich habe eine Tabelle, in der unter anderem die IBAN eingetragen ist.

Nun möchte ich die Anzeige formatiert in dem DataGridView angezeigt bekommen (## ## #### #### #### #### ##) ,
aber alle Versuche das zu erreichen führen zu keinem Ergebnis 🤔

 
dataGridViewCellStyle2.Format = "#### #### #### #### #### ##";

oder

 
dataGridViewCellStyle2.Format = "CC99 9999 9999 9999 9999 99";

Stelle ich das Feld aber auf Int64 um (und entferne vorher das Länderkennzeichen), dann funktioniert es ???

Entweder bin ich zu doof zum Googeln oder aber es gibt keinen Hinweis das das Formtieren nur mit Datums- und Int-Feldern funktioniert ...

Für jedwede Hilfe / Denkanstöße dankbar ...

Christian

10.06.2015 - 08:03 Uhr

verwendetes Datenbanksystem: SQL-Server 2012

Ich steuere in einer Form mit Hilfe einer Navigationsleiste eine BindingSource an.

An diese BindingSource sind verschiedene Felder gebunden.

Alles funktioniert eigentlich wie es soll, inkl. Datensatzwechsel, neue Datensätze, etc... 😉

In der zu Grunde liegenden Tabelle gibt es aber einige Felder, die (bewusst) nicht auf der Form sichtbar sind, diese fülle ich bei Bedarf mit :

 ((DataRowView)(<Tabelle_BindingSource>.Current).Row[<feld>] = <wert>;

Auch gut...

Aber wenn ich einen neuen Datensatz (mit Hilfe der Navigationsleiste) erstelle, steht "Current" nicht auf dem neuen Datensatz, viel schlimmer noch, wenn ich mit dem o.g. Code das entsprechende Feld füllen will, springt die BindingSource in den neuen Datensatz (--> die Felder werden mit den Werten aus dem vorhandenen DS gefüllt) 8o

Wenn ich mir <Tabelle_BindingSource>.Current direkt nach der Neuerstellung (in bindingNavigatorAddNewItem_Click(object sender, EventArgs e)) anschaue, dann ist unter DataView zu sehen, das die BS eben nicht auf dem neuen DS steht, sondern immer noch auf dem "alten".

Laut MSDN sollte aber automatisch auf den neuen DS gewechselt werden 🤔

Was muß ich tun, um auch bei einem neuen DS das richtige Feld direkt zu füllen?

Ein <Tabelle_BindingSource>.EndEdit() brachte auch keine Besserung, da die BS ja auf einem falschen DS steht ...

MfG Christian

23.09.2014 - 10:09 Uhr

Hallo herbivore,

es sind noch Trennzeichen drin, also werde ich bis auf weiteres den Text abfragen 🙁

Weißt Du denn noch eine andere Möglichkeit der zu Grunde liegenden BindingSource "Null" zuzuweisen, außer direkt beim Binding an die MaskedTextBox ???

MfG ChrisProg

23.09.2014 - 09:44 Uhr

Hallo herbivore

siehe
>

eine Sache verstehe ich nach all meinen Tests jetzt aber nicht:
verwende ich Mask = "00/00/0000" dann ist MaskCompleted immer false außer wenn ein korrektes Datum eingeben wurde;
verwende ich Mask = "##/##/####" dann ist MaskCompleted immer true, egal, ob das Feld leer, das Datum gültig, ungültig oder unvollständig ist.

Somit ist diese Eigenschaft zur Überprüfung, ob das Feld leer ist überhaupt nicht zu gebrauchen X(
Lt. Fabian soll man ja

für so eine Abfrage bitte nicht die Maske direkt in der Abfrage verwenden

die Maske nicht direkt abfragen [also nicht so : (--> das funktioniert aber!)]


 private void datumsfelder_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
{
     if (!e.IsValidInput && ((System.Windows.Forms.Control)(sender)).Text.Replace(":", "").Replace(".", "").Trim() != "")
     {
         e.Cancel = true;
     }
}

Wie soll man es vor dem o.g. Hintergrund denn dann machen ???

MfG ChrisProg

22.09.2014 - 16:38 Uhr

Hallo zusammen,

ich habe den Fehler gefunden (liegt wie immer zwischen den Kopfhörnern 🙁 )

Ich bin einfach noch zu sehr durch FoxPro geprägt / verwöhnt X(

Die Bindingsource kann zwar Null-Werte aber ein leeres Feld wird halt nicht als Null interpretiert 😜

Man kann beim setzen der BindingSource festlegen was ein "Null-Value" ist:

x_control.DataBindings.Add(new System.Windows.Forms.Binding("Text", <bs>, <Feldname>, true, DataSourceUpdateMode.Never, "  .  .    "));

aber das ist ja nicht universell ...

Jetzt meine Frage dazu:
natürlich weiß ich welches Feld dahinter liegt, da ich aber die Prozedur als Klasse benutzen will - kann man über die Eigenschaften die BindingSource der entsprechenden MaskedTextBox herausfinden, oder ist es gar möglich "Null" an die BindingSource durchzugeben ???

MfG ChrisProg

22.09.2014 - 15:00 Uhr

TypeValidationEventAgrs

(Ich wollte alles per Link laden, aber bekam die Fehlermeldung das ich es so machen sollte ...)

22.09.2014 - 14:59 Uhr

MaskedTextBox.Eigenschaften 3

22.09.2014 - 14:58 Uhr

MaskedTextBox.Eigenschaften 2

22.09.2014 - 14:57 Uhr

Hallo Abt,

natürlich habe ich vorher (bevor ich diesen Threat erstellt habe) mit Hilfe des Debuggers die Werte überprüft ...

e.Cancel steht definitv auf false !!!

Auch ein zusätzliches Setzten "e.Cancel = false" hat an dem Verhalten nichts geändert...

Das ist ja gerade, was ich nicht verstehe: lt. Microsoft sollte nur bei e.Cancel = true der Focus auf der MaskedTextBox bleiben, aber er ist false !!!
Auch im nachfolgend ausgeführten Validating ist e.Cancel lt. Debugger false

MfG ChrisProg

22.09.2014 - 13:07 Uhr

Hallo herbivore,

irgendwie sehe ich anscheinend den Wald vor lauter Bäumen nicht ...

Unabhängig vom Code sollte das Feld doch bei e.Cancel = false den Focus verlieren, oder nicht ...

e.IsValidInput ist da zwar false, aber die Eigenschaft ist ja schreibgeschützt!

Und den Code muß ich doch im TypeValidationCompleted abfangen, es wird vor Validating ausgeführt.

Oder habe ich was an der Ablaufreihenfolge nicht verstanden?

MfG ChrisProg

22.09.2014 - 12:34 Uhr

Hallo herbivore,

es ist egal, ob ich
a) Mask = "00/00/0000" und die Abfrage nach MaskCompleted
oder
b) Mask = "##/##/####" und dei Abfrage nach MaskFull
mache, der Code funktioniert ja - die Schleife wird jeweils ohne die Überprüfung von

if (e.IsValidInput)...

korrekt durchgeführt.

Aber: trotzdem behält dieses Feld den Focus u. ich weiss nicht warum

lt. Microsoft

Wenn die Cancel-Eigenschaft im TypeValidationCompleted-Ereignishandler auf true festgelegt ist, wird das Ereignis abgebrochen, und das MaskedTextBox-Steuerelement behält den Fokus, bis ein nachfolgendes Validating-Ereignis seine Version der CancelEventArgs.Cancel-Eigenschaft auf false zurücksetzt.

e.Cancel ist definitiv auf false u. trotzdem bleibt der Focus 🤔

Irgendwie habe ich da was wohl nicht richtig verstanden, oder ???

MfG ChrisProg

22.09.2014 - 11:25 Uhr

Hallo herbivore,

ja, das hatte ich auch schon gefunden u. meinen Code entsprechend von


 if (((System.Windows.Forms.Control)(sender)).Text.Replace(":", "").Replace(".", "").Trim() != "")

in

if (((System.Windows.Forms.MaskedTextBox)(sender)).MaskCompleted)

angepasst...

Trotzdem bleibt der Focus auf dem Feld - ich kann es erst wieder verlassen, wenn ich ein gültiges Datum eingetragen habe ...

Dabei ist es egal, ob ich mit Tab , Pfeil oder Maus versuche das Feld zu verlassen .

Wie gesagt der Code springt (ganz so, wie er soll) aus der Prozedur heraus, aber der Focus bleibt 8o

MfG ChrisProg

22.09.2014 - 10:44 Uhr

Hallo zusammen,
ich habe eine MaskedTextBox mit folgenden (nicht-standard) Eigenschaften:
Mask = "00/00/0000"
TextMaskFormat = IncludeLiterals
PasswordChar = " "
PromptChar = " "

TypeValidationCompleted habe ich wie folgt belegt:

private void datumsfelder_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
        {
             if (((System.Windows.Forms.MaskedTextBox)(sender)).MaskCompleted)
            {
                if (e.IsValidInput)
                {
                }
                else
                {
                    e.Cancel = true;
                }
            }
        }

HIntergrund: ich möchte das beim Verlassen des Feldes das Datum auf Gültigkeit überprüft wird, wenn nicht, soll der Focus auf dem Feld bleiben; ist das Datumsfeld jedoch leer, so soll der Focus auch auf das nächste Feld gehen.
Aber genau das passiert nicht 🙄

Das gebundene Feld lässt aber NUll-Values zu ...

Was muß ich tun, damit die MaskedTextBox bei einem leeren Datum verlassen werden kann?

MfG ChrisProg

27.11.2013 - 15:18 Uhr

Hallo zusammen,

ich bin am verzweifeln.

Ich habe einiges gegoogelt u. auch ausprobiert, aber ich kriegs nicht hin.

VS 2010 / CR 13

Folgendes wil ich erreichen:

ich will Parameter an Crystal Reports übergeben den ich dann auch im Bericht anzeigen möchte:


report_doc.SetDataSource(<datatable>);
report_show.crystalReportViewer.ReportSource = report_doc;
report_doc.SetParameterValue("mandant", "1");
report_doc.SetParameterValue("mand_name", "1");
report_show.crystalReportViewer.RefreshReport();
report_show.Visible = true;
while (!report_show.crystalReportViewer.IsDisposed) System.Windows.Forms.Application.DoEvents();

soweit ist es auch kein Problem.
Die Parameter sind in Crystal Reports auch angelegt (ansonsten bekommt man ja diese freundlichen Fehlermeldungen) - siehe Anhang.

aber:

ich kann tun was ich will, ich erhalte beim Aufruf des Reports immer die Abfragemaske "Parameterwerte eingeben" 🤔

Was ich auch tue
crystal reports in c# / disable parameter prompt
How can I disable Parameter Prompt at run time in Crystal Report XI?
passing parameters in crystal report
Easiest way to pass parameters to Crystal Report from C#?
es kommt immer diese Abfrage 😜

auch dieser Code bracht keine Besserung:

  
ParameterDiscreteValue val = new ParameterDiscreteValue();
val.Value = xx_mandant;
ParameterValues paramVals = new ParameterValues();
paramVals.Add(val);
report_doc.ParameterFields["mandant"].CurrentValues = paramVals;
report_doc.DataDefinition.ParameterFields[0].ApplyCurrentValues(paramVals);

wie auch einige andere Anregungen wie z.B. eine Schleife durch alle Parameter mit erneutem setzen des Parameterwertes brachte nichts ...

Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr, oder ?

Wäre nett, wenn mir jemand helfen könnte.

MfG ChrisProg

19.11.2013 - 16:33 Uhr

Hallo Mary81,

hat es eigentlich iregndwelche Probleme mit den so erstellen SEPA_XML-Dateien gegeben ???

Hntergrund:
lt. Anlage 3 der Schnittstellenspezifikation für die Datenfernübertragung zwischen Kunde und Kreditinstitut gemäß DFÜ-Abkommen „Spezifikation der Datenformate“
Version 2.7 vom 25.3.2013

ist es

<?xml version="1.0" encoding="UTF-8"?> 
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.003.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.003.03 pain.001.003.03.xsd"> <CstmrCdtTrfInitn>

und auch ich schaffe "nur" den Namespace hinten:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02">

Ich habe zwar nichts gefunden, was die Reihenfolge im Root-Element zwischen Namespace und Attribute regelt, aber man kann ja nie wissen.

MfG ChrisProg

03.09.2013 - 23:16 Uhr

Hallo zusammen,

nun da ich das Problem lösen konnte, hier der Weg:

@MatthiasDietschweiler - nein, ich habe den Wert nicht überschrieben
@Spyke - Du hast mich auf die richtige Spur gebracht:

ich habe "OnCellLeaving" abboniert.
Dort konnte ich leider auch nicht auf FormattedValue zugreifen, aber indem ich den neuen Wert nicht in CurrentCell.Value
sondern in ((((DataGridViewElement)(CurrentCell)).DataGridView).EditingControl).Text geschrieben habe, hat VS alles andere im Hintergrund gemacht 8)

Wichtig ist dabei auch noch, die Zeile

CurrentCell.Value = dateValue.ToString();

aus "OnCellValidating" zu entfernen.

MfG ChrisProg

29.08.2013 - 16:57 Uhr

Hallo zusammen,

ich habe für ein DataGridView folgende Klasse geschrieben:

        protected override void OnCellValidating(DataGridViewCellValidatingEventArgs e)
        {
            ///<summary>
            /// Die folgende Prozedur überprüft, ob das Feld ein Datumsfeld ist,
            /// wenn ja und die Jahreszahl fehlt, dann wird diese automatisch hinzugefügt.
            /// Sollte das Datum in diesem Feld ungültig sein, wird das Verlassen des 
            /// Feldes verweigert und eine ToolTip mit einer entsprechenden Meldung
            /// und ein ErrorEvent für das Feld ausgegeben
            /// </summary>
            if (CurrentCell.Value != null)
            {
                if (CurrentCell.Value.GetType() == typeof(DateTime))
                {
                    string text = CurrentCell.EditedFormattedValue.ToString();
                    if (text.Length == 6 && text.Substring(5, 1) == ".")
                    {
                        text += DateTime.Now.Year.ToString();
                        //SelectionStart = Text.Length;
                        //SelectionLength = 1;
                    }
                    try
                    {
                        DateTime dateValue = DateTime.Parse(text.ToString().Trim());
                        CurrentCell.Value = dateValue.ToString();

                        if (CurrentCell.IsInEditMode)
                        {
                            (CurrentCell.DataGridView.DataSource as BindingSource).EndEdit();
                            CurrentCell.DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
                        }
                        
                        if (mit_ToolTip_bei_Fehler)
                        { ToolTip_uDGV.Hide(((System.Windows.Forms.DataGridView)(this))); }

                        CurrentCell.ErrorText = String.Empty;
                        e.Cancel = false;

                        base.OnCellValidating(e);
                    }
                    catch (Exception ex)
                    {
                        // ist das rote Ausrufungszeichen, das einen Datenfehler markiert
                        CurrentCell.ErrorText = text.Trim() + " ist kein gültiges Datum";

                        if (mit_ToolTip_bei_Fehler)
                        {
                            // Damit ToolTip.Show funktionieren kann, muß DataGridView.ShowCellToolTips auf false stehen
                            if (ShowCellToolTips) { ShowCellToolTips = false; }
                            // Position des Feldes ermitteln
                            var cellDisplayRect = GetCellDisplayRectangle(CurrentCell.ColumnIndex, CurrentCell.RowIndex, false);

                            ToolTip_uDGV.ToolTipTitle = "Datum nicht korrekt";
                            ToolTip_uDGV.Show(text.Trim() + " ist ungültig", this,
                                            cellDisplayRect.X + CurrentCell.Size.Width / 2,
                                            cellDisplayRect.Y + CurrentCell.Size.Height / 2, 1000);
                        }
                        e.Cancel = true;
                    }

                }
                else
                {
                    base.OnCellValidating(e);
                }
            }
        }

Das ganze funktioniert wunderbar, bis auf:
Nachdem CurrentCell.Value auf den neuen Wert gestetzt wurde, wird e.FormattedValue nicht upgedated 🙁

Beispiel: Ich verlasse die Zellel mit "02.05." dann wird "2013" an den Wert drangehängt.
CurrentCell.EditedFormattedValue ist korrekt, CurrentCell.FormattedValue auch, aber e.FormattedValue nicht (da steht weiterhin "02.05." drin)

Nun kann ich e.FormattedValue nicht direkt ändern, aber ich hätte erwartet, das mit


(CurrentCell.DataGridView.DataSource as BindingSource).EndEdit();
CurrentCell.DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);

oder


                            DateTime x_datum = DateTime.Parse(CurrentCell.Value.ToString());
                            CurrentCell.Value = DateTime.MinValue.ToShortDateString();
                            CurrentCell.Value = x_datum;

das ganze wieder "gerade rücken" könnte.
Aber leider nicht 😜

Weiss irgendjemand, wie man das lösen kann ?
Wie gesagt, es ist eine Klasse und die übergibt im Erfolgsfall an base.OnCellValidating(e) - u. da wird des öfteren nach e.FormattedValue gefragt ( wenn !IsCellDirty).
MfG ChrisProg

06.06.2013 - 16:06 Uhr

Hallo FZelle,

X( wie war das doch gleich mit dem Wald u. den Bäumen ??? :evil:

Danke, für den Tip, das war´s.

MfG ChrisProg

06.06.2013 - 13:13 Uhr

Hallo zusammen,

@ Witte,

nein, es sind keine verschiedenen Datenbanken u. ich mache die Tests auch von der selben Maschine aus.

Zum String: wie Du schon richtig bemerkt hast, grenzen im Moment nicht alle Bedingungen ein,
das wird sich aber im Echtbetrieb durch Usereingaben ändern;
für den Test reichs mir, wenn sie da sind.

@f_igy,

Ich hab das mit dem Management Studio 10 gerade überprüft:

  • nein er zeigt mir sofort nach den 5 Sekunden die Daten an, auch das scrollen geht verzugsfrei, ebenso Pageup, Pagedown oder ziehen mit der Maus.

Der SQL-Code ist selbstgestrickt, da ich es irgendwie nicht hinbekomme im Designer mehrer DB´s einzubeziehen - hab mich aber auch nicht intensiv drum gekümmert, um ehrlich zu sein.

@MorhieX u. HiGHteK,

leider dauert es auch so lange (gefühlt vielleicht ein bisschen schneller - ich hab gerade kein Tiimerprogramm) wenn ich die kompilierte Exe starte. Ich weiss allerdings (noch) nicht,
wie es auf einer Maschine ohne Entwicklungsumgebung ist.

MfG ChrisProg

06.06.2013 - 07:50 Uhr

Hallo Abt,

ich habe vergessen zu erwähnen, das ich auch bei C# die reine Ladezeit meine.
Ich habe mir entsprechende Haltepunkte (da_ar.Fill(cKartei);) erstellt und mit F11 gesteppt, so kamen die Zeiten zu stande.

Die Zeit für den Backgroundworker sind aber nicht so genau.

Also habe ich doch auch hier die reine Query-Zeit, oder?

Ich sehe da nicht, wo ich Äpfel mit Birnen vergleiche.

MfG ChrisProg