Hallo
ich hoffe es kann mir jemand helfen
ich würde gerne einen Datensatz zu meiner Liste hinzufügen schaff es aber nicht.
ich öffne eine XMLDatei und befülle mein Formular mit einer treeView,
wenn ich dann auf die Grupppe klicke wird meine listView befüllt.
Wenn ich dann einen Eintrag in einen anderem Formular öffne, ändere und wieder schließe wird alles richtig aktualisiert.
wenn ich aber einen neuen Eintrag hinzufügen will funktioniert es bis zum anzeigen in der listView.
Leider wenn ich dann in der treeView die Grupppe wechsle und wieder auf die vorherige Gruppe zurück gehe ist der neue Eintrag weg.
Wie schaffe ich es das der neue Eintrag gespeichert wird.
namespace BaumarktVerwaltung
{
public partial class FormMain : Form
{
private Datei datei = null;
public FormMain()
{
InitializeComponent();
}
private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "XML Dateien|*.xml|Alle Dateien|*.*";
if (dialog.ShowDialog() == DialogResult.OK)
{
this.datei = Datei.Open(dialog.FileName);
this.datei.Save();
this.statusLabelCurrentFile.Text = dialog.FileName;
}
}
private void FormMain_Load(object sender, EventArgs e)
{
this.ShowItem();
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
listView1.Items.Clear();
if (e.Node.Level == 2)
{
List<Produkt> produkts = datei.AbteilungListe.Find(x => x.Warengruppe.Contains(e.Node.Parent.Text)).GruppenListe.Find(x => x.Kategorie.Contains(e.Node.Text)).ProduktListe;
foreach (Produkt produkt in produkts) this.ShowItem1(produkt);
}
}
private void ShowItem1(Produkt produkt)
{
ListViewItem item = new ListViewItem();
item.Tag = produkt;
item.Text = produkt.ProduktId;
item.SubItems.Add(produkt.ProduktBezeichnung);
item.SubItems.Add(produkt.Marke);
item.SubItems.Add(produkt.Groesse);
item.SubItems.Add(produkt.Anzahl);
item.SubItems.Add(produkt.Wert);
this.listView1.Items.Add(item);
if(produkt.Anzahl == "10") item.BackColor = Color.Red;
}
private void ShowItem()
{
string ProjectPath = Assembly.GetExecutingAssembly().Location;
string WorkPath = Path.GetDirectoryName(ProjectPath);
datei = Datei.Open(Path.Combine(WorkPath, "Waren.xml"));
TreeNode Root = new TreeNode("Abteilungen");
treeView1.Nodes.Clear();
foreach (Abteilung item in datei.AbteilungListe)
{
List<TreeNode> nodes = new List<TreeNode>();
foreach (Gruppe gruppe in item.GruppenListe)
{
nodes.Add(new TreeNode(gruppe.Kategorie));
}
TreeNode node = new TreeNode(item.Warengruppe, nodes.ToArray());
Root.Nodes.Add(node);
}
treeView1.Nodes.Add(Root);
treeView1.EndUpdate();
}
private void editAbteilungToolStripMenuItem_Click(object sender, EventArgs e)
{
FormAbteilungen abteilungForm = new FormAbteilungen();
if (abteilungForm.ShowDialog() == DialogResult.OK)
{
this.ShowItem();
}
}
private void MenuItemWarengruppen_Click(object sender, EventArgs e)
{
FormGruppen gruppenForm = new FormGruppen();
if (gruppenForm.ShowDialog() == DialogResult.OK)
{
this.ShowItem();
}
}
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListViewItem item = this.listView1.GetItemAt(e.X, e.Y);
Produkt produkt = (Produkt)item.Tag;
FormProdukt produktForm = new FormProdukt(produkt);
if (produktForm.ShowDialog() == DialogResult.OK)
{
item.SubItems[0].Text = produkt.ProduktId;
item.SubItems[1].Text = produkt.ProduktBezeichnung;
item.SubItems[2].Text = produkt.Marke;
item.SubItems[3].Text = produkt.Groesse;
item.SubItems[4].Text = produkt.Anzahl;
item.SubItems[5].Text = produkt.Wert;
}
}
private void MenuItemNew_Click(object sender, EventArgs e)
{
if (treeView1.SelectedNode.Level == 2)
{
FormProdukt produktForm = new FormProdukt();
if (produktForm.ShowDialog() == DialogResult.OK)
{
//if (treeView1.SelectedNode != null)
//{
//gruppe = (Gruppe)this.treeView1.SelectedNode.Tag;
//gruppe.ProduktListe.Clear();
//List<Produkt> produktse = datei.AbteilungListe.Find(x => x.Warengruppe.Contains(Abteilungsname)).GruppenListe.Find(x => x.Kategorie.Contains(Gruppenname)).ProduktListe;
//foreach (ListViewItem item in this.listView1.Items)
// foreach (Produkt produkt in produktse)
// produktse.Add((Produkt)item.Tag);
//}
this.ShowItem1(produktForm.Produkt);
}
}
}
}
}
private void MenuItemNew_Click(object sender, EventArgs e) hier liegt der Fehler
Kann mir jemand helfen
@hustbaer sagte in Stackoverflow bei instanzierung eine großen Objekts.:
Ja. Oder sagen wir so: wenn es am JIT liegt, dann müsste das so sein. Bzw. auch umgekehrt: wenn es so ist, dann liegt es ziemlich sicher am JIT.
Alles klar Kommender ich kam bisher nicht dazu , heute probiere ich es
EDIT: @hustbaer Ja die zweite Instanziierung scheint schneller zu gehen;)
@whatever sagte in C# + ESP8266 (WemosD1Mini) Serielle Verbindung nicht möglich:
void loop() {
Serial.print('1');
delay(200);
}
...
while (true)
{
Console.WriteLine(port.ReadLine());
}
Wenn du mit ReadLine liest, dann wäre es schlau auch Zeilenumbrüche zu schicken.
Bzw. wenn du byteweise lesen willst, dann solltest du ReadByte verwenden.
while (true)
{
int b = port.ReadByte();
if (b >= 0)
Console.Write((char)b);
}
Hallo Leute,
ich habe noch ne ne Denker Frage: Ich möchte Met-Daten in Form einer Auflistung von "primitive" Daten in einem Attribute-Darstellen. Da die erlaubten Argument Typen in Attributen eingeschränkt sind, habe ich mir sowas in der Art vorgestellt, ist sehr kryptisch, aber einfach geht es wohl nicht!? Die Attribute werden "Maschinell" generiert, muss so für das menschliche Auge nich so schön sein:)
Bwp:
[MetaProperty(
new object[] { "A", typeof(System.Int32), "0" } ,
new object[] { "B", typeof(System.String), "a" },
new object[] { "C", typeof(System.Guid), "d0c3317b-52eb-4b9d-9f91-aafac1bbcd13" },
new object[] { "D", typeof(System.DateTime), "2021-21-8 07:44:44" })]
class X{}
Das Attribute Signatur sähe dann so aus:
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class MetaProperty : Attribute
{
// See the attribute guidelines at
// http://go.microsoft.com/fwlink/?LinkId=85236
public MetaProperty(params object[] ss)
{
}
}
Hab ihr vll. noch nei de, wie e schönes sein könnte? Am ende soll ne Dictionary mit den werten rausploppen;=)
Danke euch
@Tossi65 sagte in C# soll MFC Programm mit Event benachrichtigen:
Deshalb dachte ich an ein Event, welches die Werkerführung empfängt. ZUm Beispiel "OnExternalProgramFinished". Diese gibt es und wird von Programmen erzeugt, die durch die Werkerführung auch gestartet wurden.
OK. Scheint aber was proprietäres zu sein. Der Knackpunkt hierbei ist auch: das funktioniert, weil die Programme von deinem C++ Programm aus gestartet wurden. Das ist einfach. Wenn das Programm anders gestartet wurde, und vor allem wenn es weiter läuft nachdem ein Task fertiggestellt wurde, dann wird es ungleich schwerer.
Aber die Schnittstelle läuft komplett im Hintergrund, da sie mehrere verschieden Aufgaben hat.
OK. Eine offensichtliche Möglichkeit wäre jetzt die MFC Anwendung auch die DB pollen zu lassen. Ansonsten könntest du noch einen "out of process" DCOM Server in deinem Hintergrundprozess implementieren. Der kann dann irgend ein Kommunikationsobjekt "anbieten". Das MFC Programm könnte dann eine Instanz dieses Kommunikationsobjekts erstellen. Weiters müsste das MFC Programm noch ein Benachrichtigungs-Interface implementieren. Das Benachrichtigungs-Interface kann dann an das Kommunikationsobjekt übergeben werden. Da das Kommunikationsobjekt im Hintergrundprozess implementiert ist, erhält der Hintergrundprozess so Zugriff auf ein Interface in der MFC Applikation. Und kann dann über dieses Interface eben Funktionen in der MFC Applikation aufrufen.
Ich weiss jetzt halt nicht wie gut du dich mit DCOM und C#/DCOM Interop auskennst. Wenn nicht gut, dann ist das vermutlich alles ein bisschen viel. Wenn schon eher gut, dann könnte das ein guter Weg sein.
Hallo zusammen,
ich habe eine Anwendung (erstellt unter VS 2019), in der ein Barcodescanner der Fa. Zebra (DS 2278) eingebunden ist.
Für die Kommandos zum Scanner nutze ich die SDK der Fa Zebra.
Der Scanner ist entsprechend konfiguriert und das Scannen von Barcodes und QR-Codes funktioniert wie gewünscht.
Nun soll der Scanner auch in einer anderen Anwendung (keine eigene Entwicklung) eingesetzt werden. Dazu muss der
Scanner quasi als Tastatur arbeiten.
In meiner Anwendung ist es erforderlich, dass vor den gescannten Daten der Codetyp (Barcode / QR-Code) gesetzt wird.
Dies funktioniert über den Parameter "AIM". In der externen Anwendung darf der Codetyp jedoch nicht enthalten sein.
Ich habe in meiner Form zwei Events registriert, über die ich die Umschaltung durchführe. Die Events sind Form_Activated"
und "Form_Deactivate". Von hier setze und lösche ich z.B. die Funktion "AIM" des Scanners. Bis hierher funktioniert alles.
Die andere Anwendung erfordert jetzt zusätzlich, dass nach den gescannten Daten noch ein Tabstop angehängt wird.
Dieser Tabstop darf aber in meiner Anwendung nicht angehängt werden. Ich möchte nun den Scanner mit einem
zusätzlichen Kommando so konfigurieren, dass in meiner Anwendung kein Tabstop angehängt wird, außerhalb meiner
Anwendung soll dann der Tabstop angehängt werden. Diese Funktion kann ich in meinen beiden Events aufrufen.
Ich habe versucht, dass mit verschiedenen Konfigurationswerten zu realisieren, jedoch bisher ohne Erfolg. Die Doku
zur SDK ist hier leider keine wirkliche Hilfe. Hat jemand sowas schon umgesetzt und kann mir mit einem Codeschnipsel
weiterhelfen?
@Arti sagte in einfach verkettete liste, listen ende ermitteln:
ListElement listStart = new ListElement();
ListElement listEnd = null;
Warum ist das keine Datenstruktur List?
@hustbaer sagte in WPF DateTemplate eventhander memoryleak:
(Form-Unload oder Close oder sowas)
ja das meine ich auch mal gelesen zu haben, zum sollte man observableCollection statt IEnumerale /NotifyPropertyChange
verwenden um leak zu vermeiden.. aber is schon länger her als ich darüber gelesen hab
Ne mögliche alternative wäre, wenn die "generatoren" kein generisches Tree<T>/List<T> erzeugen würden sondern eine instanz einer Klasse die dann von Tree<T>/List<T> abgeleitet ist.
Dann wären die namen sprechender.
z.b.
class ConfigurationAsTree : Tree<string>
{}
@hustbaer: Schau dir mein zweites Beispiel an. Dies benutze ich selber in meinen eigenen Projekten sehr oft, damit ich für Zugriff auf die Sub-Namespaces nicht immer wieder den eigenen Main-Namespace angeben muß.
Afaik verwenden aber die Code-Generatoren immer die erste Schreibweise mit voll ausgeschriebenen Namespace.
Eigene Delegate-Typen braucht man i.d.R. nicht mehr definieren, sondern kann die Generics Action<...>, Func<R, ...> bzw. EventHandler<EventArgs> benutzen.
Nope: long ist ein System.Int64
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types
C# type/keyword Range Size .NET type
long -9,223,372,036,854,775,808 Signed 64-bit integer System.Int64
to 9,223,372,036,854,775,807
@Smitty sagte in Zugriff auf Textdatei in der Projektliste:
Ganz einfach:
die Textdatei in die Projektmappe aufnehmen, auf die Ebene der .cs Dateien
dann sowas hier:
...
DANN ist die Textdatei ja auch da, nämlich in Deiner Anwendung! Allerdings statisch ...
... dann gibst Du Deine Anwendung weiter und aktualisierst zu Hause auf Deinem System die Textdatei.
Und nun soll die weitergegebene Anwendung erkennen, dass bei Dir zu Hause die Textdatei aktualisiert wurde ...
Und deshalb:
Leider erkennt der Compiler nicht wenn das txtFile aktualisiert wurde, hier hilft dann einmal neu erstellen.
Thats all
@micha7 War in der Nacht schon zu müde. Wenn ich Dir
@Swordfish sagte in Externe Anwendung starten und Fenster minimieren:
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.createnowindow?view=netcore-3.1
?
hinwerfe und Du darauf sagst daß Du das schon versucht hast dann gehe ich schon davon aus, daß Du den Beispielcode liest und genauso umsetzt wie im Beispiel angegeben. Von Deiner Aussage
@micha7 sagte in Externe Anwendung starten und Fenster minimieren:
startInfo.CreateNoWindow = true;
Das hatte ich schon ausprobiert, aber es zeigt keine Wirkung. Es werden trotzdem beide Fenster erzeugt.
kann man im Leben nicht darauf kommen, daß StartInfo.UseShellExecute nicht false gesetzt wurde. Auch empfand ich ehrlich gesagt
@micha7 sagte in Externe Anwendung starten und Fenster minimieren:
@Swordfish Wenn ich alles hinschreiben würde was ich schon ausprobiert habe und was nicht funktioniert hat, dann wäre der Text so lang dass du's nicht lesen würdest.
ziemlich daneben, denn entweder interessiert einen Leser etwas und er liest es oder er lässt es bleiben. Aber es gehört zum guten Ton bei einer Bitte um Hilfe zu erwähnen was schon versucht worden ist. Je vollständiger und präziser desto gut - das spart zeit- und nervenraubende Nachfragen. Bei der Kommunikation über solche Themen ist Präzision unbedingt notwendig.
Schreibe bitte in eine Zeile vor deinem Code ```csharp und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code, wähle in dem Drop-down in der Toolbar über dem Textfenster "C#" aus und klicke auf den </>-Button rechts daneben.
Du kannst Deine Beiträge auch nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du hinter dem Drei-Punkte-Menü rechts unter Deinem Beitrag.
Topic: Wenn das Ding immer global erreichbar und immer dasselbe ist ... wofür dann überhaupt ein Parameter dafür??