Hallo zusammen,
ich habe schon sehr viele Artikel über das Drucken gelesen aber leider komme ich nicht weiter.
Ich habe in einem Datagrid mehrere Einträge und möchte jede Zeile aus dem Datagrid auf eine neue Seite drucken.
Leider druckt mir der Drucker alle Seiten auf eine Seite übereinander. Ich komme einfach nicht drauf warum es nicht auf verschiedene Seiten verteilt wird.
Es sieht so aus als ob der Drucker nicht mitbekommt, dass er eine neue Seite erstellen soll.
Wäre toll wenn mir jemand einen Tip hat, wo mein Fehler liegt.
Vielen Dank.
private void printDocumentRMA_PrintPage(object sender, PrintPageEventArgs e)
{
//Für jedes Gerät
for (int i = 0; i < dataGridViewRMADevices.Rows.Count - 1; i++)
{
int iTabText = 55;
int iLeftSide = 13;
float fCountLine = 110;
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
RectangleF rectFPapier = e.MarginBounds;
Pen oPen = new Pen(Brushes.Black,0.3F);
FontFamily myFontFamily = new FontFamily("Arial");
Font oFont = new Font(myFontFamily, 3, FontStyle.Bold, GraphicsUnit.Pixel);
Font myFontBold = new Font(myFontFamily, 8, FontStyle.Bold, GraphicsUnit.Pixel);
Font oFontNormal = new Font(myFontFamily, 4, FontStyle.Regular, GraphicsUnit.Pixel);
Font oFontUnderline = new Font(myFontFamily, 2, FontStyle.Underline, GraphicsUnit.Pixel);
//Info Reparaturbegleitschreiben
e.Graphics.DrawString("Reparaturbegleitschreiben", myFontBold, Brushes.Black, 50, 115);
fCountLine = 130;
//Daten Reparatur (Datum, Email, Telefon, Fax)
e.Graphics.DrawRectangle(oPen, 10, fCountLine-2, 180, 27);
e.Graphics.DrawString("Datum:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString(dateTimePickerRMA.Value.ToShortDateString(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine+=5;
e.Graphics.DrawString("Ansprechpartner:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString(textBoxRMAAnsprechpartner.Text.Trim(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine+=5;
e.Graphics.DrawString("E-Mail:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString(textBoxRMAEMail.Text.Trim(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine+=5;
e.Graphics.DrawString("Telefon: ", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString(textBoxRMATelefon.Text.Trim(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine+=5;
e.Graphics.DrawString("Fax:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString(textBoxRMAFax.Text.Trim(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine+=10;
//Daten Gerät
float fLineStart = fCountLine;
e.Graphics.DrawString("Seriennummer:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString (dataGridViewRMADevices.Rows[i].Cells ["Seriennummer"].Value.ToString().Trim(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine+=5;
//Fehlerbeschreibung
string sTempSonstiges = "";
if (dataGridViewRMADevices.Rows[i].Cells["Error_KD"].Value.ToString().Length <= 50)
{
e.Graphics.DrawString("Fehlerbeschreibung: ", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString (dataGridViewRMADevices.Rows[i].Cells ["Error_KD"].Value.ToString(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine += 5;
}
else
{
sTempSonstiges = dataGridViewRMADevices.Rows[i].Cells["Error_KD"].Value.ToString();
//ist größer als 50 dann unterteilen
if (sTempSonstiges.Length > 0)
{
string sTemp = "";
e.Graphics.DrawString("Fehlerbeschreibung: ", oFont, Brushes.Black, iLeftSide, fCountLine);
int iCount = 0;
//mehr als 50
while (true)
{
//dann die ersten 50 Zeichen drucken
sTemp = CutLongString(sTempSonstiges, 50);
e.Graphics.DrawString(sTemp.Trim(), oFont, Brushes.Black, iTabText, fCountLine);
//existieren umbrüche ja dann erhöhen den Druckbereich
iCount = CountChar(Environment.NewLine, sTemp);
if (iCount > 0)
{
//mehrer Einträge gefunden
for (int j = 0; j <= iCount; j++)
{
fCountLine = fCountLine + 5;
}
}
//danach den bereits gedruckten Teil löschen
sTempSonstiges = sTempSonstiges.Remove(0, sTemp.Length);
if (sTempSonstiges.Length <= 50)
{
fCountLine = fCountLine + 5;
//drucken
e.Graphics.DrawString(sTempSonstiges.Trim(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine = fCountLine + 5;
// und Schleife beenden
break;
}
fCountLine = fCountLine + 5;
}
}
}
//Rectangle für Seriennummer... Variable größe
//Zubehör
e.Graphics.DrawString("Zubehör:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString (dataGridViewRMADevices.Rows[i].Cells ["Zubehoer"].Value.ToString().Trim(), oFont, Brushes.Black, iTabText, fCountLine);
float fErgebnis = fCountLine - fLineStart;
e.Graphics.DrawRectangle(oPen, 10, fLineStart-2, 180, fErgebnis+7);
//Hinweis Kostenvoranschlag
fCountLine += 10;
e.Graphics.DrawRectangle(oPen, 10, fCountLine-2, 180, 17);
e.Graphics.DrawString("Hinweis:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString("Gewährleistungsfall, andernfalls wird ein Kostenvoranschlag benötigt! Kostenvoranschlag", oFont, Brushes.Black, iTabText, fCountLine);
e.Graphics.DrawString("für alle Einzelkomponenten und Überprüfungen zusammengefasst unter der Seriennummer", oFont, Brushes.Black, iTabText, fCountLine += 5);
e.Graphics.DrawString("des Gerätes.", oFont, Brushes.Black, iTabText, fCountLine += 5);
//TEST
fCountLine += 10;
e.Graphics.DrawRectangle(oPen, 10, fCountLine-2, 180, 8);
e.Graphics.DrawString("TEST-RMA:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString(textBoxRMANumberWAROK.Text, oFont, Brushes.Black, iTabText, fCountLine);
fCountLine += 10;
//RMA Hersteller
if (dataGridViewRMADevices.Rows[i].Cells["RMAHersteller"].Value.ToString().Length > 0)
{
e.Graphics.DrawRectangle(oPen, 10, fCountLine - 2, 180, 8);
e.Graphics.DrawString(oDataHersteller.Rows[0]["Unternehmen"].ToString() + " - RMA:", oFont, Brushes.Black, iLeftSide, fCountLine);
e.Graphics.DrawString (dataGridViewRMADevices.Rows[i].Cells["RMAHersteller"].Value.ToString(), oFont, Brushes.Black, iTabText, fCountLine);
fCountLine += 10;
}
//Erklärung
e.Graphics.DrawRectangle(oPen, 10,fCountLine+3, 180, 15);
e.Graphics.DrawString("Bitte senden Sie das defekte Gerät an die oben genannte Empfänger-Adresse.", oFont, Brushes.Black, iLeftSide, fCountLine += 5);
e.Graphics.DrawString("Legen Sie das Reparaturbegleitschreiben zu den Versandunterlagen.", oFont, Brushes.Black, iLeftSide, fCountLine += 5);
if (i == (dataGridViewRMADevices.Rows.Count - 2))
{
//Ende der Liste erreicht.
e.HasMorePages = false;
}
else
{
//Seite zu Ende-Seite drucken
e.HasMorePages = true;
}
}
}
Hallo zusammen,
ich habe 2 bytes mit jeweils einem Hexwert:
mybyte[0] = 0xB3;
mybyte[1] = 0x20;
Nun möchte ich, dass Array in die Zahl umwandeln Wenn ich diese Werte in den Taschenrechner eingebe, erhalte ich die Zahl 45856.
Aber wie bekomme ich es in C# hin? Wenn es nur ein byte wäre dann könnte man ja einfach ein int davor schreiben aber bei zwei bytes?
Habe versucht das ganze so zu bewerkstelligen:
int iNumber = (int)0xB3 + 0x20;
Aber dann bekomme ich nur eine falsche Zahl.
Weiss jemand wie man das bewerkstelligen kann?
Hab da leider keine Ahnung wie ich das wandeln kann.
Bin für jede Hilfe dankbar.
Hallo habe das ganze Forum und auch schon google durchsucht doch leider ohne Erfolg.
Ich habe eine Software erstellt (C#, VS2005, CF 2.0) die eine serielle Schnittstelle öffnet und die Daten in einer Textbox ausgibt.
Ich habe nun an den seriellen Port eine GPS-Mouse gehängt, die durchgehend Daten auf den Port schickt.
Mein Problem ist nun, dass wenn ich die Schnittstelle wieder schließen möchte dies nicht geschieht und sich das Programm aufhängt.
Im Anhang findet ihr mein komplettes Projekt. Ich habe bereits versucht mit BeginInvoke zu arbeiten aber leider ohne Erfolg.
Beim Schließen meines Ports erhalte ich nach gewisser Zeit nachdem ich den Close Befehl geschickt auch einen StackOverflow. Dies erhalte ich dann in DoUpdateRS232Port1().
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
serialPort1.DtrEnable = true;
//comboBoxComPort.SelectedIndex = 1;
//comboBoxParity.SelectedIndex = 2;
//comboBox1.SelectedIndex = 3;
UpdateHandler = new EventHandler(DoUpdateRS232Port1);
textBoxSend.Text = "F";
}
void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
ReadLineBuffer = serialPort1.ReadLine();
this.BeginInvoke(UpdateHandler);
}
catch
{ }
}
public void DoUpdateRS232Port1(object s, EventArgs e)
{
//bEnd = true;
//int x = serialPort1.ReadByte();
//byte[] myByte = new byte[serialPort1.BytesToRead];
//serialPort1.Read(myByte, 0, serialPort1.BytesToRead);
//string stest = serialPort1.ReadExisting();
//textBoxInfo.Text = textBoxInfo.Text + stest;// Encoding.Default.GetString(myByte, 0, myByte.Length);
//textBoxInfo.SelectionStart = textBoxInfo.Text.Length;
//textBoxInfo.ScrollToCaret();
//Application.DoEvents();
textBoxInfo.Text += ReadLineBuffer;// Encoding.Default.GetString(myByte, 0, myByte.Length);
ReadLineBuffer = "";
textBoxInfo.SelectionStart = textBoxInfo.Text.Length;
textBoxInfo.ScrollToCaret();
Application.DoEvents();
}
private void Form1_Closing(object sender, CancelEventArgs e)
{
if (serialPort1.IsOpen == true)
{
try
{
serialPort1.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
//Thread.Sleep(1000);
string bla = serialPort1.ReadExisting();
serialPort1.Close(); //Error
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
}
Hi,
weiss jetzt leider grad nicht was du mit DropDownlist meinst - hab die nicht gefunden oder meinst du Listbox? Ich würd aber mal probieren den Wert Text zu belegen, vielleicht hilft dies ja schon.
gruss andi
Hallo,
bin gerade dabei eine Setupdatei für ein mobiles Gerät zu erstellen. Ich registriere Treiber von FTDI um auf dem mobilen Gerät aus einem USB mehrere RS232 Schnittstellen zu generieren. Nun hab ich aber das Problem, das ich ja bei der Registrierung die COM Schnittstellen nicht kenne, die automatisch vom mobilen Gerät vergeben werden. Die bräuchte ich aber, da an RS232 Ports Modem angeschlossen werden und ich diese ebenfalls für die Auswahl auf dem mobilen Gerät sichtbar machen möchte:
Hier mal die Registryeinträge die ich mache:
[RegKeys]
"HKLM","ExtModems\FzghWAPort1","DeviceType","0x00010001","1"
"HKLM","ExtModems\FzghWAPort1","FriendlyName","0x00000000","Port Replikator C"
"HKLM","ExtModems\FzghWAPort1","Port","0x00000000","COM5:"
"HKLM","ExtModems\FzghWAPort3","FriendlyName","0x00000000","Port Replikator A"
"HKLM","ExtModems\FzghWAPort3","Port","0x00000000","COM7:"
"HKLM","ExtModems\FzghWAPort3","DeviceType","0x00010001","1"
"HKLM","ExtModems\FzghWAPort2","Port","0x00000000","COM6:"
"HKLM","ExtModems\FzghWAPort2","FriendlyName","0x00000000","Port Replikator B"
"HKLM","ExtModems\FzghWAPort2","DeviceType","0x00010001","1"
"HKLM","Drivers\USB\FTDI_DEVICE","Dll","0x00000000","ftdi_ser.dll"
"HKLM","Drivers\USB\LoadClients\1027_24577\Default\Default\FTDI_DEVICE","Dll","0x00000000","ftdi_ser.dll"
"HKLM","Drivers\USB\FTDI_DEVICE_6001","LatencyTimer","0x00010001","16"
"HKLM","Drivers\USB\FTDI_DEVICE_6001","Index","0x00010001","7"
"HKLM","Drivers\USB\FTDI_DEVICE_6001","Prefix","0x00000000","COM"
"HKLM","Drivers\USB\FTDI_DEVICE_6001","Dll","0x00000000","ftdi_ser.dll"
"HKLM","Drivers\USB\FTDI_DEVICE_6001","DeviceArrayIndex","0x00010001","5"
"HKLM","Drivers\USB\FTDI_DEVICE_6001","InitialIndex","0x00010001","5"
"HKLM","Drivers\USB\FTDI_DEVICE_6001","Version","0x00000000","1.0.2.9"
"HKLM","Drivers\USB\ClientDrivers\FTDI_DEVICE","Dll","0x00000000","ftdi_ser.dll"
Wie ihr seht ist mein Problem bei den ExtModems wie kann ich dies nun bewerkstelligen, dass er zur Laufzeit d.h. wenn das mobile Geräte die Ports erhält entsprechend die Modemports vergibt?
Danke für die Hilfe
Gruss Andi
Hi,
der Link nutzt leider nicht, da hier auch wieder auf das richtige SDK bezug genommen wird.
Aber trotzdem Danke 🙂
Weiss jemand eine Implementierung der Methode GetProcessTimes(...) für das Compact Framework?`
Hallo bin jetzt schon länger auf der Suche nach einer Lösung doch leider habe ich bis jetzt nichts gefunden. Und zwar bin ich auf der Suche nach einer Lösung die CPU Auslastung zu erhalten und zwar im Compact Framework 2.0. Ich will einen Taskmanager ähnlich wie bei Windows XP wo alle Prozesse mit zugehöriger Speicherbelegung und CPU Zeit angezeigt werden.
Habe im Inet GetThreadTimes gefunden doch leider bekomme ich die Umsetzung nicht hin.
Hoffe jemand weiss rat oder kann mir einen Link geben wo dies jemand schon umgesetzt hat.
mfg Andi
Hallo ich hab es jetzt ein bisschen was gefunden was eigentlich funktionieren sollte aber leider wird das TrayIcon nicht angezeigt weiss jemand warum?
// Extract icon from the application's exe
// This requires that app icon were set in the project properties
string szPath = Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
ExtractIconEx(szPath, 0, 0, ref hIcon, 1);
// Fill NOTIFYICONDATA with data
NOTIFYICONDATA nid = new NOTIFYICONDATA();
// In our struct definition we have omitted emebedded wchar array size 64 - we need to account for it
int cbSize = Marshal.SizeOf(nid) + 64 * Marshal.SystemDefaultCharSize;
// Allocate memory
IntPtr pData = LocalAlloc(LPTR, cbSize);
// Set fields of the NOTIFYICONDATA (see SDK documentation)
nid.cbSize = cbSize;
nid.hIcon = hIcon;
nid.hWnd = LocalAlloc(LPTR,Marshal.SizeOf(this));
nid.uCallbackMessage = 0;
nid.uID = 1;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Marshal.StructureToPtr(nid, pData, false);
// Add tooltip
char[] arrTooltip = "My tooltip".ToCharArray();
Marshal.Copy(arrTooltip, 0, (IntPtr)(pData.ToInt32() + Marshal.SizeOf(nid)), arrTooltip.Length);
// Register with shell
bool ret = Shell_NotifyIcon(NIM_ADD, pData);
//Free memory
LocalFree(pData);
Thx
andi
Hallo Leute,
versuche gerade verzweifelt bei einem Compact Framework 1.1 Projekt ein NotifyIcon in der Taskbar zu erzeugen. Habe hierzu die API Methode Shell_NotifyIcon() gefunden aber leider komme ich damit nicht zurecht.
Mein bisheriger Code:
[DllImport("coredll.dll")]
internal static extern int Shell_NotifyIcon(int dwMessage, ref NOTIFYICONDATA pnid);
struct NOTIFYICONDATA
{
int cbSize;
IntPtr hWnd;
int uID;
int uFlags;
int uCallbackMessage;
IntPtr hIcon;
char mychar;
}
Tja und hier fängt nun mein Problem an, wie kann ich denn dies nun in C# realisieren? Kennt jemand eine Seite wo man ein Beispiel findet, habe leider nichts gefunden 🙁
Vielen Dank für die Hilfe
Andi
Nach langem Suchen habe ich jetzt herausgefunden, dass ich das ganze mit WindowsMessage realisieren muss. Doch leider bekomme ich es nicht hin, diese Nachricht zusammenzubasteln, dass man einen string mit übermitteln kann.
string myTest = "Mein Text";
Message msg = Message.Create((IntPtr)HWND_BROADCAST,1,new IntPtr(*myTest),(IntPtr)1);
MessageWindow.PostMessage(ref msg);
Was muss ich denn nun umstellen damit dies funktioniert?
Mfg
Andi