Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Programmierhans
Thema: html in form ausführen
Am im Forum: GUI: Windows-Forms

Sofern du nur was anzeigen willst (keine Interaktion zu deinem Form) und es dir zudem egal ist, dass es eine COM-Komponente ist, dann nimm doch:

Microsoft Webbrowser Control (%WINDIR%\system32\shdocvw.dll)

Thema: Teil eines Strings auslesen
Am im Forum: Netzwerktechnologien

Zitat
Original von Noodles

string fileName = Path.GetFileName( path );

10 Punkte für Noodles :-)

Wieso kompliziert wenns auch einfacher geht...

Thema: Teil eines Strings auslesen
Am im Forum: Netzwerktechnologien

string str;

str.LastIndexOf(@"\"); liefert die position des letzen \

str.Substring(.....) liefert dann den gewünschten Teil...

Die Parameter kannst Du ja selber nachschauen

Thema: AsyncCallback Fehler ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also ich würde auf den TcpListener ausweichen...

Zudem Asynchrone Vorgänge nur starten wenn Du sicher bist, dass du diese auch beenden kannst....

Den Accept würde ich in einem eigenen Thread laufen lassen....

So in etwa wiefolgt: (ist nich vollständig getestet .... aber so in diese Richtung)


		private bool _Shutdown=false;
		private Thread _ThreadListen;
		private GotConnectionDelegate _ConnDel;
		private void GotConnection(Socket pSock)
		{
			//mach was damit :-)
		}


		private void StartListenInternal()
		{
			if (_ConnDel==null)
			{
				_ConnDel=new GotConnectionDelegate(this.GotConnection);
			}
			IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];
			TcpListener tcpListener =  new TcpListener(ipAddress, 8085);
			tcpListener.Start();

			while(!this._Shutdown)
			{
				if (tcpListener.Pending())
				{
					System.Diagnostics.Debug.WriteLine("Accepting Connection");
					Socket sockIn=tcpListener.AcceptSocket();
					this.Invoke(this._ConnDel,new object[]{sockIn});
				}
				else
				{
					System.Diagnostics.Debug.WriteLine("No connection pending");
					Thread.Sleep(100);
				}
			}
			System.Diagnostics.Debug.WriteLine("Stopping Listen-Mode");
			tcpListener.Stop();
			tcpListener=null;
			System.Diagnostics.Debug.WriteLine("Listen-Mode stopped");
		}

		private void btnListen_Click(object sender, System.EventArgs e)
		{
			if (this._ThreadListen==null)
			{
				this.btnListen.Enabled=false;
				this._Shutdown=false;
				this._ThreadListen=new Thread(new ThreadStart(this.StartListenInternal));
				this._ThreadListen.Name="TcpListener on Port xy";
				this._ThreadListen.Start();
			}
		}

		private void btnShutdown_Click(object sender, System.EventArgs e)
		{
			this._Shutdown=true;
			//warte bis der Listen-Thread sich verabschiedet
			this._ThreadListen.Join();
			this._ThreadListen=null;
			this.btnListen.Enabled=true;
		}

		private delegate void GotConnectionDelegate(Socket pSock);

Thema: AsyncCallback Fehler ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

cl_soc_listener

dieser bleibt offen weil du den Asynch nicht beendet hast...

Stichwort: EndAccept

Thema: Thread-Synchronisation
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Du hast da ein sehr interessantes Thema aufgeworfen.

Punkt 1: lock

Der lock ist zwingend erforderlich, da nur so sichergestellt werden kann, dass kein anderer Thread auf die ArrayList zugreift.

Punkt 2:

ArrayList.Synchronized liefert zwar eine synchronisierte ArrayList.... diese muss aber trotzdem gelocket werden.

Da ich das Thema interessant finde, habe ich mal einen kurzen Test aufgebaut.


		private static ArrayList _ArrToTest;
		private static int _Version=0;
		private static bool _WeHaveAProblem=false;

		private void button1_Click(object sender, System.EventArgs e)
		{
			this.button1.Enabled=false;
			_ArrToTest=new ArrayList();
			
			//Version 1
			_Version=3;

			Thread thr1=new Thread(new ThreadStart(Create));
			Thread thr2=new Thread(new ThreadStart(DoInsert));
		
			thr1.Start();
			thr2.Start();
			
		
			do
			{
				Application.DoEvents();
			}while(thr1.IsAlive && !thr1.Join(10));

			do
			{
				Application.DoEvents();
			}while(thr2.IsAlive && !thr2.Join(10));

			if (!_WeHaveAProblem)
			{
				MessageBox.Show("The Eagle has landed");
			}
			this.button1.Enabled=true;
		}

		private void ShowProblem()
		{
			_WeHaveAProblem=true;
			MessageBox.Show(string.Format("Housten we have a problem with Version {0}",_Version));
		}

		private void InvokeShowProblem()
		{
			DelInvokeShowProblem del=new DelInvokeShowProblem(this.ShowProblem);
			this.Invoke(del,null);
		}
		private delegate void DelInvokeShowProblem();

		private void DoInsert()
		{
			switch (_Version)
			{
				case 1:
					if (!_ArrToTest.Contains(900000))
					{
						System.Threading.Thread.Sleep(1000);
						if (_ArrToTest.Contains(900000))
						{
							InvokeShowProblem();
						}
					}
					break;
				case 2:
					lock(_ArrToTest)
					{
						if (!_ArrToTest.Contains(900000))
						{
							System.Threading.Thread.Sleep(1000);
							if (_ArrToTest.Contains(900000))
							{
								InvokeShowProblem();
							}
						}
					}
					break;
				case 3:
					ArrayList arrSynched=ArrayList.Synchronized(_ArrToTest);
					lock(arrSynched.SyncRoot)
					{
						if (!arrSynched.Contains(900000))
						{
							System.Threading.Thread.Sleep(1000);
							if (arrSynched.Contains(900000))
							{
								InvokeShowProblem();
							}
						}
					}
					break;
			}
		}


		private static void Create()
		{
			switch (_Version)
			{
				case 1:
					for(int i=0;i<1000000;i++)
					{
						_ArrToTest.Add(i);
					}
					break;
				case 2:
					lock(_ArrToTest)
					{
						for(int i=0;i<1000000;i++)
						{
							_ArrToTest.Add(i);
						}
					}
					break;
				case 3:
					ArrayList arr=ArrayList.Synchronized(_ArrToTest);
					lock(arr.SyncRoot)
					{
						for(int i=0;i<1000000;i++)
						{
							arr.Add(i);
						}
					}
					break;
			}
		}




In diesem Beispiel sieht man relativ schnell, dass man ohne Lock tot ist.

In der Version 3 kann man auch mal probieren wie es sich verhält, wenn man die synchronisierte Version lockt (anstelle deren SyncRoot) (also lock (arr) statt lock(arr.Syncroot).... man ist auch tot.


Was lernen wir daraus:

- Zugriffe mit einem Mutex (lock tuts auch) schützen
- Während Iterationen (Enumerator) ArrayList locken

Thema: Überprüfen ob Programm läuft
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich hab Dir mal ein paar Beispiele zusammengewuzzelt...


		[System.Runtime.InteropServices.DllImport("user32.dll")]
		private static extern int SetForegroundWindow(IntPtr pHandle);

		[System.Runtime.InteropServices.DllImport("user32.dll")]
		private static extern bool IsIconic(IntPtr pHandle);

		[System.Runtime.InteropServices.DllImport("user32.dll")]
		private static extern int OpenIcon(IntPtr pHandle);


		private void btnActivateAllCalculators_Click(object sender, System.EventArgs e)
		{
			string strProcName="Calc";
			if (IsProcessRunning(strProcName))
			{
				Process myProcess=Process.GetCurrentProcess();
				Process[] procs = Process.GetProcessesByName(strProcName);
				foreach (Process p in procs)
				{
					if (p.Id!=myProcess.Id)
					{
						if (IsIconic(p.MainWindowHandle))
						{
							OpenIcon(p.MainWindowHandle);
						}
						SetForegroundWindow(p.MainWindowHandle);
					}
				}
			}
			else
			{
				Process p=Process.Start(strProcName);
			}
		}
		public static bool IsMyProcessRunning
		{
			get
			{
				bool isRunning=false;
				Process myProcess=Process.GetCurrentProcess();
				foreach (Process p in Process.GetProcessesByName(myProcess.ProcessName))
				{
					if (p.Id!=myProcess.Id)
					{
						isRunning=true;
						break;
					}
				}
				return isRunning;
			}
		}

		public static bool IsProcessRunning(string pProcessName)
		{
			return Process.GetProcessesByName(pProcessName).Length>0;
		}

Thema: ArrayList serialisieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Jage das Ding mal durch diese TestMethode:



		private object TestSerializer(object obj)
		{

			//Opens a file and serializes the object into it in binary format.
			Stream stream = File.Open("data.xml", FileMode.Create);

			BinaryFormatter formatter = new BinaryFormatter();

			formatter.Serialize(stream, obj);
			stream.Close();
   
			//Empties obj.
			obj = null;
   
			//Opens file "data.xml" and deserializes the object from it.
			stream = File.Open("data.xml", FileMode.Open);

			formatter = new BinaryFormatter();

			obj = formatter.Deserialize(stream);
			stream.Close();

			return obj;
		}

		private void button1_Click(object sender, System.EventArgs e)
		{
			//Ein Test-Objekt
			Class1 cls=new Class1();
			cls.ArrayList.Add("Hans");

			//durch den Tester jagen
			Class1 obj=this.TestSerializer(cls) as Class1;

			//ist der Hans noch da ?
			MessageBox.Show(obj.ArrayList[0].ToString());
		}


Thema: picturebox scrollen
Am im Forum: GUI: Windows-Forms

objekt.AutoScroll=true;

Thema: RowStatus = Added wird nicht bemerkt
Am im Forum: Datentechnologien

Zitat
Original von Vexta
Zitat


private DsPerson.PersonRow CurrentPersonRow
{
	get
	{
		DsPerson.PersonRow ret=null;
		CurrencyManager cmPerson=this.CmPerson;
		if (cmPerson.Position>-1)
		{
			ret=(cmPerson.Current as DataRowView).Row as DsPerson.PersonRow;
		}
		return ret;
	}
}
Hier komme ich nicht ganz klar, was bedeutet dieser Code, besonders die Zeile mit "ret =..." - und was bezweckst du damit?

Der Rest im Closing ist soweit klar, auch dein anderes Posting ist sehr hilfreich!
Nochmals vielen Dank, die Geschichte mit dem BindingContext ist mir wieder etwas klarer geworden.
Ich hoffe noch mehr Antworten von dir zu bekommen...

Gruß
Vexta

Dieses Property dient dazu schnellen sicheren Zugriff auf die aktuelle Row des CurrencyManagers der Tabelle Person sicherzustellen (auch wenn er auf einer Row sitzt, welche noch nicht attached ist....

Wenn Du solche Sachen kapselst tippst Du nachher bei der Verwendung weniger und musst auch Fehler nur an einer Stelle korrigieren....

beim ret=... handelt es sich um den return - Value dieses Properties, welches mit null inizialisiert wird, und dann überschrieben wird, falls der cm auf einer Row sitzt.... wenn der cm auf keiner Row sitzt wird null zurückgegeben

Thema: Standardwert von Eigenschaften festlegen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

ResetFarbe wird vom Designer aufgerufen wenn du im PropertySheet auf der Eigenschaft Farbe im ContextMenü Reset wählst.

Thema: RowStatus = Added wird nicht bemerkt
Am im Forum: Datentechnologien

Das wichtigste überhaupt wenn man mit DataBinding arbeitet:

- Immer dieselben Parameter verwenden um den CurrencyManager zu holen.


this.BindingContext[dsGebTag1, "gebTag"];

//gibt nicht denselben CurrencyManager zurück wie

this.BindingContext[dsGebTag1.Tables["gebTag"],""];



this.BindingContext ist ein Indexer welcher einen BindingManagerBase (die BaseClass von CurrencyManager / PropertyManager) zurückliefert. Falls noch keiner existiert, so wird einer erstellt.

Um auf Dein Beispiel zurückzukommen.... der eine CurrencyManager sitzt auf der soeben erstellten Row (Position > -1)..... der andere aber nicht (der hat nicht mal mitbekommen dass bereits eine Detached - Row existiert.... weiss demzufolge auch nichts von Aenderungen....)

Auch das DataSet weiss noch nichts von den Aenderungen, da die Row noch Detached ist..... erst wenn die Row attached wird gibt HasChanges auch ein true zurück.

Uebrigens gibts HasChanges glaub auch auf TabellenEbene.

Somit immer:

--> Alle CurrencyManagers mit Position > -1 mit EndCurrentEdit abschliessen
--> Für die Tabellen oder einfacher für das DataSet HasChanges abfragen
--> User fragen ob gesichert werden soll (bei nein Ds.RejectChanges)
--> DB saven
--> bei Erfolg DataSet.AcceptChanges

Zugegeben das Beispiel ist ein wenig komlexer als nötig.... mir war es aber wichtig hier mal die Zusammenhänge aufzuzeigen.... denn man dort sooooo viel falsch machen (habe da schon die unmöglichsten Sachen gesehen)

Thema: sicheres Repaint
Am im Forum: GUI: Windows-Forms

Hast Du dich in den Paint des Forms oder des Panels eingeklinkt ?

Verwendest Du Anchor oder Dock mit diesem Panel ?

Greifst Du auf pan.ClientRectangle zu oder auf e.ClipRectangle ?

Schau Dir mal bitte den folgenden Code an... der läuft so wie ich dies erwartet habe.... kann Deinen Fehler nicht nachvollziehen...


private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
		{
			using(Graphics g=e.Graphics)
			{
				Rectangle rect=this.panel1.ClientRectangle;
				Font fnt=new Font(this.panel1.Font.FontFamily,12);
			
				g.FillRectangle(Brushes.Blue,rect);
				g.DrawString("Test",fnt,Brushes.Yellow,rect);
				System.Diagnostics.Debug.WriteLine("Paint");
			}
		}

Thema: DataGrid und Zellen formatieren
Am im Forum: GUI: Windows-Forms

Gibts dort keine TableStyles/DataColumnStyles auf dem Datagrid ?

Thema: RowStatus = Added wird nicht bemerkt
Am im Forum: Datentechnologien


		private CurrencyManager CmPerson
		{
			get
			{
				return this.BindingContext[this.dataGrid1.DataSource,this.dataGrid1.DataMember] as CurrencyManager;
			}
		}

		private DsPerson.PersonRow CurrentPersonRow
		{
			get
			{
				DsPerson.PersonRow ret=null;
				CurrencyManager cmPerson=this.CmPerson;
				if (cmPerson.Position>-1)
				{
					ret=(cmPerson.Current as DataRowView).Row as DsPerson.PersonRow;
				}
				return ret;
			}
		}

		private void btnAddNewPerson_Click(object sender, System.EventArgs e)
		{
			CurrencyManager cmPerson=this.CmPerson;
			cmPerson.AddNew();
			//um noch was zu verändern (dynamische DefaultWerte oder so)..
			DsPerson.PersonRow currentRow=CurrentPersonRow;
			currentRow.Name="Hans";
		}

		private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
		{
			CurrencyManager cmPerson=this.CmPerson;
			if (cmPerson.Position>-1)
			{
				cmPerson.EndCurrentEdit();
			}
			if (this.dsPerson1.HasChanges())
			{
				if (MessageBox.Show("Save changes ?","Save",MessageBoxButtons.YesNoCancel)==DialogResult.Yes)
				{
					//in DB saven


					//wenn DB-saven ok war würde hier stehen
					//this.dsPerson1.AcceptChanges();

					//bei Fehler beim speichern 
					//e.Cancel=true;
				}
				else
				{
					//ist hier nicht relevant da das Form eh geschlossen wird
					//Alle Aenderungen verwerfen
					//this.dsPerson1.RejectChanges();
				}
			}
		}

		private void Form1_Load(object sender, System.EventArgs e)
		{
			this.dsPerson1.Person.AddPersonRow("Test");
			this.dsPerson1.AcceptChanges();
		}

Thema: Standardwert von Eigenschaften festlegen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Für Properties mit Typen welche per DefaultValue nicht gesetzt werden können:

//die interne Variable mit dem DefaultValue
private Color _Farbe=Color.Red;

//das Property (ohne DefaultValueAttribute)
public Color Farbe
{
get{return this._Farbe;}
set{this._Farbe=value;}
}

//die Reset-Methode damit das Teil im Designer geresettet werden kann
//diese darf private sein
private void ResetFarbe()
{
this._Farbe=Color.Red;
}

Thema: Rechner anpingen mit C#
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ein gutes lauffähiges Sample findest Du hier:

http://www.codeproject.com/useritems/CSharpPing.asp

Thema: 2 Suchfelder, 2 ComboBoxen --> Problem
Am im Forum: GUI: Windows-Forms

Dein Code öffnet so aber Tür und Tor für SQL-Injection....

Was ist das ?

--> http://www.codeproject.com/cs/database/SqlInjectionAttacks.asp

Thema: Programmgesteuerte Positionierung einer ScrollBar
Am im Forum: GUI: Windows-Forms

Point ist eine Struktur und somit kein ReferenceType

Point p=this.AutoScrollPosition liefert somit zwar den Point zurück, dieser hat jedoch keiner Verbindung zum Point welcher hinter dem Property AutoScrollPosition hinterlegt ist.

Im Prinzip könnte Y auf diesem Point verändert werden.... dies würde jedoch nur diese lokale Kopie verändern. .... diesen veränderten Point müsste man dann wieder der AutoScrollPosition zuweisen.

Da Du den Point aber gar nie in einer Variable zwischengespeichert hast, merkt dies der Compiler und verweigert dies mit einem CS1612

folgender Code würde laufen:

Point p= this.AutoScrollPosition; //in Variable speichern
p.Y+=10; //Verändern
this.AutoScrollPosition=p; //wieder zuweisen

Alles unklar ?

Thema: "Fixieren" von UserControls
Am im Forum: GUI: Windows-Forms

mach es doch so(fixe Höhe von 80):

protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
base.SetBoundsCore (x, y, width, 80, specified);
}

Thema: Programmgesteuerte Positionierung einer ScrollBar
Am im Forum: GUI: Windows-Forms

AutoScrollPosition ist nicht schreibgeschützt....

Erstelle einen neuen Point und weise diesen der AutoScrollPosition zu

this.AutoScrollPosition=new Point(this.AutoScrollPosition.X,this.AutoScrollPosition.Y+10);

wobei Du this noch durch Dein Objekt ersetzen musst.