Laden...

Forenbeiträge von Rico913 Ingesamt 95 Beiträge

24.06.2020 - 10:44 Uhr

Danke dir!

Ich hab es jetzt so:




        Form_Wait frm_Wait = new Form_Wait();

        private void Form_ProLayer_Load(object sender, EventArgs e)
        {
            frm_Wait.ShowDialog();
            ......
         }

        private void Form_ProLayer_Shown(object sender, EventArgs e)
        {
            frm_Wait.Dispose();
        }



Aber leider wird das Form_Wait nicht automatisch geschlossen.

24.06.2020 - 10:15 Uhr

Ich hab unter anderem ein Button in Form. Wenn dieser gedrückt wird startet im Hintergrund eine Oracle-Abfrage, die ein Moment dauert und das Ergebnis anschließend in Form2 angezeigt wird. Um dem Nutzer nicht den Eindruck zu vermitteln, dass das Programm hängt möchte ich die Rechenzeit visualisieren.

Ein ProgressBar wird wohl nicht möglich sein...
Gibt es eine Möglichkeit den Zeitpunkt abzufangen, wenn Form2 am Bildschirm erscheint?

Viele Grüße
Rico

06.06.2020 - 10:43 Uhr

Ja das stimmt - irgendwie hab ich die einfachste Lösung nicht gesehen.
Hab zwei Tage rumgebastelt, mich geärgert, gegoogelt, wieder neu geschrieben und im Endeffekt reicht eine simple Zeile 🙂 ....trotzdem Danke!

04.06.2020 - 23:13 Uhr

Hi,

ich versuche die user.config in ihrem Standardverzeichnis zu laden und an einem anderen Ort als Backup zu speichern.


            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            XmlDocument config_xml = new XmlDocument();
            config_xml.Load(config.FilePath);
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(@"M:\Rico\test2.config", settings);
            config_xml.Save(writer);

Wenn ich die Datei nun aber speichere ist sie leer. Find leider den Fehler nicht.

31.05.2020 - 20:12 Uhr

Na klar, lese ich mir die Antworten durch und Bernd hat gleich im ersten Kommentar geschrieben, ich solle es mit einem Web-Client probieren. Dies erschien mir der unkomplizierteste Weg....

Sorry, dass ich da mit meiner wenigen Erfahrung nicht die Kompetenz habe, auf Anhieb zu erkennen, welch die richtige, saubere Methode ist. Zumal viele Wege nach Rom führen, ob sie nun steinig oder asphaltiert sind sei mal dahin gestellt.

28.05.2020 - 14:11 Uhr

Danke für die Starthilfe, leider bin ich noch nicht auf dem richtigen Weg 😦

Im Quellcode der Website ist folgendes Script hinterlegt:


<script language="javascript" type="text/javascript">
function timedRefresh(timeoutPeriod) {
setTimeout("window.location.href = window.location.href;",timeoutPeriod);

}
timedRefresh(600000);// for 10 minutes

var i=0;
var allCells = document.getElementsByTagName("td");
for(i=0;i<allCells.length; i++)
{if(allCells[i].innerText.indexOf("Cryoampel#") == 0)
{if(allCells[i-1].innerText == "Eingekühlt")
{
var sharepointtime = Math.abs(Date.parse("January 01  1900 00:00:00"))/1000/60/60;
var modtime = (allCells[i].innerText.split("#")[1]);
//Stunden seit 1900
modtime = modtime.replace(/,/g, '.')*24;
//modtime in Stunden seit 1970
var modtime_js =  modtime-sharepointtime;
//currtime in Stunden seit 1970
var currtime = new Date();

//Korrektur für Sommerzeit
var jan = new Date(currtime.getFullYear(), 0, 1).getTimezoneOffset();
var jul = new Date(currtime.getFullYear(), 6, 1).getTimezoneOffset();
if(Math.max(jan, jul) != currtime.getTimezoneOffset())
{
currtime = (currtime.getTime()/1000/60/60)+1;
}
else
currtime = currtime.getTime()/1000/60/60;

var remtime = ((modtime_js + 4) - currtime)-48;
var sremtime = remtime.toString();
var remtimesplit = sremtime.split(".");
var remminutes = Math.abs(parseInt((remtime-parseInt(remtimesplit[0]))*60));
if (remminutes <10) {remminutes = "0"+remminutes};
if(remtime <= 0.5)
{
allCells[i].innerHTML = "<b><font color='red'>"+remtimesplit[0]+":"+remminutes+"</font></b>";
}
else
allCells[i].innerHTML = remtimesplit[0]+":"+remminutes;
}
else
allCells[i].innerHTML = "-";
}
}</script>

Ich vermute, dass der Wert "allCells_.innerHTML", der Wert ist, den ich benötige.

Das Einzige was ich bisher geschafft habe, ist den Quellcode als Ganzes downzuloaden:


 WebClient client = new WebClient();
client.UseDefaultCredentials = true;
string reply = Client.DownloadString("http://...../Lists/SEMTEM%20cryo%20cycle%20tracker/AllItems.aspx");
Console.WriteLine(reply);

Aber das ist ja leider nicht das Ziel....
Muss ich das Script nicht irgendwie laufen lassen, damit ich den berechneten Wert bekomme?

28.05.2020 - 11:17 Uhr

Ich relativ neu und stelle mich neuen Herausforderungen in der C#-Welt

Mein Ziel ist es einen bestimmten Wert aus einer Tabelle auf unserer Website auszulesen. Diese Liste liegt im SharePoint.

Die Seite liegt unter der Adresse http://......./AllItems.aspx

Es gibt vier Spalten -> Gerät // Status // RestZeit // Geändert

Die Restzeit gibt an, das ein Gerät in x-Minuten eingekühlt werden muss. Ziel ist es in meinem Form eine Ampel darzustellen ≤15 -> rot // 15 <=> 60 -> orange // >60 -> grün, die sich alle paar Minuten aktualisiert.

Die Form-Programmierung mit der Ampel bekomme ich hin, aber ich hab momentan keine Ahnung, wie ich an die Daten komme. Ist das generell möglich?
Mir fehlt ein wenig der Ansatz, ich habe mich zwar schon durch diverse Docs gekämpft, aber ich glaube ich bin etwas durcheinander gekommen 😦

26.05.2020 - 14:21 Uhr

Noch fix:

Dann liefere am besten Putty als portable Version gleich mit aus.

Installationen erlaubt und managed unsere IT-Abteilung. Wir "suchen" uns im SoftwareCenter nur was wir haben wollen und IT installiert es. Somit ist auch schon mal sichergestellt, dass alle Nutzer denselben Softwarepfad haben.

Die Command.txt hat den Grund, dass ich, aus welchem Grund auch immer, keine Befehlseingabe zustandekommt bzw. ich nichts auslesen kann. Command.txt liegt auf einem schreibgeschützten Laufwerk -> Schutz vor Manipulation.

Wie schon gesagt - Zwischenlösung - das heißt nicht, dass die Lösung über einen langen Zeitraum auf sich warten lässt. Ich bin dran, aber in der Zwischenzeit, hilft es uns im Arbeitsleben.

Jetzt kann's geschlossen werden. VG

26.05.2020 - 10:43 Uhr

Okay ... ich werde das beherzigen - Danke.

Das Offset beträgt jetzt aber 00:00 - ist das richtig? Müsste da nicht die Länge der Zeitspanne stehen?

Zum Ziel:
Wir haben viele Nutzer, die das Tool nutzen würden und auf die Programmdatei per Verknüpfung im Gruppenlaufwerk zugreifen. Die Settings werden im eigenen Account gespeichert.
Wenn ich nun ein Update machen möchte, kann ich die Datei nicht überschreiben, weil irgendeiner diese offen in der Session hat.
Meine Idee ist folgende:

  1. Ich setzte in einer Txt.Datei das Update-Signal 1 (1=steht bevor / 0=nichts)
  2. wenn der Nutzer das Programm startet wird der Inhalt der Txt geprüft
    Wenn 1 dann startet ein Timer bis zum nächsten Tag 14:00 und schließt dann das Programm.
    So kann ich am nächsten Tag nach 14:00 ein neues Update einspielen.

Zumindest ist so der Plan....

26.05.2020 - 09:58 Uhr

Ich möchte die Zeit in Millisekunden für ein Timer vom Programmstart bis zum darauffolgenden Tag 14:00Uhr messen.

Den nächsten Tag festzulegen war nicht schwer, aber irgendwie habe ich gerade ein Blackout. Wie kann ich die 14:00Uhr festlegen?
Womöglich recht simple, aber ich komm nicht drauf...


        public void TimeDiff_Update()
        {
            DateTime StartZeit, EndZeit; //EndZeit = nächster Tag 14.00Uhr
            StartZeit = DateTime.Now;
            EndZeit = StartZeit.AddDays(1);

           Hilfe 

            MessageBox.Show("Teststart: " StartZeit.ToString() + " Testende: " + EndZeit.ToString());
        }

25.05.2020 - 11:18 Uhr

Das ist völlig richtig, aber ich kann es unseren Nutzern schon mal als Zwischenlösung zur Verfügung stellen.
Ich behalte das auf dem Schirm und versuche es sauber zu lösen - bin ja noch in den Kinderschuhen und bisher am Basteln, um so Stück für Stück Erfahrungen zu sammeln.

Zum Glück gibt es solche Foren, die einen unglaublich weiterhelfen. Geht zumindest mir so!
Es muss nicht immer der vorgekaute Code sein, sondern es reicht oft ein Schubs in die richtige Richtung. Danke 👍

25.05.2020 - 09:35 Uhr

Ich bin das Problem umgangen und benutze Putty als Verbindung.
Mein Code sieht nun so aus:


bool Username_DomainCheck = Username.ToLower().Contains(@"....\");
            if (Username_DomainCheck == true)
            {
                Username = Username.Remove(0, 11);
            }
if (File.Exists(@"C:\Program Files\PuTTY\plink.exe"))
            {
                Process cmd = new Process();
                cmd.StartInfo.FileName = @"C:\Program Files\PuTTY\plink.exe";
                cmd.StartInfo.UseShellExecute = false;
                //cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.RedirectStandardInput = true;
                cmd.StartInfo.RedirectStandardOutput = true;
                cmd.StartInfo.Arguments = "-ssh dedehog01 -l " + Username + " -m " + "\\\\.........\\command.txt";
                cmd.Start();
                cmd.StandardInput.WriteLine("/...../get_code");
                cmd.StandardInput.WriteLine("exit");

                string output = cmd.StandardOutput.ReadToEnd();

                label5.Text = output;
            }
            else
            {
                MessageBox.Show("Bitte PUTTY installieren und erneut versuchen.");
            }
        }

24.05.2020 - 13:59 Uhr

Okay ... trotzdem Danke für die hilfreichen und vor allem schnellen Antworten 😃

23.05.2020 - 11:12 Uhr

Appropos Passwort

Wie kann ich den Usernamen und das Password einfach aus der Windowssession übernehmen?
Der Nutzer muss sich ohnehin in seinem Windowskonto anmelden und ich würde es gerne vermeiden, dass er seine Anmeldedaten nochmal eingeben muss. Geht das überhaupt?

23.05.2020 - 11:06 Uhr

Hi,

ich versuche eine SSH-Verbindung aufzubauen, aber ich bekomme folgende Fehlermeldung:

Fehlermeldung:
Renci.SshNet.Common.SshAuthenticationException: "Permission denied (password)."

Mein Code ist folgender:


string code;
            string host = "dedehog01";
            string username = "ABC";
            string password = "XXX";
  
            using (var ssh = new SshClient(host, 22, username, password))

            {
                ssh.Connect();
                ........
                ........
                ssh.Disconnect();
            }
           
        }

Uber Putty habe ich die Verbindung mit Passwort getestet - funzt. Warum wird dann trotzdem verweigert?

23.05.2020 - 08:25 Uhr

Ok, danke für den Tipp.

Gibt es denn eine andere Möglichkeit den Browser vom Form_Main "abzukoppeln", sodass man das Main während geöffneten Browser-Form nutzen kann?

23.05.2020 - 07:36 Uhr

Hi,

im Form_Main wird ein Link (URL) erstellt, der an Form_Web übergeben wird. Im Form_WSeb läuft ein Webbrowser. Diesen möchte ich aber im Backgroundworker ausführen, damit der Nutzer Form_Main weiterhin nutzen kann.
Ohne Backgroundworker funktioniert mein Code, nur mit erhalte ich folgende Fehlermeldung:

Fehlermeldung:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement webBrowser1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde

Mein Code:


  public partial class Form_Web : Form
    {
        private string F2_Request_URL;
        String Url = string.Empty;
        BackgroundWorker worker_MaWeBro;

       

        public Form_Web(string F1_Request_URL)
        {
            InitializeComponent();
            F2_Request_URL = F1_Request_URL;
            Url = F2_Request_URL;
            //Url = "http://malabrequest/MalabDetailedRequest.aspx?RequestId=2028408_TEM";
            label1.Text = Url;
            
            worker_MaWeBro = new BackgroundWorker();
            worker_MaWeBro.WorkerReportsProgress = true;
            worker_MaWeBro.WorkerSupportsCancellation = true;
            worker_MaWeBro.DoWork += new DoWorkEventHandler(worker_MaWeBro_DoWork);
           
            worker_MaWeBro.RunWorkerAsync();
        }
                 

        private void Form_Web_Load(object sender, EventArgs e)
        {
            Cmd_Browser_Back.Enabled = false;
            Cmd_Browser_Home.Enabled = false;
        }


        void worker_MaWeBro_DoWork(object sender, DoWorkEventArgs e)
        {
            MaWeb_Browser();          
        }


            private void MaWeb_Browser()
        {
            if (toolStripComboBox1.Text != "")
            Url = toolStripComboBox1.Text;
            webBrowser1.Navigate(Url);
            webBrowser1.ProgressChanged += new WebBrowserProgressChangedEventHandler(webpage_ProgressChanged);
            webBrowser1.DocumentTitleChanged += new EventHandler(webpage_DocumentTitleChanged);
            webBrowser1.StatusTextChanged += new EventHandler(webpage_StatusTextChanged);
            webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webpage_Navigated);
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webpage_DocumentCompleted);
        }

Google und FAQ haben mir leider nicht auf die Sprünge geholfen 😦

17.05.2020 - 22:27 Uhr

Hi,

da ich relativ neu in der C#-Programmierung bin, habe ich eine Frage der Machbarkeit?

Ist es überhaupt möglich,

  1. eine SSH Verbindung zu einem Linuxsystem aufzubauen (Hab ich schon gegoogelt -> geht)
  2. ein Kommando zu geben (gegoogelt -> geht wohl auch)
  3. die Ausgabe auszulesen und im Form anzuzeigen -> ???

Zum Hintergrund:
Wir haben auf einem Linuxsystem ein Tool laufen. Um dieses zu benutzen, verbinden wir uns über Putty mit dem entsprechenden Server. Auf diesem müssen wir einen Key generieren (Zwei-Faktor-Authentisierung). Diesen Key erhalten wir über das Kommando - get_verification_code.
Anschließend wird der Code ausgegeben.

14.05.2020 - 10:19 Uhr

Aber RoboCopy läuft doch lokal - meinst du das?

14.05.2020 - 09:51 Uhr

Abgesehen davon, dass wir mir gerade klar geworden ist, es kein Sinn Macht stur gerade/ungerade zu zählen. Was, wenn der Prozess sauber läuft und der nächste gestartet wird - dann wird abgebrochen 🤔

Vielleicht habt ihr ne Idee, wie ich das Abrechen umsetzen kann, vielleicht innerhalb des Timers (Wenn Click auf Button dann Timer.Tick = false)?

14.05.2020 - 09:45 Uhr

Hi,

ich möchte ein Process Robocopy starten und mit Hilfe von nochmaligen Click auf den Button die Aktion abbrechen. Der Process startet sauber, aber ich kann diesen nicht abbrechen.
Es erscheint folgende Fehlermeldung:> Fehlermeldung:

"Diesem Objekt ist kein Prozess zugeordnet."

Mein Code:



            Process p = new Process();
            p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
            p.StartInfo.FileName = "robocopy.exe";
            p.StartInfo.Arguments = arg;

            
            if (Counter % 2 == 1)
            {
                label3.Text = "Quelle: " + DateiAnzahl_Quelle.ToString();
                if (!Directory.Exists(Ziel))
                {
                    Directory.CreateDirectory(Ziel);
                }
                p.Start();

                Tim_ProgressBarTIFcopy.Interval = Convert.ToInt32(TickIntervall);
                Tim_ProgressBarTIFcopy.Enabled = true;
            }
            else
            {
                Tim_ProgressBarTIFcopy.Enabled = false;
                progressBar1.Value = 0;
                CmdImgCopy.Text = "Bilder kopieren";
                if (!p.HasExited)
                {
                    p.Kill();
                }
                
            }

Danke schon mal....

14.05.2020 - 08:16 Uhr

Danke Thomas .... diesen Ansatz hatte ich auch schon verfolgt und deswegen die Aufsummierung durch "=" ersetzt. Dann müsste doch der reale Wert angezeigt werden, aber es wird nur "1" angezeigt.

Die Funktion, um die Anzahl zu bestimmen, habe ich einzeln getestet und ich bekomme den realen Wert angezeigt, bspw. 60.

14.05.2020 - 07:11 Uhr

Zu früh gefreut .... das gelbe vom Ei ist es dann doch nicht 😦
Bei einem anderen Test mit größeren und mehreren Dateien hat sich rausgestellt, dass es nicht die Wirklichkeit wiedergibt, sondern einfach nur stumpf den Balken durchzieht.
Ich habe progressBar1.increment in progressBar1.value geändert:


 progressBar1.Maximum = DateiAnzahl_Quelle;

            if (DateiAnzahl_Ziel == DateiAnzahl_Quelle)
            {
                Tim_ProgressBarTIFcopy.Enabled = false;
                progressBar1.Value = 0;
                CmdImgCopy.Text = "Bilder kopieren";
            }
            else
            {
                DirectoryInfo DiInfo = new DirectoryInfo(Ziel);
                DateiAnzahl_Ziel += DiInfo.GetFiles().Length;
                label5.Text = "Status: " + DateiAnzahl_Ziel.ToString();
                //progressBar1.Increment(DateiAnzahl_Ziel);
                progressBar1.Value = DateiAnzahl_Ziel;
                CmdImgCopy.Text = DateiAnzahl_Ziel.ToString() + "/" + DateiAnzahl_Quelle;
            }

Dennoch habe ich bei Tests herausgefunden, dass ich Probleme mit der DateiAnzahl_Ziel habe. Eigentlich soll er schauen, wieviel Dateien im Zielverzeichniss vorhanden sind und diesen Wert mit den Dateien im Quellverzeichnis vergleichen. Sind beide gleich stoppt der Timer und der ProgressBar ist auf 100%.
Wenn ich DiInfo.GetFiles().Length nicht aufsummiere, sondern nur "=" setze bleibt DateiAnzahl_Ziel auf "1" stehen. Ich versteh mein Fehler nicht - sicher ein Knick in der Logik.

13.05.2020 - 14:27 Uhr

Hey,

danke für eure Antworten. Nach vielen Trial and Error Versuchen habe ich eine, für meine Zwecke ausreichende, Lösung gefunden:


private static int CountFiles(string path)
        {
                DirectoryInfo DiInfo = new DirectoryInfo(path);
                return DiInfo.GetFiles().Length;
        }
        
       

        public void Tim_ProgressBarTIFcopy_Tick(object sender, EventArgs e)
            {
            string Quelle = "\\\\sdrsmalabp03\\malab$\\07_Mitarbeiter\\Rico\\Test\\Test_Quelle";
            string Ziel = "\\\\sdrsmalabp03\\malab$\\07_Mitarbeiter\\Rico\\Test\\Test_Ziel";
            int DateiAnzahl_Ziel = 0;
            int DateiAnzahl_Quelle;
            DateiAnzahl_Quelle = CountFiles(Quelle);
            progressBar1.Maximum = DateiAnzahl_Quelle;
            
            if (DateiAnzahl_Ziel == DateiAnzahl_Quelle)
            {
                Tim_ProgressBarTIFcopy.Enabled = false;
                progressBar1.Value = 0;
            }
            else
            {
                DirectoryInfo DiInfo = new DirectoryInfo(Ziel);
                DateiAnzahl_Ziel += DiInfo.GetFiles().Length;
                //label5.Text = "Status: " + DateiAnzahl_Ziel.ToString();
                progressBar1.Increment(DateiAnzahl_Ziel);
            }
        }

Vielleicht nicht ganz sauber aber läuft. Ich habe nach einigen Fehlversuchen mit der Dateigröße - siehe Abt:

  • Meines Wissens hat Robocopy die Möglichkeit direkt Dateien mit der Zielgröße zu erstellen. Das heisst, dass sofort die Gesamtgröße der Datei auf dem Dateisystem existiert und dann nur noch die Bytes übertragen werden; sowas beschleunigt Kopiervorgänge größerer Dateien immens. Damit ist Deine Überwachung dahin.

mich auf die Dateianzahl konzentriert...

13.05.2020 - 11:47 Uhr

Gegoogelt? Na klar, aber das ist doch alles für PowerShell oder kann man das übertragen?

13.05.2020 - 10:54 Uhr

Hi,

ich möchte ein ProgressBar verwenden, um das Kopieren von Dateien darzustellen. Leider werden mir bei File.Copy die Rechte verweigert, aber RoboCopy funktioniert.

Nun möchte ich im ProgressBar den Status von Robocopy anzeigen. Mir fehlt dazu die Idee und das Wissen.

Ich dachte mir, wenn ich vielleicht die Byte-Menge im Quellverzeichnis auslese und permanent die ByteMenge im Zielverzeichnis auslese und prozentual im Progressbar anzeigen lasse.

Würde das überhaupt funktionieren und welche Anweisung bräuchte ich da?

  1. Auslesen Bytemenge Quelle
  2. permanentes Auslesen Bytemenge Ziel - wahrscheinlich über ne Schleife
  3. Übertrag auf Progressbar

Oder gibt es eine bessere Lösung?

Danke euch!!

11.05.2020 - 07:43 Uhr

Hi,

ich arbeite mich gerade ein und habe meine ersten 500 Zeilen fertig und es sollen noch mehr hinzukommen... 😃

Aber so langsam verliere ich den Überblick - gerade, wenn ich Passagen suche.

Gibt es eine sinnvolle Methode Programmabschnitte zu sortieren oder gar zusammenzufassen? Oder kommentiert ihr nur? Wie handhabt ihr das?

06.05.2020 - 22:33 Uhr

Hi,

ist es möglich bei gewähltem FormBorderStyle = none zur besseren Visualisierung eine kleine Linie als Rahmen um das Form zu ziehen?

03.05.2020 - 22:37 Uhr

Form_Closing verstehe ich, aber

Dann musst du nur beim anlegen deines Form_Setup Objekts einfach den Handler, den du in Form_Main anlegen musst, übergeben.
Dann musst du nur, wenn das Event aufgerufen wird, darin die Daten laden und anzeigen.

Das krieg ich noch nicht hin ... bin gerade am Einarbeiten. Wie übergebe ich diesen?

03.05.2020 - 20:31 Uhr

Hi,

ich möchte im Form2 (Form_Setup) den Nutzer die Einträge in ein Listenfeld vornehmen lassen, die im Form1 (Form_Main) angezeigt werden.
Speichern, Laden klappt alles - aber ich möchte, das Form beim Schließen von Form_Setup die Werte übernimmt - sprich Form_Main aktualisiert.

Dafür gibt es eine Anweisung die Form_Main aktualisiert -> public void LoadSettings()
Form_Setup schließe ich über Close().
Diese kann ich aber im Form_Setup nicht ansteuern bzw. laden - wie kann man diese Verbindung herstellen?

03.05.2020 - 20:23 Uhr

Vielen Dank mal wieder für die schnelle unkomplizierte Hilfe - mit List hat's geklappt.

Mein neuer Code:
Speichern:


 var newList = new List<String>();
            foreach (string item in Lst_F2_Methoden_Setup.Items)
            {
                newList.Add(item.ToString());
            }
            Properties.Settings.Default.Methode_Setup = newList;
            Properties.Settings.Default.Save();

Laden:


Lst_F2_Methoden_Setup.Items.Clear();
            if (Properties.Settings.Default.Methode_Setup != null)
            {
                var LoadList = new List<String>();
                LoadList = Properties.Settings.Default.Methode_Setup;
                List<string> LoadList2 = LoadList.Cast<string>().ToList();
                foreach (var item in LoadList2)
                {
                    Lst_F2_Methoden_Setup.Items.Add(item);
                }
            }

02.05.2020 - 22:38 Uhr

Hi,

ich habe eine ListBox mit verschiedenen Werten (z.B. TEM, SEM, XRD etc.), die der Nutzer befüllen kann und speichern oder laden kann.
Ich habe von anderen Optionen eine user.config angelegt (settings.settings), in die ich schreiben oder lesen möchte:

Zum Schreiben habe ich folgenden Code:


var newList = new ArrayList();
            foreach (object item in Lst_F2_Methoden_Setup.Items)
            {
                newList.Add(item);
            }

            Properties.Settings.Default.Methode_Setup = newList.ToString();
            Properties.Settings.Default.Save();

Was er mir in die user.config schreibt, sieht so aus:


<setting name="Methode_Setup" serializeAs="String">
                <value>System.Collections.ArrayList</value>
            </setting>

Ich wundere mich, warum meine Werte dort nicht auftauchen. Im Settings.Settings habe ich den Type von "Methode_Setup" auf string gesetzt.

Zum Laden hab ich diesen Code:


var LoadMethodSetup = Properties.Settings.Default.Methode_Setup;
Lst_F2_Methoden_Setup.Items.Add(LoadMethodSetup);

Es wird zwar "System.Collections.ArrayList" geladen, aber das ist leider nicht das Ergebnis, welches ich suche 😦

02.05.2020 - 15:43 Uhr

ComboBox ... na klar 8)
...nicht ganz, was ich suche aber dafür reicht es glaube ich...

Kann man diese auch endlos schalten?

02.05.2020 - 15:38 Uhr

Keine Ahnung, wie die genaue Bezeichnung dafür ist.

In der Mitte von zwei Balken steht der Wert, den ich einstellen möchte. Mit entsprechendem Wischen ändere ich den Wert bis ich wieder am Anfang angekommen bin. Also endlos - daher als plastische Vorstellung ein Rolle.

Ich würde gern den User den Wert über das Mausrad bzw. Scrollbalken einstellen lassen. Wenn der letze Wert in der Item-Liste (bsw. Index 6) angezeigt wird, soll er wieder zum Anfang (Index 0) springen.

02.05.2020 - 15:18 Uhr

Hi,

ich brauche mal wieder ein Schubs in die richtige Richtung.

Ich möchte ein Auswahlfeld realisieren, welches nur eine Zeile hoch ist und ich per Mausrad oder Scrollbalken bedienen kann. Am Liebsten sollte es aussehen, wie die "Kalendarrolle" bei Android.
Im Grunde genommen würde ein NumericDropDown dies erfüllen - eben aber mit Texteinträgen, die ich aus meiner Config-Datei auslese.

Ich habe es über eine Listbox versucht - da sieht es zunächst so aus, als ob ich diese, bei einer einzeiligen Höhe, über das Mausrad steuern kann, aber er nimmt den eingestellten Wert nicht an, sondern nimmt ein "verdeckten" markierten Eintrag aus der Listbox. Ich muss diesen mit den Pfeiltasten einstellen.

Gibt es da eine Möglichkeit bzw. vermute ich, dass die ListBox nicht genau dafür geeignet ist??

Danke euch schon mal.....

01.05.2020 - 12:31 Uhr

Das Tutorial war mir zu undurchsichtig, da hab ich mich nochmal auf die Suche begeben und dieses Tutorial-Video gefunden:

http://www.youtube.com/watch?v=tIOWI0JBFkg

Macht zwar dasselbe, aber wesentlich einfacher. Bei mir klappt es nun auch 😃

30.04.2020 - 20:38 Uhr

Ich komm mal wieder nicht weiter. Ich habe eine app.config erstellt mit folgendem Aufbau:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key ="Menu_Opt1_Foldersearch" value ="0"/>
    <add key ="Menu_Opt2_ImgCopy" value ="0"/>
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
</configuration>

Die appSettings auszulesen klappt ohne Probleme über:


string Menu_Opt1_FS System.Configuration.ConfigurationManager.AppSettings["Menu_Opt1_FolderSearch"];
string Menu_Opt2_ImgCopy = System.Configuration.ConfigurationManager.AppSettings["Menu_Opt2_ImgCopy"];

Beim Speichern bekomme ich aber meine Probleme - es wird nix gespeichert. Nach ausgiebiger Recherche hab ich mir diesen Code gebastelt:


private void Speichern_ToolStripMenu_Click(object sender, EventArgs e)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetExecutingAssembly().Location);
            config.AppSettings.Settings["Menu_Opt1_Foldersearch"].Value = Menu_Opt1;
            config.AppSettings.Settings["Menu_Opt2_ImgCopy"].Value = Menu_Opt2;
            config.Save();
            ConfigurationManager.RefreshSection("appSettings");
            
            
            Menu_Optionen.DropDown.Close();
            Menu_Module.DropDown.Close();
            
            Test_Op1.Text = Menu_Opt1;
            Test_Opt2.Text = Menu_Opt2;
            Application.Restart();
        }

Mit Test_Op1.Text = Menu_Opt1 teste ich, ob die Variablen richtig übergeben werden - das funktioniert - aber das war's auch schon 😦

30.04.2020 - 20:22 Uhr

Super ... ich danke dir mal wieder 😃

30.04.2020 - 07:06 Uhr

Hi,

Ich habe in meinem ToolStripMenu zwei Optionen mit Checkboxen angelegt.

Wenn ich nun aber das Item anklicke, wird das Menu sofort geschlossen. Gibt es eine Option/Anweisung mit der ich dieses verhindern kann?

Danke und viele Grüße

30.04.2020 - 06:38 Uhr

Guten Morgen,

ich hab's hinbekommen.
Das Problem, welches ich mit meinen Checkboxen hatte, konnte ich auch lösen. Manchmal ist die Lösung doch simpler als man glaubt -> CheckOnClick = true

Mein Lösungsweg sieht nun wie folgt aus:

int height = 85;
            int Opt_Zero_Heigth = 85;
            GBFolderSearch.Visible = false;
            GBImgCopy.Visible = false;
            GBFolderSearch.Location = new Point(5, 83);
            GBImgCopy.Location = new Point(5, 83);
            Opt_Menu_RequestFolder.Checked = false;
            Opt_Menu_ImgCopy.Checked = false;

            if (Menu_Opt1_FS == "1")
            {
                height += 50;
                Opt_Zero_Heigth += 0;
                GBFolderSearch.Visible = true;
                GBFolderSearch.Location = new Point(GBFolderSearch.Location.X, Opt_Zero_Heigth);
                Opt_Menu_RequestFolder.Checked = true;

            }
            
            if (Menu_Opt2_ImgCopy == "1")
            {
                height += 60;
                if (Menu_Opt1_FS == "1")
                    Opt_Zero_Heigth += GBFolderSearch.Size.Height;
                else
                    Opt_Zero_Heigth = 85;
                GBImgCopy.Visible = true;
                GBImgCopy.Location = new Point(GBImgCopy.Location.X, Opt_Zero_Heigth);
                Opt_Menu_ImgCopy.Checked = true;
            }


            this.Size = new Size(150, height);
        }

Danke für die Hilfe!!!

29.04.2020 - 12:08 Uhr

GB.Foldersearch ist ein "Modul", welches ich mit der angehakten Option aktiviere:


this.GBFolderSearch.Controls.Add(this.CmdMALRep);
            this.GBFolderSearch.Controls.Add(this.CmdLims);
            this.GBFolderSearch.Location = new System.Drawing.Point(5, 83);
            this.GBFolderSearch.Name = "GBFolderSearch";
            this.GBFolderSearch.Size = new System.Drawing.Size(139, 47);
            this.GBFolderSearch.TabIndex = 34;
            this.GBFolderSearch.TabStop = false;
            this.GBFolderSearch.Text = "Requestordner";

Ich konnte die Option zwar anklicken, aber er hat den Haken nicht weggenommen - da habe ich es so gelöst. Gibt es eine schlauere Art??

29.04.2020 - 11:28 Uhr

Ein Beispiel zur Erklärung:

Form1 - Hauptform
Option1
Option2
Option3

Hauptform = Größe 150, 85
Option1 = Größe 150, 50
Option2 = Größe 150, 60

Wenn Option1 = checked dann vergrößert sich das Hauptform um y = 50 -> Hauptform = 150,135
Wenn Option1 + Option2 -> Hauptform = 150, 195 -> Option1 + Option2 angezeigt
Wenn Option2 only -> Hauptform = 150, 145 -> nur Option2 wird angezeigt
....
...

29.04.2020 - 11:22 Uhr

Checkbox ... meinte ich


if (requestordnerÖffnenToolStripMenuItem.Checked == true)
            {
                requestordnerÖffnenToolStripMenuItem.Checked = false;
                GBFolderSearch.Visible = true;
                this.Size = new Size(150, 135);
             }
           else
            {
                requestordnerÖffnenToolStripMenuItem.Checked = true;
                GBFolderSearch.Visible = true;
                this.Size = new Size(150, 85);
            }

29.04.2020 - 11:15 Uhr

Aber mein Formular soll sich entsprechend in der Größe anpassen.

Mir fällt grad auf, dass ich das ganz vergessen hatte zu erwähnen - Sorry!

29.04.2020 - 10:49 Uhr

Hi,

ich arbeite mich gerade in VS2019 und C# ein und habe auch schon Anwendungsideen.

Nun stehe ich vor meinem ersten Problem:

Ich habe ein Form mit einem Menüstrip. In diesem Menü möchte ich per Checkbox verschiedene Optionen einzelner Module anbieten. D.h. ich habe zur Zeit 3 Optionen, die ich mit einander kombinieren kann oder auch alle anhaken.

Bei angehakter Option, soll sich das Hauptform entsprechend erweitern oder wieder "einklappen". Über IF checked und *.visible kann ich es für die erste Option darstellen.
Wenn ich aber kombinieren möchte oder die erste Option auslasse fällt mein derzeitiges Konstrukt zusammen - ich müsste soviel wenn dann Anweisungen schreiben, dass ich mir vorstelle, dass das nicht der "saubere Weg" ist.

Schlussendlich soll es eine Art Hauptform sein, in das ich mir per Option die verschiedenen Module laden kann und diese im Hauptform angezeigt bekomme.
Zudem soll sich das Form entsprechend der Optionen mit seiner Größe anpassen oder die Optionen docken als extra Form an das Hauptform an.

Sicherlich gibt es dafür eine Lösung, nur fehlt mir der Stubs in die richtige Richtung.

Danke euch schonmal im Vorraus....