Laden...

Forenbeiträge von thomae Ingesamt 94 Beiträge

06.11.2007 - 13:43 Uhr

Hallo Leute

ich validiere Eingaben in Textfelder und informiere den User mit Hilfe eines Errorproviders über den augetretenen Fehler. Anschliessend kann ja der User mit seinem Cursor auf den Errorprovider fahren und der Fehlertext wird ihm als Tooltip dargestellt.

Wenn jetzt aber die Meldung etwas lang ist, erscheint der Text zu kurz. Zudem scheint es, dass der Text nicht ein 2tes mal abgerufen werden kann.

Hat irgendjemand von Euch eine Idee wie man die Zeitdauer für welche diese Errornachricht angezeigt wird beeinflussen kann?

Hoffe ihr könnt mir helfen.

Thomä

14.05.2007 - 15:41 Uhr

Hallo Herbivore

anbei mein Lösungsvorschlag, den ich jetzt für alle nötigen Controls adaptieren werde. Ich denke dass auch du daran deine Freude haben wirst, schliesslich werden keine Regeln verletzt und es ist auch relativ einfach dies zu implementieren. Das Ganze basiert auf einem Usercontrol welches statt eine Combobox eine Textbox anzeigt für den Readonly Fall..

ReadOnlyComboBox.cs:


using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;

namespace com.comfone.FCS.Client.Utils
{
	/// <summary>
	/// A ComboBox which can be read-only.
	/// </summary>
    public partial class ReadOnlyComboBox
    {
		/// <summary>
		/// Whether the control is currently in read-only mode.
		/// </summary>
		private bool isReadOnly = false;

		/// <summary>
		/// Initializes a ReadOnlyComboBox.
		/// </summary>
		public ReadOnlyComboBox()
		{
			InitializeComponent();
		}

		/// <summary>
		/// Gets or sets whether the control is currently in read-only mode.
		/// </summary>
		public bool ReadOnly
		{
			get
			{
				return isReadOnly;
			}
			set
			{
				if (isReadOnly != value)
				{
					isReadOnly = value;
					if (isReadOnly)
					{
						tbxReadOnly.Text = cboEditable.SelectedText;
						tbxReadOnly.BringToFront();
						picCboDropDown.BringToFront();
						tbxReadOnly.Visible = true;
						picCboDropDown.Visible = true;
						cboEditable.Visible = false;
					}
					else
					{
						cboEditable.BringToFront();
						tbxReadOnly.Visible = false;
						picCboDropDown.Visible = false;
						cboEditable.Visible = true;
					}
				}
			}
		}

		/// <summary>
		/// Returns the ComboBox that is displayed if ReadOnly == false.
		/// </summary>
		public ComboBox EditableComboBox
		{
			get { return cboEditable; }
		}

		/// <summary>
		/// Returns the TextBox that is displayed if ReadOnly == true.
		/// </summary>
		public TextBox ReadOnlyTextBox
		{
			get { return tbxReadOnly; }
		}

        private void cboEditable_SelectedIndexChanged(object sender, EventArgs e)
        {
            tbxReadOnly.Text = cboEditable.Text;
        }

    } 
}

ReadOnlyComboBox.Designer.cs


using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace com.comfone.FCS.Client.Utils
{
	partial class ReadOnlyComboBox : UserControl
	{
		private ComboBox cboEditable;
		private TextBox tbxReadOnly;

		private void InitializeComponent()
		{
            this.cboEditable = new System.Windows.Forms.ComboBox();
            this.tbxReadOnly = new System.Windows.Forms.TextBox();
            this.pnlReadOnly = new System.Windows.Forms.Panel();
            this.picCboDropDown = new System.Windows.Forms.PictureBox();
            this.pnlReadOnly.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.picCboDropDown)).BeginInit();
            this.SuspendLayout();
            // 
            // cboEditable
            // 
            this.cboEditable.Dock = System.Windows.Forms.DockStyle.Fill;
            this.cboEditable.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.cboEditable.FormattingEnabled = true;
            this.cboEditable.Location = new System.Drawing.Point(0, 0);
            this.cboEditable.Margin = new System.Windows.Forms.Padding(0);
            this.cboEditable.Name = "cboEditable";
            this.cboEditable.Size = new System.Drawing.Size(100, 21);
            this.cboEditable.TabIndex = 0;
            this.cboEditable.SelectedIndexChanged += new System.EventHandler(this.cboEditable_SelectedIndexChanged);
            // 
            // tbxReadOnly
            // 
            this.tbxReadOnly.Dock = System.Windows.Forms.DockStyle.Fill;
            this.tbxReadOnly.Location = new System.Drawing.Point(0, 0);
            this.tbxReadOnly.Margin = new System.Windows.Forms.Padding(0);
            this.tbxReadOnly.Name = "tbxReadOnly";
            this.tbxReadOnly.ReadOnly = true;
            this.tbxReadOnly.Size = new System.Drawing.Size(100, 20);
            this.tbxReadOnly.TabIndex = 1;
            // 
            // pnlReadOnly
            // 
            this.pnlReadOnly.Controls.Add(this.picCboDropDown);
            this.pnlReadOnly.Controls.Add(this.tbxReadOnly);
            this.pnlReadOnly.Dock = System.Windows.Forms.DockStyle.Fill;
            this.pnlReadOnly.ForeColor = System.Drawing.SystemColors.ControlText;
            this.pnlReadOnly.Location = new System.Drawing.Point(0, 0);
            this.pnlReadOnly.Margin = new System.Windows.Forms.Padding(0);
            this.pnlReadOnly.Name = "pnlReadOnly";
            this.pnlReadOnly.Size = new System.Drawing.Size(100, 21);
            this.pnlReadOnly.TabIndex = 3;
            // 
            // picCboDropDown
            // 
            this.picCboDropDown.Dock = System.Windows.Forms.DockStyle.Right;
            this.picCboDropDown.Image = global::com.comfone.FCS.Client.Properties.Resources.CboDropDownReadOnly;
            this.picCboDropDown.Location = new System.Drawing.Point(81, 0);
            this.picCboDropDown.Margin = new System.Windows.Forms.Padding(0);
            this.picCboDropDown.Name = "picCboDropDown";
            this.picCboDropDown.Size = new System.Drawing.Size(19, 21);
            this.picCboDropDown.TabIndex = 2;
            this.picCboDropDown.TabStop = false;
            // 
            // ReadOnlyComboBox
            // 
            this.Controls.Add(this.cboEditable);
            this.Controls.Add(this.pnlReadOnly);
            this.Name = "ReadOnlyComboBox";
            this.Size = new System.Drawing.Size(100, 21);
            this.pnlReadOnly.ResumeLayout(false);
            this.pnlReadOnly.PerformLayout();
            ((System.ComponentModel.ISupportInitialize)(this.picCboDropDown)).EndInit();
            this.ResumeLayout(false);

		}

		private PictureBox picCboDropDown;
		private Panel pnlReadOnly;
	}
}

Natürlich kann nicht mehr direkt mit readOnlycomboBox.Items... zugegriffen werden, stattdessen muss man das Property EditableComboBox verwenden.

Viel Spass damit, ist eine wirklich lonenswerte Sache.

Danke nochmals an dich herbivore.

Hiermit ist der Thread beendet

14.05.2007 - 11:46 Uhr

Hallo herbivore

nein sicher nehme ich es nicht persönlich, ich bin dankbar für jede weitere Meinung.
Ich könnte auch ganz gut mit dem Standard leben, aber eben, ich bin nur der Programmierer!

Ich werde sicher versuchen eine Lösung zu finden und diese dann auch posten, jedoch stimmt es mich nicht besonders zuversichtlich wenn du keinen Ansatz dazu hast.

Vielen Dank

Thomä

14.05.2007 - 11:31 Uhr

Ja bei Textboxen ist das Ganze absolut kein Problem. Dies habe ich so geregelt, das ich den Key-Down Event catche und dont auf dem event SuppressKeyPress auf true setze. Dies stellt sicher, das es sich verhält wie ein Readonly, aber trotzdem eine Farbänderung zulässt. Nur ist dies leider bei einer Combobox ein kleines bisschen schwieriger oder zumindest aufwendiger =)

Du scheinst aber nicht all zu viel von meiner Idee zu halten?!

14.05.2007 - 11:22 Uhr

Hallo herbivore

danke für deine Antwort. Das ist mir klar dass ich es so machen könnte. Jedoch ist beispielsweise eine Combobox nicht mehr all zu leserlich wenn du sich auf Enadled = False setzt. Das selbe auch für DateTimePickers. Statt jetzt die Controls zu erweitern um sie meinen Bedürfnissen anzupassen möchte ich den Weg eine Glasspane versuchen. Leider sind die Benutzer meines Programmes sehr unglücklich mit dem Verhalten gewisser Controls wenn sie Readonly sind. Als erstes habe ich dann versucht eine Readonly Control zu bauen, jedoch gibt es sehr viele Windowsevents die du handeln müsstest das dies sauber reagiert und nicht noch mehr Verwirrung stiftet.

Sicher hast du auch recht mit:

Das ist dann nicht nur noch einfacher, sondern hat den Vorteil, dass der Benutzer auch gleich sieht, dass er dort nichts eingeben/ändern kann.

Aber wie gesagt ist genau dies der Knackpunkt, es ist zu unleserlich..

Hast du evtl. eine andere Idee, oder was hälst von einem Glasspane?

Thomä

14.05.2007 - 11:09 Uhr

Hallo Leute

Hat jemand von Euch schon einmal versucht eine Art Glasspane (JAVA) zu programmieren. Oder gibt es vieleicht irgendwo etwas ähnliches zu finden?

Für all jene die nicht wissen was ein Glasspane ist, in wenigen Worten beschrieben ist es ein Panel welches man wie eine Glassplatte aus diverse Controls legen kann. Dies dient dazu, dass kein daruterliegendes Control (Button, Combobox oder so) mehr Events empfängt. So lässt sich sehr einfach eine Art ReadOnly für ganze UserControls erstellen.

Oder ist es unrealistisch in C# so etwas zu verwenden?

Danke schon mal im Voraus

24.04.2007 - 15:45 Uhr

Danke für den Hinweis, hast du dieses Grid schon getestet?

24.04.2007 - 13:06 Uhr

Hallo Leute

ich komme mit einem Thema, welches in verschiedenen Foren schon behandelt wurde. Und zwar ist es die Erstellung eines Footers / Summaries für ein DataGridView. Anscheinend ist es nicht möglich eine unkomplizierte Lösung zu erstellen, in welcher ein Footer unterhalb des Grids oder im Grid selber an letzter Zeile (Frozen Property) erscheint.

Daher habe ich mir Gadanken gemacht, was wohl die beste Alternativlösung sein könnte. Meiner Meinung nach gibt es nur 1 Variante:

DataGridView für Daten + DataGridView ohne Header für Footer. Dabei müsste das scrollen verlinkt werden und ebenso ein allfälliges verändern einer Kolonnenbreite.

Daran stört mich jedoch, dass es nur mit sehr viel Mühe generalisiert werden kann und dementsprechend auch mit einem relativ grossen Zeitaufwand verbunden ist.

Ich suche schon eine Weile nach etwas geeigneterem, hatte aber bisher noch kein Erfolg.

Hat irgendjemand von Euch eine Anregung oder eine bessere Idee?

Danke im Voraus

08.12.2006 - 14:25 Uhr

Hallo John

kann ich dir nicht wirklich beantworten. Ich habe meine Dokumente immer mit einem XMLWriter und einem XMLTextWriter erstellt:



private XmlWriter writer;
private XmlTextWriter xmlWriter;

this.xmlWriter = new XmlTextWriter(fullXMLName, System.Text.Encoding.UTF8);
this.writer = (XmlWriter)this.xmlWriter;
this.writer.WriteStartDocument();
this.writer.WriteStartElement("XML_FCD");
this.writer.WriteStartElement("DOCUMENT");


so gesehen ist die Datei schon vorhanden. Hier in meinem Fall ist unter fullXMLName der Pfad sowie der Name abgespeichert.

Du könnest aber das XML in einen String schreiben und über XMLDocument.load(string) anschliessend gleich verfahren wie ich das getan habe.

Hoffe ich konnte dir helfen. Wenn du mehr weisst, lass es mich bitte wissen

22.11.2006 - 12:30 Uhr

Hallo Leute

hier ein vielleicht ganz nützlicher Beitrag, wenn man programmatisch auf eine Beliebige Mailbos zugfreien will, welche als Mailaccount im Outlook vorhanden (aber je nach dem nicht default) ist.


public static Outlook.MAPIFolder checkAndGetDraftFolder()
{
	Outlook.ApplicationClass outlApp = new Outlook.ApplicationClass();
	string mailBoxname = "Mailbox - Testaccount";
	string folderName = "Drafts";
	Outlook.MAPIFolder mailBox = null;
	Outlook.MAPIFolder outlDraftFolder = null;

	IEnumerator folderColl = outlApp.Session.Folders.GetEnumerator();

	for (int i = 0; i < outlApp.Session.Folders.Count; i++)
	{
		folderColl.MoveNext();
		if (((Outlook.MAPIFolder)folderColl.Current).Name.CompareTo(mailBoxname) == 0)
		{
			mailBox = (Outlook.MAPIFolder)folderColl.Current;
		}
	}
	if (mailBox == null)
	{
		throw new ApplicationException("The Mailbox named" + mailBoxname + "/" + folderName + "could not be found.");
	}

	try
	{
		outlDraftFolder = mailBox.
			Folders[folderName];
	}
	catch
	{
		throw new ApplicationException("The Mailbox named" + mailBoxname + "/" + folderName + "could not be found.");
	}

	return outlDraftFolder;
}

Viel Spass

06.11.2006 - 10:33 Uhr

Hallo Leute,

da ich nicht wirklich gutes und einfaches gefunden habe um ein XML gegen ein XSD zu validieren poste ich hier die Lösung die ich im Netz gefunden habe:


public bool isValidXml(string fullXmlFilePath, string schemaNamespace, string fullXSDFilePath)
{
	XmlDocument data;
	try
	{
		data = new XmlDocument();
		data.Schemas.Add(schemaNamespace, schemaFilePath);
		data.Load(fullXmlFilePath);
		data.Validate(null);
	}
	catch (Exception exc)
	{
		return false;
	}
	return true;
}	


Zu beachten ist dabei, dass schemaNamespace meistens = "" ist.

03.11.2006 - 13:41 Uhr

Nö das Dokument kann nicht geschlossen werden. Aber ich habe es geschafft, habe einfach alle Objekte auf null gesetzt und mit GC.Collet() aufgeräumt.

Danke für Eure Unterstützung

03.11.2006 - 11:02 Uhr

Auf das Dokument kann ich soweit ich das sehe nicht zugreifen um es zu schliessen..

Wiso nicht mit GC arbeiten? Wollte forcieren, dass er aufräumt weil ich mir gedacht habe dass irgend ein Objekt das File noch immer alloziert hat..

irgend eine andere Idee

03.11.2006 - 10:56 Uhr

Hallo Leute

ich stelle in einer Form mit eingebettetem WebBrowser ein PDF dar. Nachdem die Form geschlossen wird möchte ich das Dokument vom System löschen. Dazu habe ich folgendes gemacht.


browserForm.Dispose();
browserForm = null;
GC.Collect();
System.IO.File.Delete(pathPDF + fileNamePDF);

Leider kommt dabei eine IOException da das Dokument noch immer alloziert ist..

Was sol ich da tun?

31.10.2006 - 16:00 Uhr

Danke noch mal

31.10.2006 - 15:59 Uhr

Jep habs bemerkt..

Funktioniert bestens.
Habe es mit databinding gelöst und anschliessend den Validating Event verwendet..


private void cboCountry_Validating(object sender, CancelEventArgs e)
{
	if(((ComboBox)sender).Text.Length > 0)
	{
		string text = ((ComboBox)sender).Text.ToUpper();	
		bool valueFound = false;
		for(int i = 0; i < ((ComboBox)sender).Items.Count; i++)
		{
		  	if(((ComboBox)sender).Items[i].ToString().CompareTo(text) == 0)
			{
				valueFound = true;
				break;
			}
		}
		if(!valueFound)
		{
			e.Cancel = true;
		}
	}
}



private void dbReadCountries()
{
    try
    {
        this.countryArrayList.Clear();
		
		IDbCommand oraCmd = OracleDBManager.Instance.CreateDbCommand();
        oraCmd.CommandText = "SELECT * FROM COUNTRIES ORDER BY COUNTRY";
		using (IDataReader or = OracleDBManager.Instance.ExecuteReader(null, oraCmd))
		{
			while (or.Read())
			{
				this.countryArrayList.Add(new CountryItem(or["COUNTRY"].ToString(), or["	code"].ToString()));
			}
		}
        // binding DataSource to Combobox 
		
        this.cboCountry.DataSource = null;
        this.cboCountry.DisplayMember = "Text";
        this.cboCountry.ValueMember = "Name";
        this.cboCountry.DataSource = countryArrayList;
		string[] autoCompletion = new string[countryArrayList.Count];
		for(int i = 0; i < countryArrayList.Count; i++)
		{
			autoCompletion[i] = this.cboCountry.Items[i].ToString();
		}

		this.cboCountry.AutoCompleteCustomSource = new AutoCompleteStringCollection();
		this.cboCountry.AutoCompleteCustomSource.AddRange(autoCompletion);	
    }
    catch (System.Exception ex)
    {
        
    }
}


31.10.2006 - 15:25 Uhr

Hallo Hape

danke für deinen Input. Bisher arbeite ich mit einer DropDownList, da ich verhindern möchte, dass der Benutzer Dinge eingeben kann die nicht funktionieren.

Die DataBindings verwende ich so wie von dir erwähnt..

Kannst du mir folgende Punkte noch etwas erläutern:

.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
.AutoCompleteSource = AutoCompleteSource.CustomSource;
.AutoCompleteCustomSource = new AutoCompleteStringCollection();
.AutoCompleteCustomSource.AddRange(...);

Nö bin aus der Schweiz - Biel..

Gruess Thomä

31.10.2006 - 14:52 Uhr

Hallo Leute

ich brauche wieder mal Eure Hilfe.

Ich suche einen möglichst einfachen Weg eine Combobox so abzuändern, dass ich beispielsweise 3 Buchstaben schnell nacheinander eingeben kann und diese dann als 1 Token mit allen vorhandenen Items vergleichen kann und so dass richtige finden kann.

Anwendungsbeispiel:

Ich habe eine Combobox mit allen Ländern dieser Welt und möchte jetzt so schnell wie möglich zum Item Ausstralien springen. Dazu möchte ich die Buchstaben "AUS" eingeben und anschliessend zu richtigen Item springen..

Irgend eine clevere Idee? Wäre fantastisch

Gruess

Thomä

04.10.2006 - 11:22 Uhr

Ok ich schaue mal. Zurzeit bin ich gerade zu beschäftigt, aber je nach dem komme ich wieder dazu in einigen Wochen. Wie oben erwähnt können sich Leute ohne Probleme bei mir melden.

Hiermit ist dieser Beitrag geschlossen. Ich danke Euch für die tolle Unterstützung.

Thomae

04.10.2006 - 10:48 Uhr

Ja wusste nicht genau wie der Image Link anzuwenden ist. Habe das Image im Anhang angehängt..

Was meinst du damit? Also wer soll das Beispiel schreiben?

Ich dachte nur daran, dass es evtl. nützlich sein könnte, wenn ein kleines ausführbares Beispiel vorliegt. Wer das Beispiel schreibt weiss ich auch nicht. 🙂

04.10.2006 - 10:17 Uhr

Hallo Leute

nach längerem Studium dieses Problem, habe ich jetzt eine Lösung gefunden, die ich hier gerne erläutern möchte. Ich denke das meine Lösung nahezu optimal ist, zumindest mit den bisherigen Classen und Methoden die .NET zur Verfügung stellt.

Alle bisher in diesem Thread besprochenen Ideen waren nicht gut oder nicht gut genug.

Die Lösung der "Continuous Forms" von codeproject ist gut durchdacht, aber bei über 1000 Records ist auch diese Lösung aufgrund der Ressourcenprobleme und der langen Ladezeit unbrauchbar.

Mein Ansatz beruht auf der neu für .NET 2.0 hinzugefügten Methode AdjustCellBorderStyle für eine DataGridViewCell. Wie man schon erahnen kann habe ich ein DataGridView abgeändert, so dass ein Record über mehrere Rows verteilt werden kann ohne dabei die Sortier- und Selektierfunktionen zu verlieren.

Folgende Schritte müssen beachtet werden, zur Implementierung komme ich später

  1. DataGridView erstellen mit Multiselect = true

  2. CellClick Event verwenden um Links innerhalb mehrer Controls sicher zu stellen

  3. MouseCellClick Event verwenden um Sortierfunktion zu unterstützen

  4. Keydown Event verwenden um mit Tastatur auf eine Zeile zu springen

  5. SelectionChanged Event verwenden um einen Record (d.h. mehrere Zeilen) zu markieren

  6. Zu sortierende Zellen: SortMode = Programmatic

  7. nicht zu sortierende Zellen: SortMode = NotSortable

  8. Zellen selber erstellen um LookAndFeel anzupassen

Der unter 2. erwähnte Punkt der Verlinkung habe ich mit DataGridViewImageCell gelöst. Für den fall einer nicht Verlinkung habe ich als valie ein new BitMap(1,1) angehängt. Dies um den Code zu verstehen.

Der unter 8. erwähnte Punkt habe ich mit InnerClasses welche eine DataGridViewCell überschreiben gelöst, die ich anschliessend verwende um meinen DataGridView zu füllen. Dieses Beispiel mach eine Zelle welche nur einen
Top und einen Right Border besitzt. Mit dieser Methode kann man die Zellen optisch verschmelzen lassen.


public class DataGridViewCustomImageCellRow1 : DataGridViewImageCell
{
    public override DataGridViewAdvancedBorderStyle AdjustCellBorderStyle(
        DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStyleInput,
        DataGridViewAdvancedBorderStyle DataGridViewAdvancedBorderStylePlaceHolder,
        bool singleVerticalBorderAdded,
        bool singleHorizontalBorderAdded,
        bool firstVisibleColumn,
        bool firstVisibleRow)
    {
        // Customize the top border of cells in the first row and the 
        // right border of cells in the first column. Use the input style 
        // for all other borders.

        dataGridViewAdvancedBorderStylePlaceHolder.Left = DataGridViewAdvancedCellBorderStyle.None;
        dataGridViewAdvancedBorderStylePlaceHolder.Top = DataGridViewAdvancedCellBorderStyle.Single;

        dataGridViewAdvancedBorderStylePlaceHolder.Right = DataGridViewAdvancedCellBorderStyle.Single;
        dataGridViewAdvancedBorderStylePlaceHolder.Bottom =	DataGridViewAdvancedCellBorderStyle.None;

        return dataGridViewAdvancedBorderStylePlaceHolder;
    }
}

Weiter glit es zu sagen, das in meinem Beispiel ein Record aus 3 Zeilen besteht. Siehe Bild im Anhang:

14.09.2006 - 11:27 Uhr

Hallo zusammen

ich habe im Forum schon einige Beiträge zu diesem Thema entdeckt. Leider reichen mir die bisherigen Ansätze nicht ganz aus.

Ich öffne, erstelle, verändere diverse Exceldokumente innerhalb meiner Applikation. Das funktioniert sowiet bestens. Zum schliessen verwende ich das viel erwähnte MarshalObject.Realease.

Jetzt habe ich aber 2 Probleme, die ich bisher nicht lösen konnte.

  1. Mein Projekt mutiert andere Dokumente, während diesem Task öffnet der User ein Exceldokument.

Folgen: Dem Benutzer erscheinen die von meinem Programm mutierten Dateien. Da ich diese Dateien öffne und schliesse wird der Benutzer immer gefragt ob er speichern will und sein Dokument wird ebenfalls geschlossen.

  1. Benutzer hat ein Dokument offen, während dessen startet mein Programm eine Mutation vod verschiedenen Exceldateien. Während diesem Prozess schliesst der User seine Excelapplikation.

Folgen: Alle offenen Dateien werden geschlossen!

Daraus schliesse ich, das der Taskmanager die beiden Excelprozesse als 1 Prozess betrachtet. Gibt es eine Möglichkeit den Excelprozess der aus dem Programm gestartet wird als eigenständige Instanz zu starten. Beispielsweise mit einem eigenen Alias (MyExcelInstance), so dass der Benutzer gar nichts davon mitbekommt, ausser wenn er den Taskmanager öffnet?

Ich hoffe ihr verstaht mein Problem und habt eine gute Idee aus Lager. Das selbe gilt übrigens für alle DOM Komponenten, auch Outlook verursacht solche Probleme - zumindest bei mir.

22.08.2006 - 10:05 Uhr

Hallo FZelle

zum guten Glück komme ich nicht aus der Accesswelt 😉

Leider ist aber das alte System in Access gemacht und dient zur Buchhaltung von Kundendaten. Und durch diese Forms sind die User natürlich ein wenig verwöhnt, und es reicht Ihnen leider nicht wenn wir Ihnen die Daten in einem DataGridView aufbereiten X(

Danke für deinen Hinweis, ich werde das mal durchtesten und anschliessend melde ich mich wieder.

21.08.2006 - 15:46 Uhr

Hallo nochmal

ich habe vergebens nach einer Lösung gesucht. Eigentlich schade, in ACCESS ist dies sehr einfach zu implementieren. Siehe Tabular Form.

Hast jemand evtl noch einen guten Beitrag zu diesem Thema?

17.08.2006 - 17:21 Uhr

Ansonsten habe ich ja noch ganz oben eine Alternative genannt.

Wo denn? Scheint nicht mein Tag zu sein

17.08.2006 - 17:04 Uhr

Habs kurz angetestet. Sieht nicht schlecht aus, man darf einfach nicht vergessen auf dem TableLayoutPanel AutoSize auf true zu stellen. Jedoch ist es ein Problem, dass die neuen Rows leider nicht die Grösse des hinzugefügten Controls haben, was aber programmtechnisch kein grösseres Problem darstellen sollte.

Was mir eher sorgen macht, ist ein Sortmodus einzubauen. Das würde nämlich bedeuten, dass das eingefügte Usercontrol einen Eventhandler haben muss, welcher auf ein Mausklick reagiert und dem TableLayoutPanel signalisiert, dass es sortieren soll. Anschliessend müsste das UserControl Properties bereitstellen, für alle sortierbaren Argumente. Dann im TableLayoutPanel alle UserControls aus den Rows entfernen, und in einer Collection sortieren und wieder dem TableLayoutPanel hinzufügen. Ich frage mich wie performant das noch ist, besonders, wenn das UserControl aus sagen wir mal 7 Buttons, 15 Labels und 10 Textfeldern besteht. Und 1500 solcher Usercontrols eingebunden werden sollen.

Ich weiss klingt komisch, ist aber ein Bedürfnis und ich könnte mir vorstellen, dass ich nicht der einzige bin. Perfekt wäre ein DataGridView, dass eine DataGridViewPanelColumn kennt! Oder auch eine DataGridViewUserControlColumn.

Was denkst du / ihr dazu?

17.08.2006 - 16:42 Uhr

Also mal kurz Schritt für Schritt für mich..

Panel als HauptContainer, Autoscroll = true
TableLayoutPanel in Panel

Soweit alles klar

Jetzt für ich dem TableLayoutPanel Rows hinzu, sprich irgend ein Control
--> Alle Rows werden kleiner! Und es sind nie alle sichtbar!

17.08.2006 - 16:30 Uhr

Hallo Herbivore

ging ja verdammt schnell! Danke, aber wie stellts du dir das vor?

Gruss

17.08.2006 - 16:26 Uhr

Hallo Leute

vielleicht ist mein Subject für diesen Beitrag etwas komisch, aber ich weiss selber nicht genau wonach ich suchen soll, oder wie ich dieses Thema benennen soll.

Ich bin auf der Suche nach einer Lösung die ähnlich ist wie ein DataGridView, nur möchte ich mich nicht an Zellen halten müssen und beliebige Controls einbinden können.

Konkret heisst dass, ich benötige ein Control, welches es mir erlaubt soviele Controls hinzuzufügen wie nötig. Ich sage der Anzahl N. Die N Controls (sollen auch Usercontrols sein können) möchte ich wie bei einem DataGridView als Row oder so ähnlich hinzufügen können. Wenn nicht mehr alle N Controls auf dem Bildschirm Platz haben, soll eine oder gegebenenfalls 2 Scrollbar/s erscheinen.

Dabei denke ich, sollte es möglich sein so etwas zu implementieren, schliesslich war es schon mit VB 6.0 möglich. Leider bin ich bisher auf keine vernünftige Lösung gestossen, aber wie Eingangs erwähnt, weiss ich nicht genau wonach ich suchen soll, daher hoffe ich auf Eure Hilfe.

Danke schon Mal

Marc

06.07.2006 - 10:54 Uhr

Hallo noodles

ach so, habe wohl eine etwas lange Leitung. Klappt scho mal ganz gut, ich habe jetzt eine Extraspalte in welche in die Zeilennummer manuell reinschreibe.


private void dataGridView_Paint(object sender, PaintEventArgs args)
{
       for(int i = 0; i < this.dataGridView.Rows.Count; i++)
      {
	this.dataGridView.Rows[i].Cells[0].Value = i + 1;
      }
}

Jetz habe ich nur noch das Problem, dass es ein wenig unschön aussieht, da die Default PaintEvent Methode das DataGrid bei einer Umsortierung neu zeichnet und die alten Zeilennummern übernimmt und erst danach "mein" PaintEvent aufgerufen wird. Gibt es eine Möglichkeit meinen Code der Default hinzuzufügen?

06.07.2006 - 09:21 Uhr

Hallo noodles

nein mit Frozen hab ichs auch schon probiert, geht aber nicht. Am besten wäre es ja, wenn man für eine DataGridView die Rownumber direkt einblenden könnte..

Trotzdem vielen Dank für deine emühungen

Gruess

Thomä

06.07.2006 - 09:06 Uhr

Hallo herbivore

wie denn?

Gruess

23.06.2006 - 14:54 Uhr

Hallo Leute

ich hab ein kleines Problem mit der Sortierung einer DataGridView. Habe diverse Beiträge gefunden, jedoch nicht zu diesem Problem.

Ich habe eine Spalte in der DataGridView welche immer um eines hochzählt. Dies dient mir dazu, dass ich dem User zeigen kann, wieviel Zeilen verfügbar sind. Wenn ich jetzt aber eine andere Kolonne sortiere, werden diese "Zählwerte" mitsortiert und das Ganze verliert seinen Sinn.

Gibt es eine Möglichkeit einen Counter direkt einzublenden?

Oder gibt es eine Möglichkeit eine Spalte zu fixieren?

Ansonsten müsste ich den sortierevent abfangen und nach dem sortieren die Zahlen wieder einfügen.. Das empfinde ich aber als recht unsaubere Lösung.

Hat jemand eine Idee?

Danke schon mal und HOPP SCHWIZ

24.05.2006 - 09:58 Uhr

Ok ich werds mal versuchen.

Vielen Dank

24.05.2006 - 09:44 Uhr

Hallo herbivore

klar, ich habe die Abfrage überall reingepackt, aber wenn wie beschrieben ein UserControl ein anderes verwendet wird auf zweiterem das Property DesignMode nicht auf true gesetzt, da dieses nicht direkt vom designer instanziert wird sondern vom Parent UserControl.

24.05.2006 - 09:18 Uhr

Hallo Jan

Danke für deine Antwort, funkioniert so wie ich mir das gewünscht habe. Allerdings nur für UserControls welche direkt geöffnet werden. wenn jetzt aber das zu öffnende UserControl seinerseits ein anderes Usercontrol enthält, versagt dieser Mechanismus. Hast du noch irgend eine Erweiterung auf Lager?

24.05.2006 - 08:17 Uhr

Hallo Leute

ich habe ein kleines Problem mit meinem Visual Studio 2005.

Wenn man beispielsweise ein UserControl designet wird ja im Visual Studio der Defaultkonstruktor aufgerufen. Jetzt habe ich aber beispielsweise einen Datenbankzugriff im Konstruktor, den ich aber nicht jedes Mal ausführen lassen möchte. Gibt es eine Möglichkeit im Konstruktor eines Objektes heraus zu finden, ob man sich im Designermode/view des Visual Studio befindet? Oder gibt es sonst eine Möglichkeit einen Teil des Codes zu ignorieren?

Danke schon mal im voraus

02.05.2006 - 11:36 Uhr

Hallo Leute

einmal mehr bin ich auf Eure Hilfe angewiesen. Ich habe folgende 2 Probleme mit einer DataGridView unter MS Visual Studio 2005:

  1. Ich verwende eine DataGridViewButtonColumn und möcht dem Button statt ein Text ein Bild zuweisen können. Ich möchte aber nicht eine DataGridViewImageColumn verwenden, da ich sonst die Eigenschaften eines Buttons verliere.

  2. Ich mache eine Validation beim Wechseln einer Zeile. Dies funktioniert bestens, es wird bei jedem Zeilenwechsel die Validation durchgeführt. Zum Speichern der eingegebenen Daten habe ich ein Button auf dem Form. Wenn ich jetzt diesen Button drücke, wird erneut eine Validation durchgeführt - auch das stört mich nicht weiter - aber leider wird der Event des Buttons unterdrückt. Das heisst konkret, dass mein Benutzer 2 Mal diesen Button drücken muss 😦

Ich hoffe jemand kann mir helfen.

Grüsse

Marc

04.04.2006 - 12:32 Uhr

Hallo Ron

du hast recht, eigentlich hätte ich auch selber darauf kommen können. Vielen Dank, Du warst mir eine echte Hilfe. Funktioniert alles bestens.

Hier noch eine kleine Anmerkung für alle die diesen Thread lesen:

Um die Securitywarnungen von outllok zu umgehen habe ich folgendes Framework verwendet:

http://www.dimastr.com/redemption/

Es bietet auch die Möglichkeit Mails in ".msg" Format in einen Order auf der Festplatte zu speichern. Fragen könnt Ihr hier posten.

Dieser Thread ist somit geschlossen.

04.04.2006 - 11:39 Uhr

Hallo Ron

danke für deinen Input. Es funktioniert eigentlich ganz gut. Ich mache folgendes um einen Unterordner von Drafts zu erhalten:

Outlook.NameSpace outlNamespace;
Outlook.MAPIFolder outlDraftFolder;
Outlook.MAPIFolder outlDraftFCDocsFolder;
Outlook.MAPIFolder outlDraftFCDocsOrigFolder = null;
Outlook.MAPIFolder outlDraftFCDocsCopyFolder = null;

outlNamespace = outlApp.GetNamespace("MAPI");
outlDraftFolder = outlNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDrafts);
outlDraftFCDocsFolder = outlDraftFolder.Folders.GetFirst();
while(outlDraftFCDocsFolder != null && outlDraftFCDocsFolder.FullFolderPath.IndexOf("FCDocs") == -1)
{
outlDraftFCDocsFolder = outlDraftFolder.Folders.GetNext();
//TODO Name der Ordner in Config
}
if(outlDraftFCDocsFolder == null)
{
outlDraftFCDocsFolder = outlDraftFolder.Folders.Add("FCDocs",System.Reflection.Missing.Value);
}

this.outlDraftFCDocsOrigFolder = outlDraftFCDocsFolder.Folders.GetFirst();
while(this.outlDraftFCDocsOrigFolder != null && this.outlDraftFCDocsOrigFolder.FullFolderPath.IndexOf("FCDocs\Originals") == -1)
{
this.outlDraftFCDocsOrigFolder = outlDraftFCDocsFolder.Folders.GetNext();
//TODO Name der Ordner in Config
}
if(this.outlDraftFCDocsOrigFolder == null)
{
this.outlDraftFCDocsOrigFolder = outlDraftFCDocsFolder.Folders.Add("Originals",System.Reflection.Missing.Value);
}

this.outlDraftFCDocsCopyFolder = outlDraftFCDocsFolder.Folders.GetFirst();
while(this.outlDraftFCDocsCopyFolder != null && this.outlDraftFCDocsCopyFolder.FullFolderPath.IndexOf("FCDocs\Copies") == -1)
{
this.outlDraftFCDocsCopyFolder = outlDraftFCDocsFolder.Folders.GetNext();
//TODO Name der Ordner in Config
}
if(this.outlDraftFCDocsCopyFolder == null)
{
this.outlDraftFCDocsCopyFolder = outlDraftFCDocsFolder.Folders.Add("Copies",System.Reflection.Missing.Value);
}

Das funktioert bestens, wenn die Ordner nicht schon bestehen werden Sie erstellt. Jetzt möchte ich in einem der Ordner, hier unten im Beispiel "Drafts\FCDocs\Originals" ein Mail erstellen:

this.currentOrigMailItem = (Outlook.MailItem)this.outlDraftFCDocsOrigFolder.Items.Add(Outlook.OlItemType.olMailItem);

Klappt auch, aber wenn ich:

this.currentOrigMailItem.save()

ausführe wird das Mail nur in Drafts gespeichert statt in den richtigen Unterordner...

Irgend eine Idee??

Anschliessend

04.04.2006 - 09:31 Uhr

Hallo zusammen

ich erstelle OutlookMailItems und möchte diese in einen Ordner in meinem Outllok ablegen.

Beispielsweise: Drafts/Original/XXX

Normalerweise wird mit dem save() Befehl die Datei in den Draftsordner abgelegt. Das funktioert auch ganz gut. Aber eben in einen beliebigen Ordner??

Weiss jemand wie und ob das überhaupt das möglich ist?

Danke

04.04.2006 - 08:26 Uhr

Hallo Leute

danke für eure Beiträge.

Ist ja vielleicht ne andere Idee, warum erzeugst Du denn überhaupt PDF-Dateien?

--> Da es unveränderbare Dokumente sein sollen und ich es sehr praktisch finde mit XML, XSL, XSD und FOP PDFs zu erzeugen.

Aber die Idee mit dem Adobe SDK klingt ganz gut. Ich schaue mal obs besser wird.

03.04.2006 - 14:46 Uhr

Tja schön wärs. Ich benutze als PDF Handler PDFTron und der erlaub mir leider nur Bitmaps..

03.04.2006 - 14:14 Uhr

Hallo Leute

ich wollte mal eure Meinung einholen. Ich bin dabei eine Appliaktion zu entwickeln, welche mir aus einer Datenbank nach verschiedenen Einschränkungen PDFs erzeugt. Anschliessend werden die Dateien gedruckt. Jetzt ist es im extremfall möglich, dass 8000 Dokumente erzeugt werden.

Und hier beginnt mein Problem. Mit meiner Methode mache ich von jeder PDF Seite ein BITMAP und drucke dieses. So kann ein Dokument locker mal 10 Mega gross werden. Bei 8000 Dokumenten eine für die Druckerqueue kaum zu bewältigende Datenmenge.

So habe ich ein wenig gegoogelt und das hier gefunden:

http://www.geocities.com/sea_sbs/files/pdfp.zip

Auch nicht schlecht und was mich vor allem erstaunt ist, dass dieses C-Programm nur 114 kilo in die Druckerqueue "schiebt".

Kennt jemand von Euch einen "optimalen" Weg um PDF zu drucken? Ich habe auch schön über einen Aufruf des AcrobatReaders nachgedacht, aber das erscheint mir ein wenig unschön und benötigt zusätzlich eine Installation des AcrobatReaders.

Any Idea?

Danke schon mal im voraus, könnte mir vorstellen, dass das ein ganz interessantes Thema werden könnte.

Grüsse

Marc