Laden...

Forenbeiträge von Coshian Ingesamt 19 Beiträge

11.08.2008 - 20:07 Uhr

Nun doch geschafft:

Gehen wir von oben genanntem Beispiel aus:

Tabellenspalten (Bissel eingekürzt):

Level 0 | Level 1 | Level 2 | Nummer | Name | Wert

Die Struktur soll sich baumartig aufblättern lassen beim Klick auf die entsprechenden Zellen:

Level 0
Level 1
Level 2
Nummer | Name | Wert

Der Clou:

  1. Header über alle Spalten erstellen
  2. Detailrow erstellen für:
    a) eine Zelle als Platzhalter für den Abstand nach links
    b) die Spalten Nummer | Name | Wert
  3. TableGroups erstellen für jede Spalte Level 0 bis 2
    -> und hier kommt's:

Jede TableGroup kann in der RDL eine Parent-Eigenschaft haben. D.h. am Beispiel oben, Level 1 soll Parent Level 0 haben, etc. Sobald diese Eigenschaft gesetzt ist, kann auch aus dieser Group auf die Textbox mit dem Namen der obrigen Group als ToggleItem zugegriffen werden. Also das Parent Attribute direkt hinter die GroupExpression, den Code des ersten Postings hinter das </Grouping> Attribute und tada ... da ist die Baumstruktur.

Trotzdem danke

Coshi

11.08.2008 - 17:11 Uhr

Hallöchen alle miteinander!

Ich habe mich für ein Projekt entschlossen, Reports mit dem MS ReportViewer zu erstellen. Da RDL aber ziemlich komplex ist, versuche ich den RDL Code mit miniRDL zu generieren.

Jetzt die eigentlichen Fragen:

Ich kann eine sehr angenehme Struktur der Daten dynamisch generieren in folgender Form:

  1. Punkt
    1.Unterpunkt
    1.1. [...]
    2.Unterpunkt
    3.Unterpunkt

Um dem Nutzer Navigationsfähigkeiten zu ermöglichen, sollte es möglich sein, beim Klicken auf Unterpunkt 1 die Unterpunkte 1.1 etc. aufzublättern.

Dafür kann ich in RDL ja den Tag für eine Row


<Visibility >
<Hidden>true</Hidden>
<ToggleItem>[Toolboxname des Überpunktes]</ToggleItem>
</Visibility>

setzen. Ich krieg das in RDL jedoch irgendwie nur für die erste Spalte hin oOo.

In miniRDL müsste sowas sicher ja auch machbar sein. Leider gibt die Dokumentation auf der Webseite des Entwicklers darüber keinen Aufschluss. Einer eine Ahnung / Idee wie ich diese Struktur trotzdem dynamisch generieren könnte (gern auch ohne MiniRDL)?

MfG

Coshi

Achso, vielleicht am Rande:

Grouping Columns sind "Level0" bis "Level 5", normale Spalten "Nr", "Name" und "Wert".

27.07.2008 - 17:45 Uhr

Naja ein DGV kann als DataSource ja z.B. auch Arrays verwenden, daher wäre eine Verlinkung des DataSource auf ein Carlos Worksheet vom Prinzip her denkbar.
Über die Komponente von SpreatsheetGear bin ich vorher schon gestolpert, "leider" nutze ich Sharp Develop... Werde ich mir aber noch einmal genauer ansehen, quasi danke trotzdem für den Tip =).

27.07.2008 - 12:55 Uhr

Dachte ich mir schon. Habe im Netz ein paar Komponenten gefunden, die leider jedoch noch nicht so wirklich ausgereift sind (Grammatica in Verbindung mit der Ciloci FormulaEngine) - ich kann zwar Formeln berechnen lassen, aber Querverweise unter den Zellen funzen in C# durch die komplizierte Anbindung der DGV an die referenzierten "ISheets" nicht.
Meine Zwischenlösung sieht momentan so aus, dass ich beim OnEndEdit einer Zelle im DGV prüfe, ob der Value mit "=" beginnt, wenn ja schmeißt er den Inhalt in eine separate Formeltabelle. Das Gleiche beim OnBeginEdit -> wenn eine Formel für die aktuelle Zelle existent ist, dann lasse diese editieren.
Müsste man für die Formeltabelle noch einen eigenen Interpreter schreiben, der auf ein DGV referenziert, bei Dateneingabe alle Werte neu berechnet.
Dachte, dass man vielleicht auch ein Carlos.AG XML Writer Worksheet als Quelle für ein DGV nehmen könnte, aber den Weg habe ich noch nicht weiter verfolgt.

Zum subclassen:
Leider habe ich noch nie eine Control abgewandelt, daher muss ich da erstmal checken, wie das genau funzt.

26.07.2008 - 19:09 Uhr

Hallöchen!

Nach stundenlangem Suchen und nur bedingt fündig werden stelle ich hier mal folgende Frage in den Raum:

Weiß einer eine Möglichkeit, mit der ich eine Tabelle darstellen und für jede Zelle eine individuelle Formel festlegen kann? Das normale DGV "unterstützt" ja nur die ColumnExpression der DataTable...

Vielen Dank schon einmal im Voraus

Coshi

03.05.2008 - 13:44 Uhr

siehe: "wie poste ich richtig" im FAQ forum.

Joa. Stört Dich das "das passiert aber nicht"? Dann vielleicht: Die Datei wird aber nicht gelöscht, da sie durch einen anderen Prozess noch verwendet wird. Besserer? 😉

02.05.2008 - 18:18 Uhr

Grüße!

Ich verzweifel langsam ein wenig, bin glaube zu "betriebsblind" g.

Ich will eine Datei, die während der Laufzeit erstellt wird, per Mail an eine beliebige Mailadresse verschicken lassen. Der Versand funzt auch ganz gut, nur die Datei soll ja auch nach dem erfolgreichen Versand gelöscht werden - das passiert aber nicht.

Hier vielleicht mal der Code...


private bool mailSent = false;

private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
       string token = (string) e.UserState;
       if (e.Error == null)
      {
 	     mailSent = true;
      }
}


void sendmail()
{
	mailSent = false;
	string daten = "";			
	try
	{
		MailMessage myMessage = new MailMessage();
		myMessage.To.Add("kontakt@creative-work.net");
		myMessage.From = new MailAddress("x@y.de");
		myMessage.Subject = "CSharpmail";
		myMessage.Priority = MailPriority.High;
                myMessage.Body = "Mail enthält Anhang!";
// Checken in Verzeichnis, ob nicht versendete Dateien vorhanden sind
		if (check_old() > 0)
		{
			DirectoryInfo di = new DirectoryInfo("saves");
			FileInfo[] rgFiles = di.GetFiles("*.sav");
			foreach(FileInfo fi in rgFiles)
			{
				myMessage.Attachments.Add(new system.Net.Mail.Attachment("saves\\" + fi.Name));
			}	
		}
                SmtpClient Client = new SmtpClient("smtp.xyz.de", Convert.ToInt32("25"));
            	System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("y@y.de", "passwort");
            	Client.Credentials = credentials;
            	Client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
                Client.Send(myMessage);
                MessageBox.Show("Tagesabschluss erfolgreich!");
		myMessage.Dispose();
        }
        catch (Exception ex)
        {
		MessageBox.Show("Mail konnte nicht versand werden! " + ex.Message.ToString());
	}

// Dateien bei erfolgreichem Versand löschen
	if (mailSent)
	{
		DirectoryInfo di = new DirectoryInfo("saves");
		FileInfo[] rgFiles = di.GetFiles("*.sav");
		foreach(FileInfo fi in rgFiles)
		{
			try
			{
				if (mailSent)		
					File.Delete(@"saves\\" + fi.Name);
			}
			catch (Exception ex)
			{
				MessageBox.Show("Konnte Datei nicht löschen: " + ex.Message);
			}
		}
	}
} 

Würd mich freuen, wenn mir da jemand sagen kann wo es hapert.
Danke! =)

15.01.2008 - 16:58 Uhr

Örm, ich nutze diese Stelle mal für Huldigungen und Lobpreisungen.

*huldigeundlobpreis*

Sehr solides Programm, geht sehr gut. Erspart mir gerade viel Aufwand, daher Lob und und Anerkennung.

Kleines Request nebenbei:

Wie schaut's aus mit der Einbindung von SQL Befehlen zum Update? Würde z.B. sehr gerne ein sql Script durch das Updateprogramm ausführen lassen, momentan muss ich die Datei erst vom Server laden und dann durch mein Proggi auslesen, ausführen lassen und dann löschen. Könnte man das vielleicht mit integrieren?

THX

Coshi

21.11.2007 - 14:47 Uhr

Die Dou ist schon fein, Problem ist nur, dass diese Doku drei verschiedene Releases des Druckers allgemein behandelt - und mehr findest Du dazu schon beinahe gar nicht...

21.11.2007 - 14:46 Uhr

Jau, das Teil habe ich auch gefunden. Problem dort:

die dll kann bei mir mit SharpDevelop 2.2 nicht erstellt werden - ergo auch nix mit ausprobieren =(

Oder ich habe das System einfach nicht richtig verstanden, wie ich diese Sachen in mein Projekt einbinde.

20.11.2007 - 20:22 Uhr

Servus! Bei der Suche im Netz wird man ja ganz bekloppt im Schädel, massenweise Beispiele, keins funzt so richtig ...

Ich suche folgendes: eine Möglichkeit die Seriellen Ports im .NET 1.1 anzusprechen. Unter .NET 2 ist es ja dank System.IO.Ports richtig easy - hat da einer zufällig was für 1.1 am Start? Jeder Tipp wird dankend angenommen =)

Umstellen auf .NET 2 ist leider nicht möglich, da das Laufzeitsystem mit WinNT ausgestattet ist...

Ich danke schon einmal im Voraus!

20.11.2007 - 15:20 Uhr

Das sind ja die oben genannten ESC Codes. Doof nur, dass nur die Hälfte von denen funzt wie sie im Handbuch stehen - wahrscheinlich unterschiedliche Druckerversionen oder so...

20.11.2007 - 15:18 Uhr

Okay, sorry! =) Danke trotzdem.

20.11.2007 - 14:47 Uhr

Servus!

Hat einer eine Ahnung, ob es möglich ist, .NET 2 unter NT irgendwie zum Laufen zu kriegen? 1.1 geht nach der Installation der NT Service Packs bis 6a in Verbindung mit IE501...

20.11.2007 - 14:43 Uhr

Die Drucker unterscheiden zwischen "Partial Cut" also dem Anschneiden des Bons und Verbindungen an drei Stellen lassen zum quasi Selberabreißen (ist also nur eine Art Perforation) und dem Full Cut, wo der bon nur an der linken Seite eine Verbindung zum Folgebon erhält und der Rest komplett abgetrennt wird.

Kannste Dir quasi so vorstellen:

Partial Cut:

---0-------0--------0---

Full Cut:

--0----------------------

wobei 0 die Verbindung und --- der Schnitt ist.

20.11.2007 - 11:18 Uhr

Soooooo, Lösung gefunden und implementiert. Lag an diesem sch***** Epson Advanced Printer Driver, der konnte nicht so wie er sollte.

Also eine Lösung direkt über die COM Ports gebastelt -> kein Treiber mehr notwendig.

Hier mal er einfache Ansatz einer Klasse für die Ansteuerung:


using System;
using System.IO.Ports;

Für den Zugriff auf die Ports. Dann einfach eine leere Klasse dem Projekt hinzufügen, den folgenden Text in die Klasse werfen:


public class ESCPrint
	{
		private	SerialPort Drucker;
                // Constructor für Standardwerte
		public ESCPrint() 
		{
			Drucker = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
		}
                // Constructor für benutzerdefinierte Werte
		public ESCPrint(string com, int baud, Parity par, StopBits st)
		{
			Drucker = new SerialPort(com, baud, par, 8, st);
		}
		public void start()
		{
			Drucker.Open();	
			// Drucker initialisieren ESC @
                        Drucker.Write(Convert.ToChar(27)+"@");
                        // Druck auf Journal und Bonrolle aktivieren ESC c 0 3 
                        // sicherheitshalber zu ESC z 1
			Drucker.Write(Convert.ToChar(27)+"c"+"0"+"3");
		}
		public void close()
		{
			Drucker.Close();	
		}
                // Unterstreichen aktivieren / deaktivieren
		public void underline(int status)  [0,1] für aus / an
		{
			if (status == 0)
				Drucker.Write(Convert.ToChar(27) + "-"+"0");
			else
				Drucker.Write(Convert.ToChar(27) + "-"+"1");
		}
                // Textausrichtung festlegen
		public void alignment(int status)  [0,1, 2] für links, mitte, rechts
		{
			if (status == 0)
				Drucker.Write(Convert.ToChar(27)+"a"+"0");
			else if (status == 1)
				Drucker.Write(Convert.ToChar(27)+"a"+"1");
			else
				Drucker.Write(Convert.ToChar(27)+"a"+"2");
		}
                // Fettschrift aktivieren / deaktivieren
		public void bold(int status) // [0,1] für aus / an
		{
			Drucker.Write(Convert.ToChar(27)+"E"+status.ToString());
		}
                // Vollen Schnitt durchführen (Teilweise Schnitt mit ESC m)
		public void endcut()
		{
			Drucker.Write(Convert.ToChar(27)+"@");
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(10).ToString());
			Drucker.Write(Convert.ToChar(27) + "i");
		}
                // Leerzeile drucken
		public void clearline()
		{
			Drucker.WriteLine(Convert.ToChar(10).ToString());
		}
                // Trennlinie drucken
		public void seperator()
		{
			Drucker.Write(Convert.ToChar(27)+"a"+"1");
			Drucker.WriteLine("--------------------------------------");
			Drucker.Write(Convert.ToChar(27)+"a"+"0");
		}
                // Format setzen, 1-9, wobei 9 am besten kommt
		public void format(int status)
		{
			Drucker.Write(Convert.ToChar(27)+"!"+status.ToString());
			// Unidirektionalen Druck einschalten
			Drucker.Write(Convert.ToChar(27)+"U"+"1");
		}
                // Formatierung zurücksetzen
		public void endformat()
		{
			Drucker.Write(Convert.ToChar(27)+"U"+"0");
			Drucker.Write(Convert.ToChar(27)+"@");
		}
                // Paralleldruck auf Bon- und Journalrolle aktivieren
		public void source(int status)
		{
			Drucker.Write(Convert.ToChar(27)+"z"+status.ToString());
		}
		// Einfach Zeile ausgeben, Sonderzeichen sind druckerabhängig!!!
		public void line(string text)
		{	
			Drucker.WriteLine(text);
		}
	}

Im Hauptprogramm dann nur noch:


  ESCPrint printer = new ESCPrint();
  printer.start();
  printer.source(1);
  printer.alignment(1);
  printer.bold(1);
  printer.line("Testtext");
  printer.endcut();
  printer.source(0);
  printer.close();

Kundendisplays können über das gleiche Prinzip angesteuert werden:

  1. Mit dem Port verbinden
  2. writeline auf Port
  3. Port schließen

Da die Drucker zumeist den ESC Befehlssatz beherrschen, muss man dann nur rausfinden, welche Befehle der aktuelle Drucker unterstützt. Mein Testdrucker hier, der TM-U950 von Epson, kann z.B. keinen Papierrückschub (nur Vorschub) und keine Eurozeichen...

Falls einer eine Lösung hat, wie man einen Fullcut ausführen kann ohne dass da so viel Platz am Anfang des Bons ist, immer her damit! =)

18.11.2007 - 12:12 Uhr

Jau, unter C# code ich.

Das Galileo Book habe ich mir auch schon einmal angeguckt. Sollte eigentlich auch nicht das Problem sein damit regulär unter C# zu drucken - im Microsoft Developer Network gibt's ja auch einen passenden Quelltext für eine "RawPrinterHelper"-Klasse. Die Sache ist nur die, dass dort ein Treiber für den Drucker wohl installiert sein muss, sonst druckt das Teilchen nicht.
Bei einem Versand von raw Daten an eine serielle Schnittstelle, sollte wohl kein Treiber nötig sein (hab ich irgendwo gelesen) und der Windows Druckmanager umgangen - das ist das was ich mir so vorstelle, drucken ohne Treiber, direkt über die Schnittstelle.

Sollte es nur mit dem Treiber möglich sein, tut sich mir gerade das Problem virtueller COM Port auf, weil ich keinen mehr an meinem "schönen" Mainboard dran habe. Hab mir extra einen COM2USB Adapter gekauft und muss nun quasi einen COM Port auf USB switchen, sollte aber irgendwie gehen, suche gerade bei Google...

18.11.2007 - 11:08 Uhr

Servus!

Ich habe nun schon viel hier und in anderen Bereichen gesucht, aber leider noch keine wirklich funktionierende Lösung gefunden.

Ich habe einen Bondrucker (Epson TM-T88) und möchte über diesen drucken.
Hab einiges an Quelltexten dazu gefunden, aber funzen tut das alles nicht so wirklich.

Beispiel:

ofstream Drucker;
Drucker.open("dev/usb/lp0");
Drucker<<"Das ist ein Test"; // Ausgabe auf den Drucker

Doof nur, dass "ofstream" nicht erkannt wird, eine Referenz gefordert wird und ich nicht weiß, wo ich das Teil denn finde. In C++ war es wohl der std Namespace - jedoch bei C#.NET ... Kein Plan.

Hat vielleicht einer paar Quelltexte rumliegen bzw. kann mir einer was zu diesem Thema schreiben?

Ich danke schonmal im Voraus!

LG

14.09.2007 - 13:49 Uhr

Hmm, Servus erstmal. Dazu hätte ich auch glatt mal eine Frage in die gleiche Richtung:

Das Programm läuft auf dem Entwicklungsrechner aus der Exe gestartet ohne Probs, diese auf einen anderen Rechner geschmissen schreit eine Fehlermeldung. Hab schon das Forum durchforstetet (vielleicht mal wieder nur die falschen Suchbegriffe oOo), aber bin nicht fündig geworden. Daher von mir die Frage, ob es ein Tutorial oder eine Beschreibung gibt, wie der allgemeine Ablauf ist, mein Proggi auf anderen Rechnern zum laufen zu kriegen ... Danke schonmal =)