Laden...

Forenbeiträge von Laubi Ingesamt 20 Beiträge

14.09.2005 - 16:22 Uhr

du kannst einfach die print methode aufrufen. musst aber aufpassen weil gewisse Versionen vom IE haben einen Bug weswegen man zuerst den Focus auf das entsprechende Frame setzen muss mit ...focus()

05.08.2005 - 19:20 Uhr

stimmt! jetzt weiss ich auch wieso ich es zuerst umgekehrt hatte =) danke!

20.07.2005 - 14:43 Uhr

wieso nicht String.Join verwenden? dann musst du keine Schlaufe verwenden

13.07.2005 - 18:39 Uhr

ist ja logisch dass das nicht geht..

dein panel hat bei Docking "Fill" drin!

05.07.2005 - 10:09 Uhr

aber musst du das wirklich immer im Resize ausführen? Würde es nicht genügen den von dir geposteten Code einmal auszuführen?

24.06.2005 - 11:19 Uhr

Wenn du sagst du hast es schon mit einfachen Anführungszeichen versucht wo lag da das Problem? Eine Fehlermeldung?

Und sorry das hier:

string suchname = "testle";
MessageBox.Show("SELECT * FROM dvds WHERE titel REGEXP \""  + suchname + "$\"");

gibt ganz sicher das hier:
SELECT * FROM dvds WHERE titel REGEXP "testle$"
und zwar ohne Backslahses drin..

24.06.2005 - 07:45 Uhr

doch gibts.. ist aber schwierig zu finden (per google)

http://sourceforge.net/projects/camstudio

ist soweit ich weiss das original produkt von rendersoft vor der übernahme.

23.06.2005 - 23:07 Uhr

Hi

Folgende Ideen dazu:

  1. MySQL erlaubt es auch einfache Anführungszeichen zu verwenden..

  2. Mach doch mal eine Trace Meldung oder eine Message Box auf dein Query und schau obs überhaupt korrekt generiert wird. Wenn ja prüfe ob es im MySQL Query Editor läuft..

  3. Ich denke das müsste so aussehen:

SELECTDVDsuchnameREGEX.CommandText = "SELECT * FROM dvds WHERE titel REGEXP \""  + suchname + "\"$";
23.06.2005 - 18:33 Uhr

Okay wenn es als komponente im Design angezeigt wird.. Kenn mich mit dem Gebiet halt gar nicht aus.

Ich habe versucht die Höhe eines einzelnen Elementes zu ändern. ListBox kennt hier die Botschaft WM_MEASUREITEM, doch leider gibts das nicht bei einem TreeView. Wenn also jemand eine Idee hat wie ich das doch hinkriegen.. Ich wäre dankbar darum!

23.06.2005 - 17:11 Uhr

DataSource hab ich immer auf das dataset gesetzt. DataMembers wie folgt:

ComboBox1: Master.NAME
--Grid1: Master.ChildTab1
--Grid2: Master.ChildTab2
--ComboBox2: Master.ChildTab3.NAME
----Grid3: Master.ChildTab3.SubChildTab

Relationen müssten korrekt sein. Nehm ich mal an weil man alles schön per ComboBox und Grid auswählen kann..

@FZelle: Schon klar dass das RDBMS eine Rolle spielt aber ich meinte: Spielt keine Rolle weil ich das auch ohne Npgsql versucht habe 😉

@Beat: Wieso explizit zu CurrencyManager casten? Ansonsten hab ich es ja gleich gemacht.. Nebenfrage: Wieso mit "as" casten und nicht mit (CurrencyManager)? In diesem Fall könnte dein Beispiel doch eine NullPointerException auslösen, was meistens nicht besonders viel sagt..?

23.06.2005 - 09:42 Uhr
  1. Okay macht eigentlich Sinn.. Hab das so aus einem Beispiel und mir dabei gar nichts überlegt..

  2. Spielt eigentlich keine Rolle, Problem tritt immer auf.. Und zwar immer dann wenn eine Tabelle gleichzeitig einen FK (die zweite ComboBox ist ein Child von der Ersten) und PK hat (ComboBox2 ist Parent von Grid 3) Ich hab die Commands auch schon per ComandBuilder erstellen lassen und das Verhalten war das Gleiche!

  3. Jep.. Spielt aber auch keine Rolle..

22.06.2005 - 23:32 Uhr

was noch fehlt: *item höhe kann man nicht ändern *ich hab ein paar cast's im code die man zur sicherheit ev. prüfen sollte *ist kein control..

22.06.2005 - 23:25 Uhr

hab die lösung.. dauerte zwar ca. 30min aber war eigentlich doch einfacher als ich erwartet habe (okay hatte auch eine schöne api vorlage)

/*
 * Created by SharpDevelop.
 * User: Laubi
 * Date: 22.06.2005
 * Time: 22:52
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CustomTreeView
{
	/// <summary>
	/// Description of TreeViewEx.
	/// </summary>
	public class TreeViewEx: TreeView
	{
		[StructLayout(LayoutKind.Sequential)]
		private struct NMHDR
		{
		      internal IntPtr hwndFrom;
		      internal IntPtr idFrom;
		      internal int code;
		}
		 
		[StructLayout(LayoutKind.Sequential)]
		private struct RECT
		{
		      internal int left;
		      internal int top;
		      internal int right;
		      internal int bottom;
		}
		 

		[StructLayout(LayoutKind.Sequential)]
		private struct NMTVCUSTOMDRAW
		{
		      internal NMCUSTOMDRAW nmcd;
		      internal int clrText;
		      internal int clrTextBk;
		      internal int iLevel;
		}
		 

		[StructLayout(LayoutKind.Sequential)]
		private struct NMCUSTOMDRAW
		{
		      internal NMHDR hdr;
		      internal int dwDrawStage;
		      internal IntPtr hdc;
		      internal RECT rc;
		      internal IntPtr dwItemSpec;
		      internal int uItemState;
		      internal IntPtr lItemlParam;
		}
		 


		public TreeViewEx()
		{
		}
		
		private void DrawNode(TreeNode node, Graphics g)
		{
			// wieso gibts hier leere nodes??
			if (node == null) return;
			
			Pen pen = new Pen(System.Drawing.Color.Red);
			g.DrawRectangle(pen,node.Bounds);
			pen.Dispose();
			
		}
		
		
		protected override void WndProc(ref Message msg)
		{
			const int NM_FIRST = 0;
			const int NM_CUSTOMDRAW = NM_FIRST-12;
			
			const int CDDS_PREPAINT = 1;
			const int CDDS_POSTPAINT = 2;
			const int CDDS_ITEM = 65536;
			
			const int CDDS_ITEMPOSTPAINT = (CDDS_ITEM | CDDS_POSTPAINT);
			const int CDDS_ITEMPREPAINT = (CDDS_ITEM | CDDS_PREPAINT);
			
			const int CDRF_DODEFAULT = 0;
			
			const int CDRF_NOTIFYPOSTPAINT = 16;
			const int CDRF_NOTIFYITEMDRAW = 32;
						
			if (msg.WParam.Equals(this.Handle) && msg.Msg == 8270)
			{
				NMHDR nmhdr = (NMHDR) msg.GetLParam(typeof(NMHDR));
				
				if (nmhdr.code.Equals(NM_CUSTOMDRAW))
				{
					NMTVCUSTOMDRAW customDraw = (NMTVCUSTOMDRAW)msg.GetLParam(typeof(NMTVCUSTOMDRAW));

					switch (customDraw.nmcd.dwDrawStage)
					{
						case CDDS_PREPAINT:
							msg.Result = new IntPtr(CDRF_NOTIFYITEMDRAW);
							break;
						case CDDS_ITEMPREPAINT:
							msg.Result = new IntPtr(CDRF_NOTIFYPOSTPAINT);
							break;
						case CDDS_ITEMPOSTPAINT:
							
							TreeNode node = (TreeNode)TreeNode.FromHandle(this, customDraw.nmcd.dwItemSpec);
														
							Graphics g = Graphics.FromHdc(customDraw.nmcd.hdc);
							DrawNode(node, g);
							g.Dispose();
							
							msg.Result = new IntPtr(CDRF_DODEFAULT);																	
							break;
					}
				}
			}
			else
			{
				base.WndProc(ref msg);
			}
		}
	}
}

22.06.2005 - 22:41 Uhr

okay sorry jetzt hab ich es vielleicht etwas zu einfach beschrieben 😉 etwas mehr müsste es schon sein.. geht prinzipiell darum dass ich alle root nodes hervorheben möchte.. mit farbe hintergrundbild und schrift..

hab noch ein nettes control gefunden
http://www.thecodeproject.com/cs/miscctrl/treelistview.asp

22.06.2005 - 22:25 Uhr

könnte man.. wobei ich ehrlich gesagt nicht viel mehr wollte als ein paar hintergrundfarben und ev. ein paar schriften ändern.

mit der variante über die listbox (oder listcontrol) müsste ich das rad, oder sagen wir mal mindestens den reifen davon, neu erfinden. Nodes Attribute müsste überschrieben werden, so dass ich die hierarchie hinbekomme usw.

ich werd mal die variante verfolgen die entsprechenden methoden hinzuzufügen..

22.06.2005 - 22:09 Uhr

Ja aber doch nur bei .NET Framework 2..

22.06.2005 - 20:23 Uhr

hi Beat

Danke! #develop zeigt dieses Event irgendwie nicht an 8o

Werde es mal ausprobieren, obwohl ich OnPaint eigentlich eher unschön finde, weil man mit den "alten" APIs auch Methoden hatte wie OnMeasureItem mit denen man ganz einfach die Höhe verändern konnte ohne irgendwas kompliziertes zu zeichnen..

ComboBox hat ja auch ein DrawItem Event wieso nicht TreeView X(

Laubi

22.06.2005 - 19:18 Uhr

Hallo,

Ich bin gerade auf der Suche nach einem Beispiel welches das Standard TreeView Control von WindowsForms grafisch verändert.

VS2005 (DOT.NET 2?) kennt die entsprechenden Eigenschaften (OwnerDrawAll DrawMode usw.)

Mit WinAPI würde sowas natürlich problemlos gehen aber irgendwie habe ich es mir seit Java und .NET abgewöhnt WinAPI zu programmieren und eigentlich möche ich das auch so gut es geht so lassen. Ist mir schon klar dass ich auch in nächster Zeit immer wieder mal Win32 programmieren muss aber ein OwnerDraw TreeView ist doch nicht sowas spezielles oder?

Mono Unterstützung wäre übrigens auch nett, wobei ich mir hier keine Hoffnung mache, ausser ich wäre komplett unfähig gewesen die entsprechenden Properties zu finden!

Danke
Laubi

22.06.2005 - 10:02 Uhr

Hi Leute

Ich versuche seit einiger Zeit eine Update Funktion zu schreiben dir mir alle offenen Änderungen automatisch speichert, einfügt oder löscht.. Hab schon einige Themen in diesem Forum durchgelesen und irgendwie hab ich das Gefühl dass mein Problem hier schon mehrfach behandelt wurde, ich es jedoch trotz dieser Beiträge nicht schaffe.

Ausgangslage ist ein Master-Child Formular. Die genaue Struktur:

ComboBox (zum auswählen und einfügen neuer datensätze)
  Grid1 (details)
  Grid1 (details)
  ComboBox (zum auswählen und einfügen neuer unter-datensätze)
    Grid3 (details dazu..)

Alle DataAdapter sind in einer Liste gespeichert (auf dem Form)

Die Daten in den Grids und in der ersten ComboBox werden korrekt gespeichert, jedoch nicht in der zweiten ComboBox!

Hier die Prozedur:

//foreach (NpgsqlDataAdapter dataAdapter in dataAdapterList)
for (int i=dataAdapterList.Count-1;i>-1;i--)
{
	NpgsqlDataAdapter dataAdapter = (NpgsqlDataAdapter)dataAdapterList[i];
	
	foreach (DataTableMapping dataTableMapping in dataAdapter.TableMappings)
	{
		parent.BindingContext[dataSet,dataTableMapping.DataSetTable].EndCurrentEdit();
		
		DataTable tempTable = dataSet.Tables[dataTableMapping.DataSetTable].GetChanges(DataRowState.Added);
		if (tempTable != null) {
			dataAdapter.Update(tempTable);
			MessageBox.Show("Added","Added");
		}
		tempTable = dataSet.Tables[dataTableMapping.DataSetTable].GetChanges(DataRowState.Modified);
		if (tempTable != null) {
			dataAdapter.Update(tempTable);
			MessageBox.Show("Modified","Modified");
		}
		tempTable = dataSet.Tables[dataTableMapping.DataSetTable].GetChanges(DataRowState.Deleted);
		if (tempTable != null) {
			dataAdapter.Update(tempTable);
			MessageBox.Show("Deleted","Deleted");
		}
	
		//dataSet.Tables[dataTableMapping.DataSetTable].AcceptChanges();
	}
}

Die Schlaufe mit den DataAdapter durchlaufe ich rückwärts damit ich zuerst die Childs speichere..

Wäre super wenn mir irgendjemand einen Hinweis geben könnte!

Laubi