Laden...

Forenbeiträge von partyboy Ingesamt 109 Beiträge

05.02.2011 - 19:27 Uhr

Hallo MarsStein,

Du hattest natürlich völlig recht.
Mit mehreren Workern funktioniert es wunderbar.

Danke und Gruß

04.02.2011 - 23:30 Uhr

Hi,

wie ich dem Beitrag Methode soll auf jeden Fall bis zuende ausgeführt werden trotz Thread.Suspend zu sehen, spiele ich mometan mit Threads rum.

Ich habe jetzt mind. 2 Stunden meine Anwendung ge-debugged und seh den Wald von lauter Bäumen nicht mehr. Also entschuldige ich mich schonmal im Voraus, falls diese Frage zu einfach ist.

Was ich möchte:
Ein Prozess soll 2 Sekunden laufen, pausiert werden und der nächste Prozess soll angeworfen werden, 2 Sekunden laufen, pausiert werden, nächster Prozess, usw.

Ich gehe dabei folgendermaßen vor (dank der Tipps aus einem anderen Beitrag):

  • Prozess1 starten (als Thread)
  • 2 Sekunden warten
  • Prozess1 pausieren
  • Wenn Prozess sicher pausiert ist, wird PauseEvent ausgelöst
  • im PauseEvent starte ich dann den nächsten Prozess also: Prozess2 starten, 2 Sekunden warten, Prozess2 pausieren. --> PauseEvent wird gefeuert, gleiches Spiel mit Prozess3 usw..

Das Ganze in Code gegossen sieht so aus:


        Worker wrk = new Worker();

        private void btnStart_Click(object sender, EventArgs e)
        {            
            wrk.PauseEvent += new Worker.PauseEventHandler(wrk_PauseEvent);
            wrk.Start();
            Thread.Sleep(2000);
            wrk.Pause();
        }

        void wrk_PauseEvent(object sender, EventArgs e)
        {
            //nächsten thread aufrufen. zu testzwecken und der einfachheit halber rufe ich den selben thread nochmal auf
            wrk.Start();
            Thread.Sleep(2000);
            wrk.Pause();
        }

using System;
using System.Threading;

namespace TEST
{
    class Worker
    {
        public delegate void PauseEventHandler(object sender, EventArgs e);
        public event PauseEventHandler PauseEvent;

        private bool bPause = false;

        public void Start()
        {
            if (bPause)
            {
                Resume();
            }
            else
            {
                Thread tDoIt = new System.Threading.Thread(new System.Threading.ThreadStart(DoIt));
                tDoIt.Start();
            }
        }

        private void Resume()
        {
            bPause = false;
        }

        public void Pause()
        {
            bPause = true;
        }

        private void DoIt()
        {
            //do something
            Thread.Sleep(3000);
            CheckForPause();

            //do something
            Thread.Sleep(2000);
            CheckForPause();
        }

        private void CheckForPause()
        {
            if (bPause)
            {                
                //event irgendwie asynchron aufrufen?
                PauseEvent(this, new EventArgs());
                while (bPause)
                {
                    Thread.Sleep(100);
                }
            }
        }
    }
}

Jetzt zu meinem Problem:
Wenn das erste Mal pausiert wird, wird richtigerweise das PauseEvent gefeuert aber nachfolgender Code (die while-Schleife zum Warten) nicht ausgeführt.

Kann ich das PauseEvent irgendwie asynchron aufrufen oder ist mein Ansatz komplett falsch gedacht?

Wie löse ich das Problem am Besten?

02.02.2011 - 07:58 Uhr

Vielen Dank für Eure Unterstützung.
Ich habs jetzt so gemacht, wie von JAck30lena beschrieben.

Von außerhalb der Klasse wird ein Pause-Flag gesetzt. Nach jeder zusammenhängenden Befehlsreihe wird das Pause-Flag geprüft. Wenn true, dann wird der Thread schlafen gelegt und vorher mittels event an die aufrufende Klasse mitgeteilt, dass der Thread nun schläft.

01.02.2011 - 10:30 Uhr

Hi,

ich habe eine Methode (DoWork) die in einem Thread läuft. DoWork führt viele Befehle hintereinander aus. Bestimmte Befehle gehören aber zusammen und müssen immer komplett ausgeführt werden.
Nun möchte ich den Thread aber pausieren mittels Thread.Suspend.
Wie bekomme ich es hin, dass bestimmte Befehlsfolgen ununterbrechbar sind? Der Thread soll erst schlafen gelegt werden, wenn eine Befehlsreihe (hier 'step') vollständig durchgeführt wurde.


System.Threading.Thread tWorker;
private void DoWork()
{
	//step1
	Delay(3000);
	MessageBox.Show("step1 wurde vollständig ausgeführt.");
	//step2
	Delay(3000);
	MessageBox.Show("step2 wurde vollständig ausgeführt.");
	//step3
	Delay(3000);
	MessageBox.Show("step3 wurde vollständig ausgeführt.");
}

private void btnStart_Click(System.Object sender, System.EventArgs e)
{
	tWorker = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork));
	tWorker.Start();
}

private void btnPause_Click(System.Object sender, System.EventArgs e)
{
	tWorker.Suspend();
}


Ich dachte erst, der lock-Befehl würde mir da weiterhelfen aber er scheint in meinem Fall keine Auswirkungen zu haben. Die MessageBox erscheint nicht, nachdem ich den Thread pausiere.

object myLock = new object();
private void DoWork()
{
	lock ((myLock)) {
		//step1
		Delay(3000);
		MessageBox.Show("step1 wurde vollständig ausgeführt.");
	}
	lock ((myLock)) {
		//step2
		Delay(3000);
		MessageBox.Show("step2 wurde vollständig ausgeführt.");
	}
	lock ((myLock)) {
		//step3
		Delay(3000);
		MessageBox.Show("step3 wurde vollständig ausgeführt.");
	}
}

Wie macht man es richtig? Muss ich die Pause-Funktionalität selbst programmieren und dafür sorgen, dass einige Befehlsreihen atomar bleiben? Wie gehe ich da am Besten ran?

Viele Dank

07.10.2010 - 23:30 Uhr

Hi,

ich versuche momentan einen Text direkt in ein Spiel (Vollbildmodus) zu schreiben, um eine Statisktik einzublenden. Das Spiel setzt DirectX voraus und ist nicht von mir.

Meine kläglichen versuche waren folgende:
(Text auf Desktop schreiben)


       [DllImport("User32.dll")]

        public static extern IntPtr GetDC(IntPtr hwnd);

        [DllImport("User32.dll")]

        public static extern void ReleaseDC(IntPtr dc);


            IntPtr myDC = GetDC(IntPtr.Zero);
            Graphics g = Graphics.FromHdc(myDC);
            SolidBrush b = new SolidBrush(Color.Red);
            g.DrawString("hello world", new Font("Arial", 26), b, new PointF(20, 20));            
            g.Dispose();
            ReleaseDC(myDC);

Damit lässt sich der Text erfolgreich auf den Desktop schreiben. Wenn ich jetzt aber statt IntPtr.Zero, das Handle des Spiels übergebe, passiert leider gar nichts.

Ich vermute fast, dass ich mit diesen mitteln bei Spielen keine Chance habe. Muss ich dafür selbst das DirectX-SDK nutzen oder wie komme ich am Besten zum Ziel?

19.10.2006 - 14:02 Uhr

Hi,

haste den Thread grade parat oder irgendwelche Anhaltspunkte, wie ich ihn finden kann? Die Suche nach "CPUID" im Forum bringt keine Treffer.

partyboy

18.10.2006 - 23:07 Uhr

Es scheint ein bekanntes Problem zu sein und hier gibts ne Lösung(?) http://support.microsoft.com/kb/894569

Win32 CacheMemory WMI Klasse verwenden, um die MaxCacheSize Eigenschaft zurückzugeben

Weiß jemand was damit anzufangen?

partyboy

18.10.2006 - 22:46 Uhr

Hi,

ich versuche mich daran, den L2 Cache meines Prozessors auszulesen.

Dabei verwende ich folgenden Code:


ManagementObject mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");

    try
    {        
        MessageBox.Show(mo["L2CacheSize"].ToString());
    }
    catch {}
    mo.Dispose();

Leider wird mir immer "0" zurückgeliefert. Der richtige Prozessor ists auf jeden Fall, ich kann erfolgreich die Taktfrequenz mittels WMI auslesen.

Was mache ich falsch?

partyboy

13.10.2006 - 15:12 Uhr

Dankeschön, hab nur eine Seite gecastet (geunboxed?). Jetzt kommt auf beiden Seiten -263192204 raus und der Vergleich klappt.

partyboy

12.10.2006 - 23:04 Uhr

Hm, ein Problem habe ich noch. Wie bekomme ich den Wert jetzt wieder ausgelesen?

rkRun.GetValue("Wert") liefert mir -263192204 zurück, obowohl 4031775092 im Wert drinsteht.

Danke,
partyboy

12.10.2006 - 21:57 Uhr

Ich weiß, aber ich habs wohl falsch angewendet 🤔

12.10.2006 - 21:42 Uhr

Original von Kabelsalat
.Net verhällt sich schon richtig: System.UInt32 ist nicht CLS-Konform und daher wird ein System.Int32-Wert erwartet. Beides sind 32bit Werte und sie können daher exakt die selben (Bit-)Werte aufnehmen - der Unterschied liegt nur in der Interpretation eben dieser. Ein DWORD ist nichts anders als ein unsigned int, was dem zu Folge auch bedeutet, dass z.B. -1 auch als UInt32.MaxValue interpretiert wird. Die passenden Integer-Werte erhälst du mittels unchecked((int)4031775092) [natürlich mit entsprechendem Wert].

you rock!! 👍

Besten Dank, funktioniert wunderbar.

11.10.2006 - 19:45 Uhr

Hi,

leider klappts nicht so einfach. Die Zahl passt nicht in eine int-Variable, es muss uint sein.
uint wird nicht von Microsoft.Win32.RegistryValueKind.DWord unterstützt.

Ich machs über die WinAPI.

partyboy

10.10.2006 - 23:51 Uhr

Hi,

ich wollte die Zahl 4031775092 als Dword in der Registry speichern und habs einfach nicht hinbekommen. Dann lese ich das hier: http://www.pcreview.co.uk/forums/thread-2422811.php

Sehr ärgerlich. Gibts ne Möglichkeit die Zahl trotzdem als dword in die Registry zu kriegen? Muss ich es per API-Call erledigen (hoffentlich gehts damit)?

partyboy

04.10.2006 - 15:10 Uhr

Nein, das war nur eine Lüge, um schneller an Antworten zu kommen 8o

03.10.2006 - 23:48 Uhr

Sorry Leute, ich bin ein Depp X(

Eine andere Funktion hat das Problem ausgelöst, nicht die Regsitry-Schreib-Funktion.

Ich hab ein Testprogramm erstellt, das wirklich nur den Beispielcode ausführt, den ich gepostet hatte und jetzt gehts.

Danke Leute

03.10.2006 - 21:13 Uhr

Hi,

das geht leider nicht, ich muss registry-Einstellungen eines Programmes ändern.

partyboy

03.10.2006 - 18:55 Uhr

arg, hilfe. Wenn ich nicht bald eine Lösung für dieses Problem habe, werde ich von meinem Chef ausgepeitscht. X(

03.10.2006 - 11:34 Uhr

Hi,

das hab ich mir auch schon gedacht, aber ich schreibe nicht in localmachine. Wenn ich es wollte, würde Windows sicherlich diesen "Das Programm xyz will..."-Dialog bringen.

Man, das nervt echt. Wäre super, wenn jemand ne Lösung für das Problem hat.

edit: Es hilft auch nicht, wenn ich mein Programm als Administrator ausführe, mittels rechte Maustaste aufs Programm-Icons "Als Adminstrator ausführen".

partyboy

03.10.2006 - 00:12 Uhr

Hi,

hat schomal jemand von Euch unter Windows Vista auf die Registry zugegriffen (lesen/schreiben)?

Folgendermaßen schreibe ich in die Registry:


            RegistryKey rkHKLM = Registry.CurrentUser;
            RegistryKey rkRun = rkHKLM.OpenSubKey(@"Software\Microsoft\DWM", true);
            if (rkRun == null)
            {
                rkRun = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\DWM");
            }
            rkRun.SetValue("test", 1);
            rkRun.Close();
            rkHKLM.Close();

Unter Windows Xp gibts keinerlei Probleme und unter Windows Vista auch nicht, solange ich mein Programm aus der Entwicklungsumgebung starte.

Wenn ich aber die kompilierte exe starte und die Funktion ausführe, bekekomme ich immer die Fehlermeldung "stopped working" von Windows.

Kennt jemand das Verhalten und weiß Abhilfe?

partyboy

23.09.2006 - 17:31 Uhr

könnt ihr mal sagen, wie ihr den code angepasst habt?

ich kann auch nicht ganz deuten obs bei euch jetzt geklappt hat oder nicht.

23.09.2006 - 15:41 Uhr

Hi,

ich möchte gerne einen upload über eine seite durchführen per httpwebrequest.

Mein 1. Versuch (code ausm forum zusammenkopiert):


//###########
//einloggen
//###########

            string url = string.Format("http://www.die_website.de/user/login.php");
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8";
            request.KeepAlive = true;
            request.ContentType = @"application/x-www-form-urlencoded";
            request.Referer = string.Format("http://www.die_website.de/user/login.php");
            request.CookieContainer = new CookieContainer();


            // Send the log-in data
            string postData = string.Format("user=test&pass=test&submit=Anmelden");
            request.Method = "POST";
            byte[] postBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(postData);
            request.ContentLength = postBuffer.Length;
            Stream postDataStream = request.GetRequestStream();
            postDataStream.Write(postBuffer, 0, postBuffer.Length);
            postDataStream.Close();

            // Get the response
            HttpWebResponse myResponse = (HttpWebResponse)request.GetResponse();

//###########
//datei hochladen
//###########

            url = string.Format("http://www.die_website.de/upload.php");
            request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8";
            request.KeepAlive = true;
            request.ContentType = @"application/x-www-form-urlencoded";
            request.Referer = string.Format("http://www.die_website.de/upload.php");

            // Send the log-in data
            postData = string.Format("datei=C:/test.zip&katid=0&submit=Hochladen");
            request.Method = "POST";
            postBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(postData);
            request.ContentLength = postBuffer.Length;
            postDataStream = request.GetRequestStream();
            postDataStream.Write(postBuffer, 0, postBuffer.Length);
            postDataStream.Close();

            // Get the response
            myResponse = (HttpWebResponse)request.GetResponse();

Es klappt leider nicht. Ich weiß auch nicht, was httpWebResponse zurückliefert, wenns geklappt haben sollte.

vielen dank für eure hilfe!

20.09.2006 - 23:40 Uhr

Klar, dass ich da nicht selbst drauf gekommen bin...

Besten Danke, blackcoin. 👍

@Lord Hessia: Dämlicher Kommentar. Du kennst den Zusammenhang doch überhaupt nicht. Außerdem würde ich bestimmt keine Verknüpfung erstellen, wenn ich den Benutzer mit meinem Programm ausloggen möchte...

partyboy

20.09.2006 - 22:37 Uhr

Hi,

ich habe einen Beispielquellcode gefunden, wie man eine Verknüpfung auf dem Desktop platziert.
Hier zu finden: Google-Groups-Link

Ich möchte aber gerne eine Verknüpfung erstellen, mit der ich den Windows-Benutzer ausloggen kann. Siehe hier: http://www.win-tweaks.de/windows_xp/sicherheit/windows_per_verknupfung_sperren.html

Wenn ich folgendes schreibe, bekomme ich nur einen Dialog, als welchen Benutzer ich das Programm ausführen möchte.


                IWshShell_Class shell = new IWshShell_ClassClass();
                // Define the shortcut file
                IWshShortcut_Class shortcut = shell.CreateShortcut("Lock Workstation" + ".lnk") as IWshShortcut_Class;
                // Set all its properties
                shortcut.Description = "Smart sample of creating shell shortcut";
                
                shortcut.TargetPath = @"C:\Windows\system32\rundll32.exe user32.dll, LockWorkStation";
                shortcut.Arguments = "";
               // shortcut.IconLocation = app + ",0";
                // Save it
                shortcut.Save();

Außerdem wüsste ich gerne, wie ich dem Shortcut ein Icon verpassen kann aus dem shel32.dll-iconset.

Hat jemand Rat?
partyboy

10.09.2006 - 11:25 Uhr

Hi,

ich muss diesen Link wieder aus der Versenkung holen.
Der Aspose-Obfuscator funktioniert mit .net 2.0 nicht mehr und Aspose arbeitet nicht mehr an diesem Projekt.

Hat jemand kostenlose alternativen für .net 2.0 C#-Obfuscatoren?

Ich benutze die Visual Studio 2005 C# Express.

partyboy

12.08.2006 - 00:03 Uhr

Hi,

ich möchte gerne in eine Textbox (multiline=true) Strings ziehen können und zwar an die Position über dem Mauszeiger, bzw. die Cursorposition.

Normales Drag&Drop ist kein Problem, nur im DragDrop-Event der Textbox folgenden Code:

textBox1.Text += e.Data.GetData(DataFormats.Text).ToString();

Dadurch wird natürlich der "gedroppte" Text an den bestehenden Text der textBox gehängt.

Ich möchte aber, dass der Text dorthin gedroppt wird, wo sich der Mauszeiger befindet.

Wie kann ich das realisieren?

EDIT: So kann ich den Text dahin droppen, wo sich der Cursor zuletzt befunden hat:
textBox1.SelectedText = e.Data.GetData(DataFormats.Text).ToString();

Ich möchte aber gerne, dass beim Draggen der Cursor in der TextBox sichtbar ist und mit der Maus mitwandert.

partyboy

06.08.2006 - 22:08 Uhr

Original von inTrance

>

Funktioniert super! 👍

Schade, dass sich das DataGridView nicht von Haus aus so verhält.

partyboy

06.08.2006 - 21:21 Uhr

Hi,

ich habe in einem DataGridView eine Spalte mit Comboboxes.
Um eine Combobox aufzuklappen, muss man zweimal auf die Combobox klicken, was mich ziemlich nervt.
Ich denke, dass mit dem ersten Klick die Zeile markiert wird und mit dem zweiten Klick wird erst die Combobox angesprochen (reine Theorie!).

Wie kann ich es bewerkstelligen, dass nur ein Klick notwenig ist, um die Combobox aufzuklappen?

partyboy

06.08.2006 - 12:47 Uhr

Hi herbivore,

ich nutze .net 2.0. Ich habe jetzt ein Dictionary erstellt und gefüllt.

Folgendermaßen hole ich mir den Key eines Values:


                foreach (KeyValuePair<string, string> kvp in meinDictionary)
                {                    
                    if (meinString == kvp.Value)
                    {
                        meinString = kvp.Key;
                        break;
                    }
                }

Geht das nicht eleganter? Ich habe gehofft, dass es eine Funktion gibt, bei der ich einfach den Value angebe und mir wird der Key zurückgeliefert.

partyboy

06.08.2006 - 10:52 Uhr

Hi,

ich habe eine Hashtable mit Zuordnungen. Über den Key rufe ich dessen Value ab, was auch super klappt.

Jetzt möchte ich aber über den Value an den Key ran. In meinem speziellen Fall sind die Values ebenso einmalig, wie die Keys.

Wie kann ich das realisieren, oder ist eine Hashtable die falsche Wahl für mein Vorhaben?

partyboy

02.08.2006 - 23:38 Uhr

Hi Traumzauberbaum,

vielen Dank, es klappt wunderbar!

partyboy

31.07.2006 - 21:43 Uhr

Hi,

auf die Schnelle hab ich das hier getestet:


            dataGridView1.DataSource = dataSet1;
            dataSet1.Tables.Add("tabelle1");
            dataSet1.Tables["tabelle1"].Columns.Add("spalte1");
            dataSet1.Tables["tabelle1"].Columns.Add("spalte2");
            DataRow dr = dataSet1.Tables["tabelle1"].NewRow();
            dr["spalte1"] = "hallo";
            dr["spalte2"] = "du da";
            dataSet1.Tables["tabelle1"].Rows.Add(dr); 

..leider ohne Erfolg.
Soll durch das Binding (dataGridView1.DataSource = dataSet1😉 gewährleistet werden, dass im DataGridView, die Daten sichtbar werden, sobald man z.B. eine neue Row im DataSet hinzugefügt hat?

Es wird im datagridview nichts dargestellt.

Ich habe mit dem Designer im datagridview eine Spalte mit Checkboxen und eine Spalte mit Comboboxen eingerichtet. Wie bringe ich solche "speziellen" Spalten ins DataSet?

Vielen Dank für Deine Hilfe,
partyboy

31.07.2006 - 21:12 Uhr

Hi,

dem DataGridView liegt kein DataSet zugrunde.
Ich fülle das DataGrid einfach mit Rows.Add()...
Der Benutzer kann nach dem Füllen aber die Werte der einzelnen Zellen ändern, z.B. die Auswahl der Comboboxen ändern.

Wie kann ich denn per DataBinding ein GridView an ein DataSet binden?

Hilft mir das, um später mittels dataset.writexml(pfad) den DataGridView-Inhalt zu speichern?

partyboy

31.07.2006 - 18:20 Uhr

Hi,

ich muss für eine Update-Funktion auch mein Programm neustarten.
Ich benutze dafür eine batch-Datei, die als Resource in der exe untergebracht ist.

Sobald das Update abgeschlossen ist, wird die bat-datei erzeugt, gestartet und das programm beendet.
Die bat-datei versucht nun solange die exe zu löschen, bis sie es geschafft hat (sie schafft es nicht, solange die exe noch beim beenden ist, logisch). dann überschreibt sie die alte exe mit der neuen exe, startet die neue exe und löscht sich selbst.

nach diesem verfahren kannst du auch vorgehen.

partyboy

30.07.2006 - 21:54 Uhr

Hi,

ich möchte gerne ein DataGridView als XML-Datei speichern und später wieder laden.
Dem DataGridView liegt kein DataSet zugrunde, ich fülle es 'per Hand'.

Mir ist klar, dass ich ein Dataset per DataSet.WriteXML(pfad) speichern kann. Wie bekomme ich aber das DataGridView in ins DataSet?

partyboy

29.07.2006 - 21:37 Uhr

Hi herbivore,

ich meinte natürlich EventHandler.

Hab deine Anweisungen beachtet und es klappt jetzt wunderbar. 👍

partyboy

29.07.2006 - 20:52 Uhr

Hi herbivore,

vielen Dank, ich habs jetzt gelöst.

Ich bin mir aber nicht sicher, ob meine Lösung jetzt auch sauber ist.

Ich habe es folgendermaßen gelöst:

Im UserControl ist ein Button. In der MainForm ist ein Event für Button.Click des Buttons im UserControl. Im Button_Click-Event hole ich mir den Wert aus dem Control im UserControl. Das Control im UserControl muss dafür natürlich Public sein (oh oh).

Was ist denn die Referenzlösung dafür? Oder ist das so in Ordnung? ?(

partyboy

29.07.2006 - 16:36 Uhr

Hi herbivore,

danke für Deine Antwort.

Ich komme leider mit deinem Hinweis nicht weiter. Die ganze Sache verkompliziert sich noch, da ich das UserControl nicht direkt aus MainForm öffne, sonder über eine andere Klasse. Ich benutze eine Klasse, die das UserControl in einem Popup öffnet.

Ich schließe das UserControl mit this.Parent.Hide(); und weiß nicht, nicht auf welches Event ich dann in MainForm reagieren muss.

Ich habe mal ein Beispiel angehängt. Dadurch wird es etwas klarer.

Vielen Dank,
partyboy

29.07.2006 - 04:13 Uhr

Hi,

ich habe ein UserControl und möchte gerne auf eine andere Klasse zugreifen, in meinem Fall MainForm.

Ich habe bereits MainForm zu einer Singleton-Klasse gemacht, trotzdem bekomme ich aber keinen Zugriff.

Ich möchte von einem Usercontrol auf ein Control in der MainForm-Klasse zugreifen.

Falls es nur über Events geht, welches Event wird beim schließen des Usercontrols ausgelöst? Ein Closed- oder FormClosed-Event habe ich nicht gefunden.

Für jede Hilfe bin ich dankbar,
partyboy

27.07.2006 - 22:44 Uhr

Hi,

Frage 1 hat sich erledigt. Es reicht in meinem Fall, die Combobox zur Entwicklungszeit zu füllen.

Die anderen Fragen sind noch offen.

  • Wie kann ich eine Vorselektierung der Combobox festlegen? (ERLEDIGT)

  • Wie kann fürs DataGridView festlegen, welche Spalte beim Programmstart sortiert sein soll?

EDIT: Die Frage mit der Vorselektierung hat sich auch erledigt.

partyboy

22.07.2006 - 20:00 Uhr

Original von ikaros
Einfaches App.Exit ist oft zu hart, bei Datenformularen.

Hi ikaros,

was könnte denn schlimmstenfalls passieren? Ich gehe immer sehr großzügig mit Application.Exit() um 8o

partyboy

22.07.2006 - 19:39 Uhr

Hi,

wenn Form1 dein Hauptformular ist, mach doch einfach Application.Exit(); in deinem Event.

Ansonsten sehe ich die Möglichkeit, Form1 als Singleton zu machen und dann per Form1.GetInstance().Close(); zu schließen.

partyboy

22.07.2006 - 18:31 Uhr

Hi,

ich habe in einem DataGridView eine Spalte mit Comboboxen.

Dazu habe ich nun ein paar Fragen.

1. Wie kann ich die Comboboxen zur Laufzeit füllen?

Ich füge so eine neue Row hinzu:


string[] rowToAdd = { "hallo", "du da" };
monitorServicesGridView.Rows.Add(rowToAdd);

Meine dritte Spalte ist vom Typ Combobox, wie kann ich der Combobox darin Werte zuweisen?

2. Wie kann ich einen Startwert für die Combobox festlegen?

Ich möchte gerne, dass ein Wert der Combobox voreingetragen ist. Momentan ist es so, dass die Combobox beim Programmstart nichts ausgewählt hat.

3. Wie kann fürs DataGridView festlegen, welche Spalte beim Programmstart sortiert sein soll?

partyboy

06.07.2006 - 12:53 Uhr

Hi,

wie bekomme ich Zugriff auf Windows-Funktionen, wie die Fehlerberichterstattung?
Die Fehlerb. liegt u.A. als Dienst vor, den ich auch schon startet und stoppen kann per C#, es gibt aber auch noch eine weitere Stelle, von der man die Fehlerb. an- und abschalten kann.
Eigenschaften vom Arbeitsplatz --> Erweitert --> Fehlerberichterstattung.

Wie bekomme ich grundlegend Zugriff auf solche Einstellungen? In meinem speziellen Fall möchte ich gerne die Fehlerberichterstattung deaktivieren.

partyboy

28.06.2006 - 19:58 Uhr

Hi,

tut mir leid, ich habe mich falsch ausgedrückt. Ich wollte wissen, ob ich irgendwie auf die Exception von File.Copy reagieren kann, die geworfen wird, wenn die Datei bereits vorhanden ist.

Oder ist der einfachste (vielleicht auch einzige) Weg der, dass ich in der Schleife vorher per File.Exists teste, ob die Datei schon exisitert?

Jetzt erst merke ich, wie blöd meine Frage doch eingentlich ist...

partyboy

28.06.2006 - 19:38 Uhr

Hi,

ich benutze folgede Funktion um alle per OpenFileDialog gewählten Dateien in ein Verzeichnis zu kopieren.
Sollte es eine Datei bereits im Zielverzeichnis geben, möchte ich dem Benutzer gerne die Möglichkeit geben, zu wählen, ob er die Datei überschreiben will.

Mein bisheriger Code zum kopiereren von ausgewählten Dateien in ein Verzeichnis:


            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Multiselect = true;
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    foreach (string currFileName in openFile.FileNames)
                    {
                        File.Copy(currFileName, "C:\\test\\"+Path.GetFileName(currFileName));                    
                    }
                }

Wie realisiere ich nun den "Wollen, Sie die Datei überschreiben?"-Dialog?

partyboy

18.06.2006 - 03:34 Uhr

Hi marsgk,

dein Beispiel hat mir bisher sehr geholfen.
Wenn ich eine Textbox in ein Tabcontrol stecke, stört sich dein Beispielcode an folgender Stelle:


            c = Controls[controlName];
            type = c.GetType();

c ist dann null.

Ich habe naiver weise versucht es mit c = tabControl1.Controls[controlName]; zu lösen, was leider nicht geklappt hat.

Hast du noch einen Ratschlag dafür?

partyboy

09.06.2006 - 21:57 Uhr

editHi marsgk,

kann man auch die Position der Controls außenvor lassen?

Eine unelegante Notlösung dafür wäre, sich vorher die Position zu merken, dann durch deine Funktion die Werte zuzuweisen und wieder die gemerkten Positionen benutzen.

Wie hast du die XML-Datei denn erstellt?

Vielen Dank für den ganzen Quellcode 👍

Besten Gruß,
partyboy

09.06.2006 - 20:07 Uhr

Hi Friedel,

ich habs jetzt so umgesetzt und es klappt auch wunderbar:

            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<CheckBoxOptions>));
            FileStream fs = new FileStream("C:\\testCB.xml", FileMode.Open);
            List<CheckBoxOptions> checkboxen = (List<CheckBoxOptions>)serializer.Deserialize(fs);
            foreach (CheckBoxOptions cb in checkboxen)
            {
                foreach (Control ctl in MainForm.ActiveForm.Controls)
                {
                    if (ctl is CheckBox)
                    {
                        if (ctl.Name == cb.Name)
                        {
                           ((CheckBox)ctl).Checked = cb.IsChecked;
                        }
                    }
                }
            }
            fs.Close();

Geht das vielleicht eleganter? Der Name der aktuellen Checkbox ist mir schließlich über cb.Name bekannt.

Ich würde gerne in die selbe XML-Datei zusätzlich Inhalte von TextBoxen speichern. Ich habe schon etwas rumprobiert und mir ne TextBoxOptions-Klasse, sowie eine Liste erzeugt, aber wie bekomme ich sie in die selbe XML-Datei serialisiert?

Besten Gruß,
ravel