OK thx ...
ja das scheint die Erklärung zu sein...
Na nur gut das VS 2022 in 2 Wochen kommt...
ich hab hier einfach mal ein Mimi Projekt erstellt um zu verdeutlichen was ich meine.
Also es ist ein Form und ein User Control mit einer simplen TextBox.
Das User Control hab ich nach dem compilieren per Designer und Drag and Drop in das User Control gezogen.
Alles noch als mein Projekt noch auf Any CPU stand.
Nun habe ich auf x64 gestellt und einmal das Projekt erstellt und habe nun versucht Form1 zu öffnen.
Und bekomme genau diesen Fehler.
Hi
erstmal als angehängtes Bild meine Build-Optionen. Die sind und waren hier auch die ganze Zeit auf x64.
also: was ich bisher raus gefunden habe:
Sobald ich ein Projekt auf x64 stelle und in diesem Projekt eigene UserControls in ein anderes Control ziehe gibt das System mir den Fehler siehe oben aus.
Das passiert wenn ich im selben Projekt 2 User Controls habe und eins ins andere ziehe das passiert auch wenn ich aus einem anderen Projekt ein User Control verwende.
wieso funktionieren meine ableitungen nicht ?
Hallo,
ich habe Probleme mit einem bestehenden Projekt.
Die Projektmappe umfasst mehr als 50 Projekte die zu diesem Programm gehören
und ich will die nun von x86 auf x64 umstellen, da eine Komponente des Systems nur noch x64 unterstützt.
Ich habe das also entsprechend umgestellt und die Software lässt sich auch entsprechund compilieren und auch ausführen und es funktioniert alles.
Das Problem was ich hab befindet sich im Visual Studio 2019. Wenn ich dort verschiedene Guis aufmachen will bekomm ich extrem viele Fehler.
Also von meinen 100 user controls lassen sich ca die hälfte nicht öffnen.
Teilweise habe ich user controls geschrieben und die dann über Tools in andere rein gezogen. Da sagt mir der Designer auf einmal:
Fehlermeldung:
Der Typ "GUI.UserControls.ucGroupControl" wurde nicht gefunden. Stellen Sie sicher, dass auf die Assembly, die diesen Typ enthält, verwiesen wird. Wenn dieser Typ Teil Ihres Entwicklungsprojekts ist, stellen Sie sicher, dass das Projekt mithilfe der Einstellungen für die aktuelle Plattform oder eine beliebige CPU erstellt wurde.
Und solche Fehler hab ich ganz viele.
Was ist das und wie beheb ich das?
Mfg Kaladial
ok habs selbst raus gefunden...
private void btnTest_Click(object sender, EventArgs e)
{
string batchnr = "2005368";
string exp = "2023-07-26";
string mad = "2020-07-26";
string gtin = "06221032240262";
string workorder_code = "242040_2005368_1";
string[] sn = {"200536810100508", "200536810100509", "200536810100510"};
string status = "Accepted";
XElement xmlTree1 = new XElement("SERIALIZED_ITEM");
for (int i = 0; i < sn.Length; i++)
{
xmlTree1.Add(new XElement("SERIALIZED_ITEM",
new XAttribute("SERIAL", sn[i]),
new XAttribute("Status", status)));
}
XNamespace xsiNs = "http://www.w3.org/2001/XMLSchema-instance";
XDocument xDoc = new XDocument(
new XDeclaration("1.0", "UTF-8", ""),
new XElement("PRODUCTION_IMPORTATION",
new XAttribute(XNamespace.Xmlns + "xsi", xsiNs),
new XAttribute(xsiNs + "noNamespaceSchemaLocation", "Batch.xsd"),
new XElement("BATCH",
new XAttribute("BATCH_NUMBER", batchnr),
new XAttribute("MANUFACTURE_DATE", mad),
new XAttribute("EXPIRATION_DATE", exp),
new XElement("WORKORDER",
new XAttribute("GTIN", gtin),
new XAttribute("WORKORDER_CODE", workorder_code),
from el in xmlTree1.Elements()
select el
)
)
)
);
xDoc.Save("text.xml");
}
nur noch eine frage der verständnis halber:
warum muss ich
XElement xmlTree1 = new XElement("SERIALIZED_ITEM");
dieses element erzeugen?
eigentlich adde ich doch das hinzu.
hi
ich muss eine forschleife um
xDoc.Root.Add(new XElement("SERIALIZED_ITEM",
new XAttribute("SERIAL", sn),
new XAttribute("Status", status)
));
setzen, da ich die elemente dynamisch aus einer DB in ein File schreiben will und das geht nicht innerhalb des 1. befehls. also hab ich mittels dem Add versucht dies hinzuzufügen. Mir war fast klar, das .Root das falsche ist, aber nur .Add hat nicht funktioniert.
Wie gebe ich also an, wenn ich den 1. Befehl so hab, das das, was in meiner For-Schleife an die richtige Position kommt, das hab ich bisher in den Dokus die ich gelesen hab, nicht gefunden.
Mfg Kala
Hi
ich muss eine XML datei erzeugen.
bisheriger code:
string batchnr = "2005368";
string exp = "2023-07-26";
string mad = "2020-07-26";
string gtin = "06221032240262";
string workorder_code = "242040_2005368_1";
string sn = "200536810100508";
string status = "Accepted";
XNamespace xsiNs = "http://www.w3.org/2001/XMLSchema-instance";
XDocument xDoc = new XDocument(
new XDeclaration("1.0", "UTF-8", "no"),
new XElement("PRODUCTION_IMPORTATION",
new XAttribute(XNamespace.Xmlns + "xsi", xsiNs),
new XAttribute(xsiNs + "noNamespaceSchemaLocation", "Batch.xsd"),
new XElement("BATCH",
new XAttribute("BATCH_NUMBER", batchnr),
new XAttribute("MANUFACTURE_DATE", mad),
new XAttribute("EXPIRATION_DATE", exp),
new XElement("WORKORDER",
new XAttribute("GTIN", gtin),
new XAttribute("WORKORDER_CODE", workorder_code)
)
)
));
xDoc.Root.Add(new XElement("SERIALIZED_ITEM",
new XAttribute("SERIAL", sn),
new XAttribute("Status", status)
));
xDoc.Root.Add(new XElement("SERIALIZED_ITEM",
new XAttribute("SERIAL", sn),
new XAttribute("Status", status)
));
xDoc.Save("text.xml");
ergebnis:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<PRODUCTION_IMPORTATION xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Batch.xsd">
<BATCH BATCH_NUMBER="2005368" MANUFACTURE_DATE="2020-07-26" EXPIRATION_DATE="2023-07-26">
<WORKORDER GTIN="06221032240262" WORKORDER_CODE="242040_2005368_1" />
</BATCH>
<SERIALIZED_ITEM SERIAL="200536810100508" Status="Accepted" />
<SERIALIZED_ITEM SERIAL="200536810100508" Status="Accepted" />
</PRODUCTION_IMPORTATION>
das ist leider nur fast richtig...
die
<SERIALIZED_ITEM SERIAL="200536810100508" Status="Accepted" />
<SERIALIZED_ITEM SERIAL="200536810100508" Status="Accepted" />
sollen innerhalb des WORKORDER stehen.
wie bekomm ich die also höher in die xml rein?
das eigentliche ziel ist das:
<?xml version="1.0" encoding="utf-8"?>
<PRODUCTION_IMPORTATION xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Batch.xsd">
<BATCH BATCH_NUMBER="2005368" MANUFACTURE_DATE="2020-07-26" EXPIRATION_DATE="2023-07-26">
<WORKORDER GTIN="06221032240262" WORKORDER_CODE="242040_2005368_1">
<SERIALIZED_ITEM SERIAL="200536810100508" Status="Accepted"/>
<SERIALIZED_ITEM SERIAL="200536810100516" Status="Accepted"/>
</WORKORDER>
</BATCH>
</PRODUCTION_IMPORTATION>
mfg kala
aber wie les ich das aus ?
ich hatte überlegt das mit der variante zu machen:
XmlDocument xml = new XmlDocument(); xml.LoadXml(xml_filemname); XmlNodeList xnList = xml.SelectNodes("???"); foreach (XmlNode xn in xnList) { string ppo = xn["ppo"].InnerText; }
aber was muss ich da bei ??? eingaben?
mal davon abgesehn das das auch nicht gingxml.LoadXml(xml_filemname); schmeisst ne exception
{"Ungültige Daten auf Stammebene. Zeile 1, Position 1."}
da stehen doch wohl 2 fragen drin...
ich habs jetzt so:
try
{
xmlF = new XMLFile();
string ppo = "";
string lotNumber = "";
string expirationDate = "";
string productionDate = "";
XmlDocument xml = new XmlDocument();
xml.Load(xml_filemname);
XmlNodeList xnList = xml.SelectNodes("/order/par");
foreach (XmlNode xn in xnList)
{
if (xn.OuterXml.Contains("ppo"))
{
ppo = xn.InnerText;
}
if (xn.OuterXml.Contains("lotNumber"))
{
lotNumber = xn.InnerText;
}
if (xn.OuterXml.Contains("expirationDate"))
{
expirationDate = xn.InnerText;
}
if (xn.OuterXml.Contains("productionDate"))
{
productionDate = xn.InnerText;
}
}
string gtin = "";
string levelQty = "";
List<string> sgtinSerial = new List<string>();
xnList = xml.SelectNodes("/order/level/par");
foreach (XmlNode xn in xnList)
{
if (xn.OuterXml.Contains("gtin"))
{
gtin = xn.InnerText;
}
if (xn.OuterXml.Contains("levelQty"))
{
levelQty = xn.InnerText;
}
if (xn.OuterXml.Contains("sgtinSerial"))
{
//sgtinSerial = xn.InnerText;
}
}
xnList = xml.SelectNodes("/order/level/par/el");
foreach (XmlNode xn in xnList)
{
sgtinSerial.Add(xn.InnerText);
}
xmlF.ppo = ppo;
xmlF.gtin = gtin;
xmlF.lotNumber = lotNumber;
xmlF.expirationDate = expirationDate;
xmlF.productionDate = productionDate;
xmlF.countSN = levelQty;
xmlF.sgtinSerial = sgtinSerial;
}
catch (Exception ex)
{
string e = ex.Message;
}
habs selber raus gefunden
sinnvoller wäre aber der hinweis, das zum einen Load nicht LoadXML benutzt werden muss
und 2. das die Pfade immer die 1. elemente in dem xml sind
also das ich /order/par
oder /order/level/par/el schreiben muss um an die inhalte ran zu kommen und das die als "name"
beschriebenen elemente überhaupt keine wirkung haben und man sie nur im outer text findet...
das wären sinnvolle hilfen gewesen
sorry aber die links bringen mir nicht wirklich was ...
kannst du mir an hand von nem kleinen beispiel das net mal erklären ?
ich schreib ja auch was ich bisher gemacht hab ...
aber wie les ich das aus ?
ich hatte überlegt das mit der variante zu machen:
XmlDocument xml = new XmlDocument();
xml.LoadXml(xml_filemname);
XmlNodeList xnList = xml.SelectNodes("???");
foreach (XmlNode xn in xnList)
{
string ppo = xn["ppo"].InnerText;
}
aber was muss ich da bei ??? eingaben?
mal davon abgesehn das das auch nicht ging
xml.LoadXml(xml_filemname); schmeisst ne exception
{"Ungültige Daten auf Stammebene. Zeile 1, Position 1."}
Hallo zusammen,
ich komm grad nicht weiter.
Ich habe eine XML bekommen die Inhalte enthält die ich so noch nicht kannte.
Wie kann ich so eine XML auslesen ?
<?xml version="1.0" encoding="UTF-8"?>
<order Version="1.0">
<par name="ppo">245571_2007617_1</par>
<par name="lotNumber">2007617</par>
<par name="expirationDate">10/31/2023 00:00:00</par>
<par name="productionDate">10/31/2020 00:00:00</par>
<level name="B">
<par name="gtin">06221032240842</par>
<par name="sgtinSerial">
<el>200761710100012</el>
<el>200761710100019</el>
<el>200761710100102</el>
<el>200761710100184</el>
<el>200761710100215</el>
<el>200761710999957</el>
</par>
<par name="levelQty">11500</par>
</level>
</order>
Ich versteh nicht was dieses par da spll.
Danke für die Hilfe
mfg Kala
Hallo,
ich habe eine Frage:
ich möchte ein kleines Konsolenprogramm aus meiner WindowsForm Applikation starten.
Das ist noch nicht das Problem:
System.Diagnostics.Process.Start("test.exe");
Nun gibt diese test.exe aber einen Intwert zwischen -1 und 3 zurück und ich möchte entsprechend
darauf reagieren. Und genau das bekomm ich nicht hin.
wie kann man den Rückgabewert der test.exe abfragen?
Mfg Kaladial
hat sich erledigt
variante 3 hat funktioniert man musste nur
System.Net.ServicePointManager.Expect100Continue = false;
hinzufügen und die syntax für den befehl richtig schreiben
string data = "text=" + sms + "&to=" + tel + "&username=" + user + "&password=" + passwort + "@sms";
mfg Kaladial
Hallo,
ich möchte gern ein kleines Programm haben, das über eine URL einen Text an einen SMS Server
sendet, der diesen dann an ein Handy weiter leitet.
Der Aufruf muss wie folgt aussehen:
http://10.130.143.60/api.php?text=%&<tel_nummer>&username=<value>&password=<value>@sms_inhalt
Ich habe nun ein bisschen gegooglet und bin auf verschiedene Arten gestoßen um das zu erledigen.
Leider funktionieren die nicht.
Was genau mach ich falsch?
private void test1(string tel, string sms)
{
WebRequest request = WebRequest.Create("http://10.130.143.60/api.php?text=%&" + tel + "&username=<value>&password=<value>@" + sms); //PW UND USERNAME ERSETZT
request.Method = "POST";
string postData = "This is a test that posts this string to a Web server.";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine(responseFromServer);
reader.Close();
dataStream.Close();
response.Close();
}
Variante2:
private void test2(string tel, string sms)
{
string data = "username=<value>&password=<value>@" + sms;
byte[] dataStream = Encoding.UTF8.GetBytes(data);
string urlPath = "http://10.130.143.60/";
string request = urlPath + "api.php?text=%&" + tel;
WebRequest webRequest = WebRequest.Create(request);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = dataStream.Length;
Stream newStream = webRequest.GetRequestStream();
// Send the data.
newStream.Write(dataStream,0,dataStream.Length);
newStream.Close();
WebResponse webResponse = webRequest.GetResponse();
}
Variante 3:
private void test3(string tel, string sms)
{
string data = "?text=%&" + tel + "&username=<value>&password=<value>@" + sms;
MessageBox.Show(data);
byte[] dataStream = Encoding.UTF8.GetBytes(data);
string urlPath = "http://10.130.143.60/";
string request = urlPath + "api.php";
MessageBox.Show(request);
WebRequest webRequest = WebRequest.Create(request);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = dataStream.Length;
Stream newStream = webRequest.GetRequestStream();
// Send the data.
newStream.Write(dataStream, 0, dataStream.Length);
newStream.Close();
WebResponse webResponse = webRequest.GetResponse();
}
thx für die Hilfe
Kaladial
Wir sollen für unsere Serialisierungsanwendung von einem Anbieter Seriennummern importieren.
Und so sieht die Datei aus die ich da bekomme.
ich bin im moment einfach erstmal dran zu gucken was das eigentlich ist usw.
Hi,
ich hab ein Problem.
Ich öchte eine XML einlesen.
Normal ist das kein Problem, aber hier in dem Fall ist die Codierung anders als ich sie kenne.
Kann mir da jemand helfen?
Mfg Kaladial
<?xml version="1.0" encoding="UTF-8"?>
<snx:SNXResponseMessage xmlns:cmn="urn:tl:mapper:sl:commontypes" xmlns:snx="urn:tl:mapper:sl:serial_number_exchange">
<snx:ControlFileHeader>
<cmn:FileSenderNumber>10450000</cmn:FileSenderNumber>
<cmn:FileReceiverNumber>10450001</cmn:FileReceiverNumber>
<cmn:FileControlNumber>19775-ojO</cmn:FileControlNumber>
<cmn:FileDate>2017-02-06</cmn:FileDate>
<cmn:FileTime>10:30:41</cmn:FileTime>
</snx:ControlFileHeader>
<snx:MessageBody>
<cmn:RequestId>YDUFIFN3UF37Z4QD</cmn:RequestId>
<cmn:NumberEncoding>AI(01)+AI(21)</cmn:NumberEncoding>
<cmn:ObjectIdentifier>
<cmn:GTIN-14>00368992301018</cmn:GTIN-14>
</cmn:ObjectIdentifier>
<cmn:Quantity>10</cmn:Quantity>
<cmn:SerialNumberList isRandom="true">
<cmn:SerialNumber>S98EA200XB3R</cmn:SerialNumber>
<cmn:SerialNumber>9GBE0Y73AP1R</cmn:SerialNumber>
<cmn:SerialNumber>YRXT1W0ZDHMZ</cmn:SerialNumber>
<cmn:SerialNumber>40TYHRB6P0EB</cmn:SerialNumber>
<cmn:SerialNumber>11KXZATTHC8A</cmn:SerialNumber>
<cmn:SerialNumber>ZW6X6V2N6WEC</cmn:SerialNumber>
<cmn:SerialNumber>WWGYN2F4969P</cmn:SerialNumber>
<cmn:SerialNumber>ZK0M3TNTENYD</cmn:SerialNumber>
<cmn:SerialNumber>HEABA53MAT5V</cmn:SerialNumber>
<cmn:SerialNumber>V9VREZT9TXV0</cmn:SerialNumber>
</cmn:SerialNumberList>
</snx:MessageBody>
</snx:SNXResponseMessage>
Hallo,
ich habe eine frage zu backgroundworkern, ich weiß sie sind veraltet usw. brauch es trotzdem 😉
Also ich hab ein programm das in unterschiedlichen sprachen funktionieren soll.
das hab ich soweit hinbekommen. oberfläche hat 2 locations bekommen, default und en-US
ganzen dialoge sind übersetzt, alle fixen texte in die resourcen reingepackt und dort auch übersetzt.
nun starte ich das programm auf englisch:
oberfläche passt
und hier ist mein problem: alles was in der funktion:
bgwInitialize_DoWork in diesem log ausgegeben wird ist deutsch.
alles was danach kommt also ab
bgwInitialize_RunWorkerCompleted ist wieder in englisch....
wie bekomme ich das nun hin das auch in dem dowork die
ausgaben auf englisch sind.
sowas hier: this.AppendWorkFlowText(Resources.StiftDatenprüfen + ": ", 0);
ich hab mir testausgaben gemacht.
alles inenrhalb des gbworkers ist deutsch, alles was davor oder danach passiert, ist englisch
wieso?
mfg Kaladial
hab funktion im inet gefunden thx
Hallo,
ich hab ein kleines Problem mit meinem FTP Upload.
Hier erstmal der Code:
public void UploadFtpFile(string folderName, string fileName)
{
FtpWebRequest request;
try
{
string user = MainWindow.conf.ftpUsername;
string pass = MainWindow.conf.ftpPasswort;
string absoluteFileName = Path.GetFileName(fileName);
request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/{2}", MainWindow.conf.DruckerIpAsString, folderName, absoluteFileName))) as FtpWebRequest;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UseBinary = true;
request.UsePassive = true;
request.KeepAlive = true;
request.Credentials = new NetworkCredential(user, pass);
request.ConnectionGroupName = "group";
using (FileStream fs = File.OpenRead(fileName))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
Stream requestStream = request.GetRequestStream();
requestStream.Write(buffer, 0, buffer.Length);
requestStream.Flush();
requestStream.Close();
}
}
catch (Exception ex)
{
MessageBox.Show("FTP-Error: " + ex.Message);
}
}
Mit dieser Funktion uploade ich eine Datei auf meinen FTP Server.
Jetzt hab ich festgestellt, das wenn die Datei schon existiert (also überschrieben werden soll)
das er nur die existierende Datei aufmacht und den neuen Inhalt in die Datei schreibt.
Dies kann aber zu fehler führen, wenn die vorhergehende Datei mehr inhalt hatte als die neue.
Dann hab ich den neuen Inhalt und danach fragmente vom alten inhalt in der datei.
meine Frage dazu:
Kann man vor dem übertragen der Datei einfach überprüfen ob schon eine Datei mit dem namen vorhanden ist und wenn ja diese löschen?
Oder ist es möglich vor dem schreiben in die Datei diese komplett zu leeren?
Und wie ginge das?
Mfg Kaladial
hm hab ich mir angeguckt aber nicht gefunden
Hallo
es gibt in der MSDN ja folgendes Beispiel um eine Datei auszudrücken:
private void PrintHelpPage()
{
// Create a WebBrowser instance.
WebBrowser webBrowserForPrinting = new WebBrowser();
// Add an event handler that prints the document after it loads.
webBrowserForPrinting.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(PrintDocument);
// Set the Url property to load the document.
webBrowserForPrinting.Url = new Uri(@"\\myshare\help.html");
}
private void PrintDocument(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
// Print the document now that it is fully loaded.
((WebBrowser)sender).Print();
// Dispose the WebBrowser now that the task is complete.
((WebBrowser)sender).Dispose();
}
Dies habe ich getestet und es funktioniert auch.
Aber ich möchte nicht immer auf den Drucker der als "Standart-Drucker" gewählt wurde drucken,
sondern ich möchte vorher gern einen PrintDialog aufnamchen den Drucker festlegen und dann dort drucken.
Dialog kein Problem, aber wie das ich dem WebBrowser das er nun auf dem gewählten Drucker drucken soll?
Mfg Kaladial
if (this.PoRotateAngle == 0)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_0grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1,1);
g.DrawImage(imageTmp, p);
}
if (this.PoRotateAngle == 90)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_90grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1, 1);
g.DrawImage(imageTmp, p);
}
if (this.PoRotateAngle == 180)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_180grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1, 1);
g.DrawImage(imageTmp, p);
}
if (this.PoRotateAngle == 270)
{
this.Size = new System.Drawing.Size(width, height);
Image imageTmp = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_270grad, width, height);
Graphics g = e.Graphics;
Point p = new Point(1, 1);
g.DrawImage(imageTmp, p);
}
so damit gehts.
und damit ist mein Problem auch gelöst.
Sowohl Alt Taste als auch Tooltip
thx
ok ich habs so erstmal eingebaut und es geht.
aber ich hab noch ein kleines problem mit meinen Datamatrix - Objekt.
Hier wird in meinem Code in der On Paint folgendes gemacht:
if (this.PoRotateAngle == 0)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_0grad, width, height);
base.OnPaint(e);
}
if (this.PoRotateAngle == 90)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_90grad, width, height);
//base.OnPaint(e);
}
if (this.PoRotateAngle == 180)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_180grad, width, height);
base.OnPaint(e);
}
if (this.PoRotateAngle == 270)
{
this.Size = new System.Drawing.Size(width, height);
this.Image = ResizeImage(global::LabelEditor.Properties.Resources.Dmax_270grad, width, height);
//base.OnPaint(e);
}
Das Problem dabei: wenn ich da das OnPaint weg lasse, wird das Image nicht mehr angezeigt.
@pille: ja ist es 😃 davon bin ich auch ausgegangen, nur funktioniert das halt bei den DMAX objekten noch nicht
heißt also da muss es drin bleiben?
siehste die info mit dem base.OnPaint hat aber gefehlt 😃
kannst du mir erklären warum ich bei 0 grad das base.OnPaint drin lassen muss?
Wenn ich das raus nehme wird kein Text mehr angezeigt.
@pille: an deiner antwort sieht man das du das projekt nicht einmal ausgeführt hast oder?
ist nicht böse gemeint aber: ich schreib doch nicht quellcode in mein programm weil ich da grad lust zu hab ...
lass doch einfach mal das this.Text = ""; weg (auskommentieren) und führ die software aus.
wenn du mir dann noch erklärst wie ich den dann auftretenden text-kauderwelsch weg bekomme,
dann wäre mir geholfen.
und auch die geschichte mit den parametern alles schön und gut funktioniert aber zum einen und wenn ich es weg nehme ändert sich trotzdem nix an dem problem. und der textalign war mal dynamsch ist aber derzeit fix. hatte damit nur rumgespielt.
@pille: genau 😃
also ich hab mal vor langer langer zeit gelernt das man n bissi strukturiert arbeitet
und da gehört es halt für mich dazu z.b. SQL Code nicht mal dort n stück stehn hat und an ne ganz anderen stelle den rest... das wird unleserlich. ich will wenn ich meinen quellcode angucke halt
auch noch nachvollziehen was ich mache. und in den jahren hab ich mir da so einiges angewöhnt was andere vielleicht quatsch finden, ich damit aber gut klar komme. und das ist ja nun mal das was zählt...
und es führen nun mal viele wege nach rom. und ob die nu neu sind oder alt is dabei nicht unbedingt wichtig, solange man ankommt. code muss funktionell sein. für was anderes hat man selten zeit.
und ja bei c# kenn ich mich noch nicht so aus, ich hab aber trotzdem schon mehrer programme geschrieben die alle das machen was sie sollen.
so und nu ist gut. ich werd das mal mit dem asynch und await ausprobieren und wenns mir gefällt nehm ich das wenn nicht bleib ich bei dem was für mich funktioniert und das sind nun mal die bgws 😃
Moin
so ich hab die funktionalität mal in nen kleines Test Projekt ausgelagert.
Funktion:
Mit Button erstellen wird ein Label auf einem Panel erstellt.
Der Button Drehen dreht diese Objekte um 90 Grad.
Mit der Linken Maustaste auf die Objekte: Kann man die Objekte frei verschieben
Das Problem:
Die beiden Buttons Drehen und Erstellen haben Tooltips.
Diese funktionieren nur wenn die Objekte bei 0 Grad sind.
Sobald sie bei 90 / 180 / 270 Grad sind funktionieren die Tooltips nicht mehr.
Kann mir da jemand erklren wieso?
Mfg Kala
naja wenn ich ne select abfragen an ne db schicke bekomm ich (wenns nicht weiter eingeschränkt wird) immer mehrere ergebnisse.
natürlich geh ich die in ner whileschleife durch.
und diese, z.b. string rückgaben, add ich dann in ne liste die meine funktion zurück gibt...
daher ne stringliste. ich will ja eben so wenig wir möglich verschiedene datentypen durch mein ganzes programm schleifen, also brech ich das auf das kleinste gemeinsame runter und übergeb nicht das ganze result quer durch mein programm.
Hmmm das eine datenbank keine strings kann...
naja es sind vchars die aber im eigentlichem sinne strings sind.
ja ok verstehe...
sorry ich komm aus der c++ welt und mit c# beschäftige ich mich erst ca 1/2 jahr und da hab ich halt sachen die meine kollegen programmiert hab übernommen.
was funktioniert wird halt weiter verwendet 😉 wenns aber bessere wege gibt bin ich immer dankbar für hinweise
Heißt also, wenn ich anfang und will verschiedene datentypen usw zurück geben bau ich mir erstmal ne klasse pack da mein ganzes zeug rein und pack die dann in die rückgabewerte?
Heißt ich packe statt der List<string> meine klasse rein die z.b. nen bool und ne List<string> beinhaltet. und die pack ich dann in
Task<MyClass> SelectIrgendwasAsync(string query)
@ Tician: sorry wenn ich dir den thread etwas klaue 😃 aber wir wollen ja alle etwas lernen ggg
Und dem bin ich natürlich auch nicht abgeneigt.
@Palladin007:
Task<Irgendwas> SelectIrgendwasAsync(string query)
{
return Task.Run(() => SelectIrgendwas(query));
}
Ich hab meine Rückgabewerte bisher die nicht nur string / int / bool, oder wenn ich mehr wie nur einen rückgabe wert brachte, usw waren über outs geregelt.
z.b. halt bei select anfrage hab ich List<string> DBDataTest = new List<string>(); sowas gemacht und die als out mir zurück geben lassen (siehe beispiel).
Schreibe ich dann jetzt meine Rückgabewerte in das "Irgendwas" rein?
Task< List<string>> SelectIrgendwasAsync(string query)
{
return Task.Run(() => SelectIrgendwas(query));
}
oder mach ich weiterhin:
Task< bool> SelectIrgendwasAsync(string query,out List<string> DBDataTest )
{
return Task.Run(() => SelectIrgendwas(query, out DBDataTest ));
}
oder wofür steht das Irgendwas?
hey du hast mit dem kutschenvergleich angefangen...
bisher haste ja noch nicht wirklich erklärt was an bgws so schlecht ist , was async/await besser machen...
erklärs doch mal an nem kleinen beispiel, wo man auch unterschiede sieht und sich nicht nur auf dein wort verlassen muss das das eine schlechter und das andere besser ist.
naja wenn wir jetzt noch kutschen hätten gäbs weniger luftverschmutzung 😛
nicht alles neue ist auch besser 😉
was is an bgws mottenkiste? sorry aber funktionieren gut was solls ...
und die db sachen sind bei mir auch ausgelagert, aber um das so veranschaulichen sollte der code ja irgendwas an inhalt haben...
Moin
ich hab mir nur erstmal dein grundproblem durchgelesen.
Wieso machst du das so kompliziert?
Arbeite doch mit backgroundworkern und wenn du in deinem mainwindow etwas ändern willst dann invoke das ganze.
also so nach dem motto:
private DB db;
private void MainWindow_Load(object sender, EventArgs e)
{
this.db = new DB();
this.db.Connect(ip, port, servicename, username, password);
bgwDBAbfrage.RunWorkerAsync();
}
private void MainWindow_FormClosing(object sender, EventArgs e)
{
this.db.Disconnect();
}
private void bgwDBAbfrage_DoWork(object sender, DoWorkEventArgs e)
{
string query = "select * from tabelle where irgendwas='JA'";
this.db.SelectIrgendwas(query, out DBContentTest););
for (int i = 0; i < DBContentTest.Count; i++)
{
string tmp= DBContentTest[i];
setIrgendwas(tmp);
}
}
private void setIrgendwas(string tmp)
{
if (this.InvokeRequired)
{
// ruft sich selbst auf
Action<string> action = new Action<string>(this.setIrgendwas);
this.Invoke(action, string);
return;
}
this.button1.Text = tmp;
}
so ungefähr.
mfg Kala
hmmm ich hab das zum test einfach auskommentiert.
hat aber nicht wirklich was gebracht....
auch die geschichte das es bei 0 grad ja funktioniert spricht da dagegen das die parameter setzen schuld sind.
also ich denk eher das hier irgendwas falsch läuft
if (this.PoRotateAngle == 90)
{
this.TextAlign = ContentAlignment.MiddleLeft;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(this.PoRotateAngle);
g.TranslateTransform(0, -this.pheight);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pheight, this.pwidth);
base.OnPaint(e);
}
das geht leider nicht ,
aber ich hab noch etwas anderes gefunden, vielleicht ist das auch für dieses problem verantwortlich:
also es ist im endeffekt ein labeldesigner für einen industriedrucker.
heißt ich habe eine grundfläche auf dem ich text code128 und datamatrix objekte an bestimmten positionen positionieren will um das dann auf dem drucker abzuspeichern.
um diese elemente darzustellen habe ich Labels benutzt und die natürlich auch in 90Grad Schritten drehbar gemacht. wenn ich also objekte im 0 Grad darstelle kommt die meldung beim Save Dialog.
wenn ich sie im 90Grad gedrehten darstelle muss ich die alt taste drücken.
darauf bin ich gekommen weil ich tool tips einbauen wollte und auch da: solange ich bei 0 grad bleibe ist alles schön, sobald ich auf 90 grad geh verschwinden die tooltips.
ich würde mal die label-klasse posten.
ich denk die ist dran schuld.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NovexxLabelEditor.PinterObjects
{
public class PrintObjectCode128 : System.Windows.Forms.Label
{
int puid = 0;
string ptype = "Code 128";
string pfont = "";
int protateangle = 0;
string pnewText = "";
int pwidth = 0;
int pheight = 0;
int pgroesse = 48;
bool prahmen = true;
public FormPropsCode128 formProperties;
#region properties region
public int PoUid
{
get
{
return this.puid;
}
set
{
this.puid = value;
}
}
public int PoRotateAngle
{
get
{
return this.protateangle;
}
set
{
this.protateangle = value;
}
}
internal string PoName
{
get
{
return this.Name;
}
set
{
this.Name = value;
}
}
internal string PoType
{
get
{
return this.ptype;
}
set
{
this.ptype = value;
}
}
internal string PoNewText
{
get
{
return this.pnewText;
}
set
{
this.pnewText = value;
}
}
internal string PoText
{
get
{
return this.Text;
}
set
{
this.Text = value;
}
}
internal string PoFont
{
get
{
return this.pfont;
}
set
{
this.pfont = value;
}
}
internal Point PoPos
{
get
{
return this.Location;
}
set
{
this.Location = value;
}
}
internal Size PoSize
{
get
{
return this.Size;
}
set
{
this.Size = value;
}
}
public bool PoRahmen
{
get
{
return this.prahmen;
}
set
{
this.prahmen = value;
}
}
public int PoWidth
{
get
{
return this.pwidth;
}
set
{
this.pwidth = value;
}
}
public int PoHeight
{
get
{
return this.pheight;
}
set
{
this.pheight = value;
}
}
public int PoGroesse
{
get
{
return this.pgroesse;
}
set
{
this.pgroesse = value;
}
}
#endregion
public PrintObjectCode128()
{
formProperties = new FormPropsCode128(this);
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
string NewText = this.Text;
double groesse = (double)this.pgroesse;
groesse = groesse + 0.25;
this.Font = new System.Drawing.Font("Code 128", (float)groesse, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
if (this.prahmen)
{
this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
}
else
{
this.BorderStyle = System.Windows.Forms.BorderStyle.None;
}
if (this.PoRotateAngle == 0)
{
this.TextAlign = ContentAlignment.MiddleLeft;
this.Size = new System.Drawing.Size(this.pwidth, this.pheight);
base.OnPaint(e);
}
if (this.PoRotateAngle == 90)
{
this.TextAlign = ContentAlignment.MiddleLeft;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(this.PoRotateAngle);
g.TranslateTransform(0, -this.pheight);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pheight, this.pwidth);
base.OnPaint(e);
}
if (this.PoRotateAngle == 180)
{
this.TextAlign = ContentAlignment.MiddleCenter;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(this.PoRotateAngle);
g.TranslateTransform(-this.pwidth, -this.pheight);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pwidth, this.pheight);
base.OnPaint(e);
}
if (this.PoRotateAngle == 270)
{
this.TextAlign = ContentAlignment.MiddleCenter;
this.Text = "";
Graphics g = e.Graphics;
StringFormat stringFormat = new StringFormat();
stringFormat.Trimming = StringTrimming.None;
Brush textBrush = new SolidBrush(this.ForeColor);
Matrix storedState = g.Transform;
g.RotateTransform(-90);
g.TranslateTransform(-this.pwidth, 0);
Rectangle r = new Rectangle(0, 0, this.pwidth, this.pheight);
g.DrawString(NewText, this.Font, textBrush, r, stringFormat);
g.Transform = storedState;
this.Size = new System.Drawing.Size(this.pheight, this.pwidth);
base.OnPaint(e);
}
this.Text = NewText;
}
}
}
Coffeebean: ja sind die selben
123thomas: nein
achso...
ja ok ich war jetzt echt verwirrt was du von mir wolltest...
also ich hab in dem letzten halben jahr 5 verschiedene programme geschrieben.
das hier ist die erste in der dieser fehler auftritt.
aber ich habs eben ausprobiert.
im Testprogramm tritt das nicht auf.
ich versteh nur nicht so ganz was da dazwischen funken soll.
hab keine BackgroundWorker oder dergleichen laufen...
Das einzigste was ich hab sind Mouse Events bei bestimmten Controls.
Aber da hab ich mir ausgaben gebaut.
dort kommt er nicht lang.
ähm, naja wie soll ich sagen 😃
ich weiß nicht wie das geht.
also ich hab vs2013. ka wo ich da in ner neuen solution nachschauen soll.
bzw ich bin noch gar nicht auf die idee gekommen das es da etwas anderes gibt.
hmmm jetzt kommt gar keine Frage mehr....
hmmm in dem Fall auch ok. Danke.
durchaus möglich...
aber wieso ist die im hintergrund?
und wie ändere ich das?
also was ich jetzt sagen kann (hab grad kopfhörer aufgesetzt und es gehört)
es pingt wenn ich auf speichern klicke und ich kann den "SaveDialog" nicht bewegen oder so
Dann irgendwann nach beliebiger Zeit drücke ich die Taste "ALT" und dann kommt:
siehe anhang.
Wieso muss ich ALT drücken?
Also ich versuche in diesem Dialog eine Datei zu überschreiben.
Wenn ich auf Speichern klicke passiert nichts
Anhang der Dialog