Laden...

Forenbeiträge von ChrisProg Ingesamt 174 Beiträge

24.06.2021 - 16:46 Uhr

Wenn Du gewisse Systemrechte benötigst, dann kannst Du das dem Betriebssystem beim Start der Applikation mitteilen, sodass diese Informationen direkt zur Verfügung stehen.

@Abt: hast Du dafür irgendwelche Quellen / Seiten auf denen ich mich schlau machen kann ?

MfG Christian

17.06.2021 - 15:53 Uhr

(...)
Das ist in meinen Augen dann einfach nur ein (selbstverschuldeter, oder durchaus auch unternehmerische) Fehler des Zeitmanagements.
Ich seh zB. so viele Teams, dessen Verantwortliche 120% der Zeit der Entwickler mit Inhalte vollballern.
Die Entwickler haben also nie ne Chance sich zeitlich weiterzubilden oder sich um grundlegende Dinge zu kümmern: da hat der Entwickler keine Schuld, das ist ein klassischer Unternehmensfehler.

Dem habe ich nichts hinzuzufügen ... 😎 - muß aber damit leben (wie so viele andere auch ...)

MfG Christian

17.06.2021 - 15:25 Uhr

Im Endeffekt ist es nur die Trennung von Authentifizierung und Authorisierung; das ist die Basis jedes Berechtigungssystem, was wirklich jeder Entwickler im Griff haben muss (meine Meinung!). Wenn ein Entwickler nicht weiß, was Authentifizierung und Authorisierung sind und worin sie sich unterscheiden, dann fehlt extrem viel Basis für jede Sicherheit, jede Architektur und jeder realen Betriebsumgebung.

Entschuldige @Abt: aber das ist mir zu Pauschal...

Ich gehöre zu der älteren Generation (1965) , die das objektorientierte Programmieren mehr oder weniger rudimentär gelernt haben.
Wir (ich) habe(n) schon mitbekommen, das sich seit Vista grundsätzlich etwas geändert hat (und auch die Gründe) ...

Nur hatten wir den Nachteil, das wir nicht, so wie die jüngere Generation, in der Uni etwas darüber lernen konnten.
Und Du als MVP hast sicherlich noch mehr Hintergrund Wissen als der gemeine Programmierer, richtig ?

Ich habe leider nicht die Möglichkeit noch einmal die Schulbank zu drücken (obwohl das sicherlich seinen Reiz hätte...) - ich muß meine Brötchen verdienen ... 😉

MfG Christian

17.06.2021 - 09:33 Uhr

Hallo @inflames2k:

Danke für deine schnelle Antwort ...

Das werde ich wohl nie begreifen, warum ein Admin nicht alles auf einem Rechner sehen kann - zumal er es mit dem Windows-Explorer offensichtlich kann 😢

Bei Outlook kann ich es ja noch verstehen (Spammer-Programme) aber beim OFD schon nicht mehr ...

MfG Christian

17.06.2021 - 08:45 Uhr

Hallo zusammen,

Vorweg, ich weiß nicht, ob das hier her gehört, aber ich fand das hier am passendsten ...

Ich habe beim Kunden folgendes Problem:

der OpenFileDialog zeigt nicht alle Laufwerke an (siehe angehängtes Bild - links ist der OFD, rechts der Windows-Explorer) ?

Gibt es beim OFD irgendeine Einstellung die ich übersehen habe ?

Das Programm wird mit Admin-Rechten gestartet, daran sollte es also nicht liegen, oder?

Ob das Laufwerk mit User-Rechten angelegt oder vom Admin eingebunden wurde, kann ich nicht sagen ...

MfG Christian

04.06.2021 - 11:35 Uhr

Hallo,

danke für die Tips ...

Zur EWS-Schnittstelle:

irgendwie begreife ich nicht, was AutodiscoverUrl jetzt wirklich für einen Wert von mir erwartet ?
(bei Google hab ich schon alles gesehen von Web-Adressen, Email-Adressen, UserName, etc... wobei das wahrscheinlich mit den verschieden Exchange-Servertypen (Netzwerk, Internet) zusammen hängt)

Ich will auf einen lokalen (in Netzwerk) Exchange-Server zugreifen , also ...


//Initialize Service
ExchangeService service = new ExchangeService();
//Use Integrated Authentification
service.UseDefaultCredentials = true;

und dann muss ich anscheinend den Zugriff benennen:


//Autodiscover Settings
service.AutodiscoverUrl(xxxx, RedirectionUrlValidationCallback);

Was kommt da jetzt rein ?

nehme ich meine E-Mail-Adresse läufts auf einen Fehler... > Fehlermeldung:

the autodiscover service couldn´t be located.

Was wohl bedeutet, das dieser Dienst nicht installiert / freigeschaltet ist (also mit der IT reden ...)

Wobei ich auch irgendwie nicht verstehe, warum ich das brauche / dort was eintragen muss, denn ich will ja mit


service.UseDefaultCredentials = true;

die gespeicherten Anmeldedaten benutzen ...

Ich will ja nicht für jeden Rechner, auf dem dieses Programm ausgeführt wird, die Userdaten / E-Mail-Adressen / Passworte fest hinterlegen.
Gibt es keine Möglichkeit über das Intranet sich einfach "nur" einzuloggen ? Der User hat ja schon durch seine Anmeldung das Recht auf Exchange zuzugreifen, sonst würde Outlook ja nicht arbeiten, oder ?

Kann da jemand mal bitte Licht ins Dunkel bringen ?

MfG Christian

03.06.2021 - 12:27 Uhr

Hallo zusammen,

ich erstelle per Microsoft.Office.Interop.Outlook E-Mails (soweit ja kein Problem...)


public void send()
{
try
{
    if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Count() > 0)
    {
        try
        {
            lo_OutApp = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
        }
        catch (COMException ex) { Fehlermeldung.ErrorMessage(ex); }
    }
    else
    {
        try
        {
            lo_OutApp = new Microsoft.Office.Interop.Outlook.Application();
        }
        catch (COMException ex)  {  Fehlermeldung.ErrorMessage(ex); }
    }
    if (lo_OutApp != null)
    {
          lo_NSpace = lo_OutApp.GetNamespace("MAPI");
         (usw)...
    }
}
catch (Exception ex) {Fehlermeldung.ErrorMessage(ex); }
}

beim Massenversand habe ich nun feststellen müssen , das der Aufruf


lo_OutApp = new Microsoft.Office.Interop.Outlook.Application();

recht lange dauert (gefühlt fast zwei Sekunden) ...

Also habe ich folgendes versucht, um das etwas zu beschleunigen ...


public class sendmail
{
        #region Outlook
        Microsoft.Office.Interop.Outlook.Application lo_OutApp = null;
        Microsoft.Office.Interop.Outlook.NameSpace lo_NSpace = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder lo_Folder = null;


        public Boolean Outlook_starten()
        {
            Boolean x_retwert = true;
            if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Count() > 0)
            {
                try
                {
                    lo_OutApp = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
                }
                catch (COMException ex) { x_retwert = false; }
            }
            else
            {
                try
                {
                    lo_OutApp = new Microsoft.Office.Interop.Outlook.Application();
                }
                catch (COMException ex) { x_retwert = false; }
            }
            return x_retwert;
        }

         public void send()
        {
            if (lo_OutApp != null)
           {
                lo_NSpace = lo_OutApp.GetNamespace("MAPI");
                (usw)...
            }
        }
}
public void xyz()
{
    sendmail x_sendmail = new sendmail();
     if (x_sendmail.Outlook_starten())
     {
          foreach()
         {
               ...
               x_sendmail.send();
               ...
          }
     }
}

Das funktioniert bei der ersten E-Mail einwandfrei, bei der zweiten knallt es dann beim Aufruf von


lo_NSpace = lo_OutApp.GetNamespace("MAPI");

mit folgender Fehlermeldung: > Fehlermeldung:

********** Fehlermeldung vom : 03.06.2021 10:22:20 **************************************************
Meldung: Der RPC-Server ist nicht verfügbar. (Ausnahme von HRESULT: 0x800706BA)
bei Microsoft.Office.Interop.Outlook.ApplicationClass.GetNamespace(String Type)
****************************************************************************************************

Google zählt verschieden Dinge auf, die aber irgendwie nichts mit Outlook zu tun haben...

geht so etwas nicht, oder was übersehe ich ?

Ich weiß, das ich das vermutlich auch mit EWS lösen könnte, aber da der Kunde wünscht, das (zu Kontollzwecken) die Mails nicht sofort raus gehen, muss die Möglichkeit des Offline-Betriebes möglich sein - u. da weiß ich nicht, ob das mit EWS möglich ist (wenn ich das richtig verstanden habe, dann übergeht EWS ja Outlook, richtig?)...

MfG Christian

09.04.2021 - 08:51 Uhr

(...)Wenn du jetzt aber sagst du hast 30 Parameter, dann vermute ich, dass diese wohl einen großen Einfluss auf den eigentlichen Ablauf des Querys haben.
Z.B. könnte ich mir vorstellen das aus einer TabelleA nur 1 Datensatz benötigt wird und bei einem neuen Lauf mit geänderten Parameter benötigt man vielleicht 10.000 Datensätze.

genau so ist es - die Parameter sind vereinfacht gesagt von/bis-Eingrenzungen

(...)Mein Tipp ist, wenn das Query schnell genug ist und es wird mit OPTION (RECOMPILE) behoben, dann lass es so. (...)

Ich werde es mal testeten u. berichten ...

(...)Wenn nicht, dann solltest du dir Gedanken machen wie du das große Query in kleinere unterteilen kannst.
Oder vielleicht mal die ganze Architektur überdenken, weil vernünftig hört sich das mit 30 Parameter nicht an 😉(...)

Ich habe (bis jetzt) die Erfahrung gemacht, das es immer noch schneller ist, ein großes SQL-Script zu benutzen, als die Daten unter c# zu verarbeiten / zusammen zu führen..
(was sich dann jetzt wohl durch den Speicherhunger von DataTables teilweise erklärt...)

(...)Wegen Skripte für Performance Fragen empfehle ich meinen Kunden immer die Skriptsammlung von Brent Ozar.
Für dich wäre z.B.
>
interessant.

Danke (werde ich mir mal in einer ruhigen Minute zu Gemüte führen)...

MfG Christian

08.04.2021 - 13:14 Uhr

(...)
Ob das schneller ist weiß ich nicht. Aber man kann dem Anwender eine Progressbar anzeigen und einen Abbruch Button zur Verfügung stellen.

Bei mir hat alles was länger als 2 Sekunden dauert eine Progressbar.

Auch ein guter Einwand ... 👍

(...)
Außerdem prüfe ich den Hauptspeicherbedarf. Wenn ein Anwender versucht eine Liste mit 100 Millionen Datensätzen anzuzeigen kommt eine entsprechende Fehlermeldung.

Wie kannst Du das denn, wenn doch der Reader strikt vorwarding ist, du also noch gar nicht weißt, wie viele Daten kommen werden?

MfG Christian

08.04.2021 - 12:55 Uhr

Das hört sich eher nach einem Problem mit Parameter Sniffing an.
Probier doch mal OPTION (RECOMPILE) -
>

Wirst ja hoffentlich nicht ständig den SQL Server neustarten wollen ...

Schönen Gruß
Tom

Hi,

tatsächlich will ich das natürlich nicht ...

Danke für den Tip /Link 👍 - wieder was dazu gelernt ...

Wenn ich das richtig verstanden habe, dann löscht "RECOMPILE" den Batch aus den SQL-Server-Speichern, so das beim nächsten Aufruf es wieder frisch eingelesen und verarbeitet werden kann ...
Das ist natürlich für eine dauerhafte Programmierung kontraproduktiv (damit wäre ja der Geschwindigkeitsvorteil dahin...)

Weißt Du in welcher sys-Tabelle solche Batches gespeichert werden ? (in der sys.objects augenscheinlich nicht) - dann könnte man ja dort gezielt ein "sp_refreshview" durchführen 7 oder den Eintrag löschen ...

MfG Christian

08.04.2021 - 11:00 Uhr

(...) Die Parameter haben noch den Vorteil dass der SQL Server jedes Kommando nur einmal übersetzen muss wenn sich nur die Parameter ändern.

Das war auch meine bisherige Info und Intention ...

Lieber DataReader und selber durchgehen.

Was meinst Du genau,


 using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
      cBestaende.Load(x_reader);
}

ist doch auch ok oder ist


using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
     while (x_reader.Read())
     {
            /// werte ermitteln und in DataTable einfügen 
     }
}

trotz der Schleife noch schneller ???

MfG Christian

08.04.2021 - 07:58 Uhr

Hallo,

um das ganze aufzulösen: es lag(warum auch immer) am SQL-Server beim Kunden ...

Nach einem Neustart funktionierte alles wieder.

Ich danke allen für die Inputs (ich werde zukünftig auf die DataAdapter verzichten...) 😃

Zum Verständnis meinerseits:

Was passiert eigentlich genau (physikalisch) wenn ich einen SqlCommand ausführe?
Übergibt er den Command wirklich als Batch-File an den SQL-Server, so das dieser die eigentliche Verarbeitung durchführt u. (in meinem Fall) die Ergebnistabelle zurück liefert oder macht das der Command alles selber ?

MfG Christian

07.04.2021 - 15:01 Uhr

Was wird denn nun genommen / gemacht ? Kannst Du mir da ein paar Links / Stichworte nennen ?
(Irgendwie scheine ich wohl mit meinem Wissen stehen geblieben zu sein ...)

Ich vermute mal ganz stark, das es dabei auch auf den verwendeten Berichtsdesigner ankommt, richtig?

MfG Christian

07.04.2021 - 14:31 Uhr

Hi Bernd,

ich brauche leider schon die DataTable ...

Die Daten, die ich bekomme muss ich teilweise editieren (Daten die so nicht im SQL vorhanden sind...), anschließend gehen Sie in einen Report ...

MfG Christian

07.04.2021 - 12:41 Uhr

So, habe es jetzt mal auf


using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
     cBestaende.Load(x_reader);
}

umgestellt, leider mit dem gleichen Ergebnis 🤢

Also werde ich mich jetzt wohl der Frage von Stefan.Haegele näher befassen ...

MfG Christian

07.04.2021 - 12:02 Uhr

Hast du mal geprüft welcher SQL Befehl beim SQL-Server ankommt? Ich vermute hier einen/mehrere Parameter welche hier Probleme verursachen.

Blöde Frage: wie kann man das denn ?

(...) Warum willst Du überhaupt SqlDataAdapter nutzen, wenn Du schon ein fertiges Script hast und das auch direkt ausführen kannst?

Das ist doch DER Weg (so lese ich das jedenfalls im Netz), um ein Ergebnis direkt in eine DataTable zu bekommen; ok. man könnte einen DataReader nehmen u. durch alle Rows iterieren und "von Hand" in eine DataTable eintragen, aber das wäre sicherlich auch nicht schneller, oder ?

Was passiert wenn Du exakt den gleichen SQL Befehl im Code ausführst wie der aus dem Management Studio ?

Der im Management Studio ausgeführte Code ist der aus dem SQL-Command herauskopierte Code ...

Was passiert wenn Du einen DataReader benutzt ?

werde ich mal probieren (u. berichten) ...

MfG Christian

07.04.2021 - 11:10 Uhr

Verwendetes Datenbanksystem: SQL-Server 13.0.5882.1

Hallo zusammen,

folgendes Problem habe ich auf einem Kunden-System (und nur dort!) :

Ich habe ein 400-zeiliges SQL-Script mit 30 Parametern, welches Daten aus einer WaWi sammelt.
Dieses Script habe ich als Text hinterlegt und lese ihn in ein entsprechenden SQL-Command ein.

Die Parameter werden alle mit ihrem korrekten Datentyp und IsNullable = true erstellt.

Rufe ich nun einen entsprechenden DataAdapter auf


 using (SqlDataAdapter da_su = new SqlDataAdapter(x_ermittle_verpackungen_kunde))
{
    da_su.Fill(cBestaende);
}

dann laufe ich jedesmal auf ein Timeout

"Das Ausführungstimeout ist abgelaufen. Der Timeoutzeitraum wurde überschritten, bevor der Vorgang beendet wurde, oder der Server antwortet nicht. ..."

Der Fehler verweist auf die Zeile "da_su.Fill(cBestaende)" ...

Den (das?) Timeout habe ich dabei schon auf 180 sek hoch gesetzt ...

Nun zu dem eigentlichen Problem:
Rufe ich das Script im Management Studio auf (mit über declare erstellte u. mit set entsprechend gefüllte Parameter) so funktioniert es einwandfrei und braucht nicht einmal zwei Sekunden ...

Auf meinem Entwicklungssystem habe ich keine Probleme ...

Kennt jemand ein solches Phänomen oder kann mir Tips nennen, wie man noch an das Problem heran kommen kann ?

MfG Christian

06.01.2021 - 09:42 Uhr

Hallo Ralph,

danke für deine Erklärung, aber:

SelectNextControl soll doch das nächste Control in der Tab-Reihenfolge aktivieren ...

Und wenn ich das ganze mit der Tab-Taste durchspiele, dann funktioniert es ja wie gedacht ... 🤔

Mittlerweile habe ich aber das Problem lokalisieren und lösen können:

Das Grundproblem ist das gem. https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.canselect?view=netcore-3.1
Controls die Children von

  • Panel
  • GroupBox
  • PictureBox
  • ProgressBar
  • Splitter
  • Label
  • LinkLabel
    sind, nicht per Focus() oder Select() den Fokus erhalten können ...

Da der SplitContainer Panel enthält ... 😜

Aber: mit einem Invoke (mit Delay) funktioniert es dann ...

In Code gepackt sieht es dann so aus :


        public void ControlSetFocus(Control x_control)
        {
            if (x_control.CanSelect)
            { x_control.Select(); }
            else
            {
                // lt. https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.canselect?view=netcore-3.1 
                // können Controls die Childen von 
                //      - Panel 
                //      - GroupBox
                //      - PictureBox
                //      - ProgressBar
                //      - Splitter
                //      - Label
                //      - LinkLabel 
                // sind, nicht per Focus() oder Select() den Fokus bekommen, Invoke (mit dem Delay!) geht aber ...
                System.Threading.Tasks.Task.Delay(100).ContinueWith(_ =>
                {
                    Invoke(new Action(() => { x_control.Select(); }));
                });
            }
        }

MfG Christian

20.12.2020 - 22:55 Uhr

Hallo,

irgendwie stehe ich auf dem Schlauch...

Folgender Aufbau:

  • TabControl mit mehrerern Reitern
  • in einem Reiter befinden sich zwei ineinander verschachtelte SplitContainer
  • in dem inneren SplitContainer ist ein (User)DataGridView

die SplitContainer sind auf TabStop = false gesetzt, das DataGridView auf TabStop = true...

folgendes Ereignis habe ich abonniert:

 
        private void Pageframe_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!start && ((TabControl)sender).SelectedTab.Name.Trim() == "tabPage_positionen")
            {
                int x_current_row = userDGV_positionen.CurrentCell.RowIndex;
                userDGV_positionen.CurrentCell = userDGV_positionen["artikel_nr", x_current_row];
                ActiveControl = userDGV_positionen;
                ActiveControl.SelectNextControl(ActiveControl, true, true, true, true);

            }
        }

Was ich auch probiere ActiveControl ist und bleibt immer der oberste SplitContainer ...

Führe ich

 ActiveControl.SelectNextControl(ActiveControl, true, true, true, true);

im Direktfenster aus, erhalte ich immer false zurück

Weiß jemand Rat ?

MfG Christian

03.08.2020 - 12:37 Uhr

ist ein Argument ...

also muß ich wohl damit leben ... 🙁

MfG ChrisProg

03.08.2020 - 12:02 Uhr

@T-Virus:

ich habe die Doku zum CellContentClick gelesen, dort steht:

Dieses Ereignis tritt auf, wenn auf den Zellen Inhalt geklickt wird. Sie tritt auch auf, wenn der Benutzer die LEERTASTE drückt und freigibt, während eine Schaltflächen Zelle oder eine Kontrollkästchen Zelle den Fokus besitzt, und für diese Zelltypen zweimal auftritt, wenn auf den Zellen Inhalt beim Drücken der Leertaste geklickt wird.

Wie gesagt, der Sinn erschließt sich mir nicht ...

das KeyDown, war mein Versuch die Leertaste vorher abzufangen - hat aber leider nicht funktioniert ...

MfG ChrisProg

03.08.2020 - 09:36 Uhr

Auch wenn das schon recht lange her ist, aber mein Problem hat damit zu tun:

Die vorgestellte Methode hat leider den Nachteil, das sie auch auf das Drücken der Leertaste reagiert 🤔 (mir fehlt das Verständnis für den Sinn dahinter gänzlich ...)

Wie kann ich verhindern, das auf die Leertaste reagiert wird ?

private void DGV_KeyDown(object sender, KeyEventArgs e)
{
     if (e.KeyCode == Keys.Space) { e.Handled = true;  }
}

Hilft leider auch nicht ...

MfG ChrisProg

25.06.2020 - 08:13 Uhr

Hallo @Abt,

Danke !

Nur zum Verständnis:
Wenn ich deinem Bespiel folge, dann kann (sollte) ich ja im Prinzip alles was ich Auslöse mit async / await machen, oder würdest Du das auch machen, wenn tatsächlich "nur" visible gesetzt würde und das "füllen" an anderer Stelle passiert (und dann das "füllen" mit async /await machen)?

Macht dieses Vorgehen dann den BgWorker nicht gänzlich überflüssig?

Zu meinem tatsächlichen Problem:
Ist das denn für Dich nachvollziehbar, das ich zusätzlich zum Spring auch das Autosize auf true gesetzt haben muss, oder ist das tatsächlich ein Bug?

P.S.: kann man hier irgendwie einen Beitrag als gelöst / erledigt markieren ?

MfG ChrisProg

24.06.2020 - 16:32 Uhr

@Abt:
ich bin weiß Gott nicht allwissend und weit davon entfernt perfekt zu sein, aber die Antwort finde ich doch etwas herablassend ...

Wenn Du es weißt, wäre es dann nicht besser, andere an deinem Wissen teil haben zu lassen ?

Mittlerweile weiß ich, was passiert (Bug?):

der StatusStrip steht auf AllowMerge = true, in ihm sind zwei Objekte enthalten:

  • ein StatusStripText welches Spring = true und AutoSize = false eingestellt ist
  • eine ProgressBar welche auf Visible = false ist

Wenn ich nun die Form starte und die Größe(Breite) ändere, dann passt sich der StatusStripText entsprechend an (wie erwartet).

Gem Microsoft Docs bedeutet Spring:

Eigenschaftswert
Boolean
true, wenn ToolStripStatusLabel beim Ändern der Größe des Formulars automatisch den verfügbaren Leerraum von StatusStrip füllt; andernfalls false. Der Standardwert lautet false.

Nach meinem Verständnis würde das bedeuten, das wenn ein anderes Objekt hinzukommt, der verfügbare Leerraum kleiner wird u. dementsprechend auch der StatusStripText kleiner werden müsste - dem ist aber nicht so !

Wenn man nun, nachdem man die ProgressBar programmatisch auf Visible = true gesetzt hat, die Form langsam (so das der Rechner das noch zeichnen kann) in der Breite verändert, passiert immer noch nichts - wenn man das aber ruckartig macht, erscheint plötzlich die ProgressBar ...

Die Eigenschaft AutoSize des StatusStripTextes ist der entscheindende Wert - ich hatte ihn auf false gestellt, da ich glaubte, das das zusammen mit Spring nicht sauber funktionieren würde (doppelt gemoppelt)...

Aber: wenn ich AutoSize auf true stelle, dann funktioniert es sofort - ist für mich nicht wirklich nachvollziehbar, aber es ist so ...

Du siehst: es hatte wirklich nichts mit Threading zu tun ...

Ich wehre mich bestimmt nicht gegen Hilfe und bin dafür auch dankbar (so bin ich auch dankbar für den Hinweis auf asynchrone Programmierung, die bisher noch nicht auf meinem Radar war (in VFP gänzlich unbekannt...) - aber ich werde mich da mal einlesen...)

MfG ChrisProg

24.06.2020 - 13:03 Uhr

@Th69:
Ich hab mal ein System.Threading.Thread.Sleep(15000); eingebaut um das zu testen - Ja, die Form ist aktiv (lässt sich verschieben) und bedienbar (Klick auf Abbrechen-Button wird ausgeführt) ...

Das mit ProgressChanged kann hier doch noch gar nicht greifen, ich will doch erst einmal die ProgressBar sichtbar machen...

"Außerdem kann man die gesamte Funktionalität besser mit asynchroner Programmierung umsetzen." - dabei könnte ich aber dem User nicht zeigen, wie weit die Datei ist (außer ich würde für jede Datei eine ProgressBar erstellen) ...

Und, ich sehe im massenhaften parallelen Upload ein Performance-Problem (alleine schon durch die Bandbreite ...)

@Abt:
Es liegt nicht am BGWorker - wenn ich


SetProgressBar(true);

aus der Form direkt aufrufe, dann durchläuft er die "else"-Schleife , steht wieder die Eigenschaft richtig, aber es wird nicht angezeigt ...

Ich werde halt damit leben müssen, das ich die ProgressBar in der Entwicklung auf visible=true und dann direkt beim Aufruf wieder auf visible = false setzten muß - nur verstehen tue ich das nicht ...

MfG ChrisProg

24.06.2020 - 11:43 Uhr

Das war auch zuerst meine Vermutung, deshalb habe ich mir den Artikel durchgelesen - aber: die Aktionen sind keinesfalls "langlaufend".

Dagegen spricht auch, das alles funktioniert, wenn man die ProgressBar beim Initialize schon auf Visible = true hat (und dann direkt wieder auf Visible = false setzt) ...

Und ja, da die eigentliche Codeausführung (Upload von Dateien) länger dauern kann, wird das ganze aus einem BgWorker heraus (gleich zu Beginn) aufgerufen ...

Die ProgressBar soll dabei den Fortschritt anzeigen.

MfG ChrisPorg

24.06.2020 - 10:30 Uhr

Nochmal: das ist nicht mein Problem ! er geht in keine Exception !!!

Im Anhang des Screenshots im Debug-Modus (vor dem setzen):
(eingefühte IMGs werden leider nicht akzeptiert...)

er führt die Befehle aus, die Progressbar wird aber trotzdem nicht sichtbar ...

Was ich aber vergessen habe zu erwähnen:
Der StatusStrip sitzt auf einer vererbten Form, auch der hier gezeigte Quellcode ist in der vererbten Form, der Aufruf erfolgt in der "Unterform" mit

SetProgressBar(true);

Was aber meiner Meinung nach kein Problem darstellen sollte, oder ?

Es funktionert nur, wenn ich die ProgressBar in der Entwicklungsumgebung auf Visible = true setzte !
Dann muss ich es aber im im Form-Aufruf nach InitializeComponent() wieder auf

toolStripProgressBar.Visible = false;

setzen, was ich aber eigentlich nicht will (--> mögliches "flackern"...)

MfG ChrisProg

24.06.2020 - 09:09 Uhr

Das ist mir schon klar u. soll auch so sein...

Es geht hier ja "nur" um eine Anzeige für den User (also nichts wichtiges) - wenn es, warum auch immer, hier zu einem Fehler kommen sollte, dann soll dadurch nicht das Programm behindert werden ...

MfG ChrisProg

24.06.2020 - 08:55 Uhr

Hallo Abt,

das ist es nicht, denn wie ich schrieb "Wenn ich durch steppe, so sehe ich das die Eigenschaft zwar auf Visible = true gesetzt wurde, aber es passiert nichts ..." - er geht nicht in eine Exception...

"weil das try/catch so einfach sinnlos und quatsch ist" - meinst Du das generell, oder für diesen Fall ?

Wenn generell, bitte erklären ...
(wenn in diesem Fall, hast Du wohl recht, das ist noch übrig geblieben vom Start-Code - aber schaden tuts ja auch nicht, oder?)

MfG ChrisProg

23.06.2020 - 15:08 Uhr

Hallo,

folgendes Problem:

Ich habe eine Form mit einem StatusStrip, auf dem ein TollStripStatusLabel und eine TollStripProgressBar sind.

Die ProgressBar ist folgendermaßen voreingestellt:


            this.toolStripProgressBar.Name = "toolStripProgressBar";
            this.toolStripProgressBar.Size = new System.Drawing.Size(40, 16);
            this.toolStripProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
            this.toolStripProgressBar.Visible = false;

(Maximum steht auf 100 / Minimum auf 0 ...)

Die ProgressBar soll nur bei Bedarf aufgerufen werden.

Um dies zu realisieren habe ich eine Methode geschrieben die je nach Bedarf einen invoke durchführt oder aber direkt mit der ProgressBar "spricht"

        
        public void SetProgressBar(Boolean xx_aktiv = false)
        {
            try
            {
                if (this.statusStrip1.InvokeRequired)
                {
                    this.statusStrip1.Invoke(new MethodInvoker(() => this.toolStripProgressBar.Visible = xx_aktiv));
                    this.statusStrip1.Invoke(new MethodInvoker(() => this.statusStrip1.Refresh()));
                }
                else
                {
                    this.toolStripProgressBar.Visible = xx_aktiv;
                    this.statusStrip1.Refresh();
                }
            }
            catch (Exception ex) { }
        }


Nun zu meinem Problem:
die ProgressBar wird nicht sichtbar 🤔 - egal, ob ich das direkt oder in einem BgWorker mache.

Wenn ich durch steppe, so sehe ich das die Eigenschaft zwar auf Visible = true gesetzt wurde, aber es passiert nichts ...

Wenn ich aber die Eigenschaft Visible in den Form-Eigenschaften auf true stelle, dann sehe ich die ProgressBar, sobald die Maske angezeigt wird (was ich ja nicht will...).

Kann mir das bitte mal jemand plausibel erklären ?

MfG ChrisProg

12.05.2020 - 11:16 Uhr

Hallo zusammen,

leider komme ich mit diesen doch recht speziellen Problem nicht weiter...

Folgendes Scenario: Outlook welches an einem Exchange-Server hängt.

In dem Profil sind neben dem Haupt-Konto noch weitere Exchange-Konten (u. auch Pop-/IMAP-Konten zu Testzwecken) eingehängt.

Es soll nun auch C# heraus eine Mail versendet werden, die mit dem Absendernamen eines eingehängten Kontos versendet u. natürlich auch aus dessen Verzeichnisstruktur heraus gesendet wird...

Hierzu wollte ich MailItem.SendUsingAccount verwenden, aber ...

Das erste Problem ist gleich das Ermitteln des Absendernamens, wenn dieser von einem weiteren Exchange-Konto stammt...
Ich wollte mit Hilfe von

 foreach (Outlook.Account account in lo_OutApp.Session.Accounts)  {...}

den entsprechenden Account ermitteln und benutzen; aber dort werden nur das Haupt-Exchange-Konto u. die Pop-/IMAP-Konten enumeriert 🤔 - warum weiß der Geier ...

Nun habe ich lange gesucht u. probiert u. bin dann irgendwann auf MailItem.SentOnBehalfOfName gestoßen...

Nun habe ich zwar unter Absender die gewünschte Adresse stehen, aber gesendet wird aus dem Standard-Exchange Ordner heraus 🤔

Weiß hier jemand, warum die weiteren Exchange-Konten nicht in den Accounts auftauchen und/oder wie ich aus dem richtigen Ordner senden kann ?

MfG

17.04.2020 - 10:13 Uhr

ich sehe da nur "reference" oder "developer guides" für die API 🤔

MfG Christian

17.04.2020 - 08:37 Uhr

Ansonsten kann man den Report auch über die CR-API öffnen ...

welche man aber nicht hat, wenn man mit der .NET-Version arbeitet ...

Zumindest finde ich keine im Wiki ...

MfG Christian

16.04.2020 - 16:19 Uhr

dem scheint wohl so, aber eben nicht für die deutsche Schreibweise geeignet ...

Meine Hoffnnug ist, das man das irgendwo einstellen kann u. nicht jedes Feld einzeln prüfen / anpassen muß ...

MfG Christian

16.04.2020 - 14:55 Uhr

Hallo zusammen,

ich suche mir seit längeren einen Wolf nach folgenden Einstellungen in/für Crystal Reports:

die Standardfeldgröße /Höhe) scheint immer 221 Pixel zu sein, obwohl gerade im deutschen 240 deutlich besser ist (wegen der Anzeige von Kommata u. allen Zeichen mit unterstrichen (g, y, p, ...))

Ich habe nirgends was gefunden, um diese Einstellung zu ändern 😭

Unter Bericht/Eigenschaften gibt es einen Bereich Statistik. Kann man dessen Werte zurücksetzen ?

MfG Christian

31.03.2020 - 10:55 Uhr

Auch wenn der Beitrag schon älter ist ...

In StackOverFlow habe ich einen Hinweis gefunden, wonach das wohl ein Problem von VS2017 sein soll -->

Had the same issue, neither proposed above solutions helped me to solve the problem. Occurred in VS 2017. When I ran the project in Visual Studio 2019, everything worked. So just try to run it in other environments. Hope this answer will help someone

Wenn man nicht gerade dabei ist, eine DLL zu programmieren, hilft in jedem Fall das Checkfeld "Nur meinen Code ausführen" unter "Extras/Optionen/Debugging", für die o.g. Arbeit jedoch nicht !

Da hilft es unter "Extras/Optionen/Debugging/Symbole" das Optionsfeld "Nur angegebene Module laden" zu aktivieren und dann unter "eingeschlossene Module angeben" die entsprechende dll hinzuzufügen...

MfG Christian

11.03.2020 - 13:04 Uhr

Hallo,

ich habe mich nun auch länger mit dem Thema beschäftigen müssen, aber leider komme ich an einem Punkt nicht weiter 8o


    try
    {
        // First Contact: Excel Prozess initialisieren
        oExcel = new Excel.Application();
        //oExcel.Visible = false;
        oExcel.ScreenUpdating = true;

        // Excel Datei anlegen: Workbook
        oExcelWorkbooks = oExcel.Workbooks;
        oExcelWorkbook = oExcelWorkbooks.Add(System.Reflection.Missing.Value);
        oExcelWorkSheet = oExcelWorkbook.ActiveSheet;
        oExcelWorkSheet.Name = x_dateiname.ToString().Trim();

        // Überschriften eingeben 
        oExcelWorkSheet.Cells[1, 1] = "test";

        // Excel Datei abspeichern 
        oExcelWorkbook.Close(true, auswertung_speichern_unter.FileName, System.Reflection.Missing.Value);

    }
    catch (Exception ex)
    {
        Fehlermeldung.ErrorMessage(ex, "( --> Datei geöffnet ???   <--  )");
        vorgang_fortsetzen = false;
    }
    finally
    {
        // Excel beenden
        if (oExcel != null)
        {
            oExcel.Quit();
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcelWorkSheet);
            oExcelWorkSheet = null;
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcelWorkbook);
            oExcelWorkbook = null;
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oExcelWorkbooks);
            oExcelWorkbooks = null;
            System.Runtime.InteropServices.Marshal.FinalRelease(oExcel);
            oExcel = null;
        }
    }

kommentiere ich die Zeile "oExcelWorkSheet.Cells[1, 1] = "test";" aus, funktioniert alles so wie es soll, u. es wird Excel im TaskManager geschlossen

da es wohl für Cells kein Comobjekt gibt (zumindest habe ich keins gefunden...)
habe ich es dann mit Hilfe von Range versucht :


        Excel.Range x_celle = (Excel.Range)oExcelWorkSheet.Cells[1, 1];
        x_celle.Value2 = "test";
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(x_celle);

aber auch dann wird Excel nicht mehr im TaskManager geschlossen 😜

Wenn ich die entsprechenden Release-Befehle im Direktfenster eingebe, bekomme ich immer "0" zurück, was nach den obigen Ausführungen ja bedeutet, das alle Objekte geschlossen sind ...

Was sehe ich hier nicht / mache ich immer noch falsch ?

Bin für jede Hilfe dankbar ...

MfG ChrisProrg

17.12.2019 - 12:17 Uhr

Leider habe ich wieder keine Benachrichtigungen bekommen, deshalb die verspätete Antwort 🤔

Danke für die Antworten, werde mir das mal zu Gemüte führen...

MfG Christian

12.12.2019 - 10:50 Uhr

@Th69:

ja mit WBETest u. WMI Explorer bekomme ich Daten ...

MfG Christian

11.12.2019 - 15:38 Uhr

Und Du bist auf was?
.NET Core 2? 3? .NET Framework? Windows...?

ManagementObject hat sehr große Einschränkungen.
zB können Windows Einstellungen und Group Policies die Verwendung von WMI beeinflussen.

kannst Du das eventuell näher ausführen ?

MfG Christian

11.12.2019 - 15:00 Uhr

Sorry ..

.NET 4.6.1 auf Windows 10

MfG Christian

11.12.2019 - 12:59 Uhr

Mein Ziel ist es Informationen vom System zu bekommen...

Ich habe "SELECT * FROM Win32_OperatingSystem" exemplarisch genommen, um andere Fehler auszuschließen ...

Ursprünglich will ich folgendes ermitteln:
"Select * From Win32_Process Where ProcessID = " + processId ( wobei die ProcessId schon vorher ermittelt wird...)

Es ist leider ganz gleich, welchen der vielen Befehle und Möglichkeiten ich nehme, ich scheitere immer am searcher.Get().Count der nie "0" ist, sondern immer einen Fehler schmeißt ...

MfG Christian

11.12.2019 - 12:48 Uhr

Hallo zusammen,

Ich verzweifle an folgendem (exemplarisch):


try
{
      string version_Os = String.Empty;
     // Get the OS information.
     string os_query = "SELECT * FROM Win32_OperatingSystem";

     ManagementObjectSearcher os_searcher = new ManagementObjectSearcher(os_query);
     foreach (ManagementObject info in os_searcher.Get())
     {
         version_Os = info.Properties["Version"].Value.ToString();
     }
}
catch (System.Threading.ThreadAbortException ex) { }
catch (System.Management.ManagementException ex) { }
catch (Exception ex) { }

Ich erhalte jedesmal einen Fehler mit leerer Message(siehe Anhang...)

Wenn ich durch den Code stepe, sehe ich, das er für "ManagementObject info in os_searcher.Get()" recht lange (einige Sekunden) braucht...

Versuche ich dann auf "os_searcher.Get().Count" zuzugreifen, erhalte ich folgenden Fehler:> Fehlermeldung:

'os_searcher.Get().Count' löste eine Ausnahme des Typs 'System.Runtime.InteropServices.COMException' aus

Die Entwicklungsumgebung wird als Admin gestartet und auch der angemeldete User ist Admin ..
Das BS ist Win10 Pro

Bin für jede Hilfe dankbar ...

MfG Christian

01.02.2019 - 13:00 Uhr

Hallo zusammen,

offensichtlich schient es ja ein generelles Problem damit zu geben Text- oder auch Formelfelder vor einem Bildobjekt zu stellen / drucken :
Image in report header appears in front of underlaying section line objects
put line object over picture in crystal report

Weiss hier jemand einen Kniff, wie man das hinbekommt ?

MfG Christian

08.10.2018 - 10:24 Uhr

Hallo zusanmen,

ich stehe gerade auf dem Schlauch...

Folgendes Problem:

In einem DataGridView sind sind u.a. zwei Felder die abhängig von einander sind, d.h. wenn in Feld "x" etwas steht, muß in Feld "y" auch etwas stehen, oder aber Feld "x" muß wieder geleert werden !

Wenn der User im Feld "y" eine Änderung vorgenommen hat, dann ist das ganze ja kein Problem --> CellValidating u. dort e.Cancel auslösen

Aber wie kann ich das gleiche Verhalten auslösen, wenn der User das Feld "y" mit TAB oder der Maus verlässt, ohne das er etwas eingegeben hat ?

Ich habe schon CellLeave versucht um dann dort CellValidating aufzurufen, das scheitert aber daran das DataGridViewCellValidatingEventArgs nur internal sind ...

Wenn ich CellEnter benutze, u. dort nach entsprechender Prüfung

     ((DataGridView)(sender)).BeginEdit(false);

aufrufe, so wird DataGridView_CellBeginnEdit aufgerufen, der entsprechende Eintrag dort auch abgearbeitet, das dort ausgelöste e.Cancel aber ignoriert 🤔

 
 if (e.ColumnIndex >= 1)
{
    if ((((DataGridView)(sender)).CurrentCell.OwningColumn).DataPropertyName == "y")
    {
        Int32 _x = 0;
        Int32.TryParse(((DataView)(((MarshalByValueComponent)(bs_positionen.List))))[bs_positionen.Position]["x"].ToString().Trim(), out _x);
        if (_x > 0 && (((DataView)(((MarshalByValueComponent)(bs_positionen.List))))[bs_positionen.Position]["y"].ToString().Trim() == "" ||
                        ((DataView)(((MarshalByValueComponent)(bs_positionen.List))))[bs_positionen.Position]["y"].ToString().Trim() == "0"))
        { e.Cancel = true; }
    }
}

Nun war der weitere Gedanke, das durch BeginEdit ja auch beim Verlassen der Zelle ja auch CellValidating aufgerufen werden müsste, da die Zelle ja nun in Bearbeitungsmodus ist - wird es aber nicht ...

Hat Jemand eventuell einen Lösungsansatz für mich oder kann mir den Fehler in meinen Gedanken erläutern ?

MfG Christian

30.08.2018 - 09:49 Uhr

Hallo zusammen,

folgende Problemstellung:

es sollen mehrere Rechnungen in einem Druckauftrag im ReportViewer angezeigt werden, von denen einige (abhängig von einem key) einen weiteren Bericht haben.

Dies kann man ja mit einem Subreport lösen, aber da ergeben sich dann leider doch ein paar Fragen / Probleme:

  • kann man per Formel den entsprechenden Unterbericht öffnen / wieder schließen ?

wenn nicht,

  • Wie verhindere ich, das der Link zum Subreport gedruckt wird, wenn im ReportViewer auf drucken geklickt wird ?
  • ist es auf diese Weise überhaupt möglich, die Rechnungen sortiert (d.h. der Unterbericht wird direkt nach seiner Rechnung gedruckt) zu drucken ?

MfG Christian

18.07.2018 - 08:12 Uhr

Danke Dir

(dank Spamfilter erst heute Morgen gesehen ...)

MfG Christian

17.07.2018 - 08:08 Uhr

Hallo,

weiss irgend jemand, wie (ob) ich in der Kopfzeile einer Form ein eigenes Kontextmenü haben (erstellen) kann ?


public ContextMenu dummykontextmenu = new ContextMenu();
this.ContextMenu = dummykontextmenu;

(nur so als Test)
funktioniert anscheinend nicht; es erscheint trotzdem das Standard-Kontextmenü 😜

MfG Christian

07.06.2018 - 10:00 Uhr

Hallo T-Virus,

das ist so weit richtig, aber hast Du mal drauf geklickt ?

Vor einem Monat funktionierte da gar nichts; nun wenigstens etwas 🙁

Wenn ich auf die "for developers"-Seite will, heißt es bitte einloggen oder registrieren - aber nirgends ist ein Punkt registrieren 🤔

Und Anfragen über die Contact-Seite werden (bis jetzt) nicht beantwortet ...

Mittlerweile konnte ich eine CHM-Datei herunterladen, die nun einiges klärt; aber leider komme ich aus den o.g. Gründen nicht an die Objectivity/.NET class library (Installationsroutine) heran.

Es wird ja hoffentlich nicht so sein, das man auf jedem Client die DB installiern muß ...

Ich werde weiter berichten ...

MfG Christian