du musst als XmlElement natürlich dasjenige element übergeben, das vater von allen <menu> tags ist. meine methode arbeitet jetzt der einfachheit halber nur mit <menu> tags. du kannst sie natürlich auch mit dem root <tree> element aufrufen, musst dann halt eben nur prüfen, ob es ein solches ist und wenn ja, die abfrage der id auslassen.
ungefähr so:
void IterrateTree(XmlElement menuElement)
{
XmlNodeList lst = menuElement.SelectNodes("menu");
if (lst.Count == 0) //Rekursionsanker
{
return;
}
if (menuElement.Name.Equals("menu"))
{
//id holen
string id = menuElement.Attributes["id"].Value;
//hole inhalt des name tags
string name = menuElement.SelectSingleNode("name").InnerText;
}
//für alle <menu> child elemente...
foreach (XmlElement element in lst)
{
IterrateTree(element);
}
}
diese modifikation ruft die daten nur ab, wenn es sich auch wirklich um ein <menu> tag handelt.
alternative:
du könntest auch einfach alle <menu> tags unter <tree> holen und dann für alle diese IterrateTree() aufrufen.
Das allerdings, musst du selbst wissen =)
Gruß
Intuitiv würde ich sowas vorschlagen (nicht getestet)
void IterrateTree(XmlElement menuElement)
{
XmlNodeList lst = menuElement.SelectNodes("menu");
if (lst.Count == 0) //Rekursionsanker
{
return;
}
//id holen
string id = menuElement.Attributes["id"].Value;
//hole inhalt des name tags
string name = menuElement.SelectSingleNode("name").InnerText;
//für alle <menu> child elemente...
foreach (XmlElement element in lst)
{
IterrateTree(element);
}
}
das kann nicht gehen weil du immer ein \r\n hinzufügst:
contentBuilder.Append("\r\n");
außerdem solltest du, wenn du schon mit zahlen als rückgabe arbeitest, auch integer typen und nicht strings verwenden.
das ToString() in der Zeile
return content.ToString();
ist überflüssig, da content vom typ string ist.
Es gibt die Visual Studio Erweiterung "Orcas", die seit dem 1.9. als RC1 zum Download bereitsteht. Der WPF Designer "Cider" ist allerdings noch im Beta Zustand, Dinge wie Custom Controls funktionieren damit noch nicht. Cider ist aber schon in der Lage, das erstellte XAML Dokument als BAML (binäres XAML) in die Applikation einzubetten und mit dem entsprechenden C# Code zu verbinden, von daher lohnt es sich schon das Teil mal auszuprobieren.
Reguläre Ausdrücke taugen ja beim Compilerbau vor allem zur lexikalischen Analyse. Also dem Erstellen von Tokens aus der Zeichenfolge (Code). Wenn du einen richtigen LL(k) Parser schreiben willst, kommst du damit jedenfalls nicht weiter. Ein ganz schöner Parser Generator, der auch C# Code generiert ist m.E. CoCo/R: http://www.ssw.uni-linz.ac.at/Coco/
Ok, scheinbar gibt es für die mit Create() erzeugten Objekte einige Verbesserungen. Für snoopy90's Zwecke sollten aber beide Möglichkeiten in jedem fall ausreichend sein.
Hallo knub,
das stimmt leider nicht, XmlWriter ist eine abstrakte Klasse. XmlTextWriter ist von dieser abgeleitet.
Original von snoopy90
Ich kapier das ganze XML Zeugs nicht ganz.
Dann solltest du dich einlesen.
Rausschreiben mittels System.Xml.XmlTextWriter.
Einlesen mit System.Xml.XmlTextReader oder System.Xml.XmlDocument.
dem schließe ich mich an.
die wahl der programmiersprache hat logischerweise keinen einfluß auf die rechenleisung der CPU. bei genauer messung (inkl. ladevorgang) müsste das c# programm eigentlich noch langsamer sein, da zuerst der CLI Code vom Jitter in Maschinencode umgewandelt werden muss, was bei VB 6 nicht der Fall ist (da nativer Code).
um ein eigenes steuerelement der toolbox hinzufügen zu können, MUSST du eine dll dafür erzeugen.
Ansonsten kannst du das control nur verwenden, indem du es händisch deinem code hinzufügst.
Array -> File
oder
File -> Array ??
Letzteres geht beispielsweise so:
string[] lines = File.ReadAllLines("DeineDatei.txt");
Das wurde aber glaube ich auch schon 2000 mal in diesem Forum besprochen!!
Meines Wissens gibt es dafür keinen "Befehl". Gäbe es einen, würde dieser aber auch kaum anders arbeiten als mit einer Schleife.
was allerdings nichts mit vs 2005 zu tun hat.
Form.AcceptButton / Form.CancelButton
warum ermittelst du x nicht einfach im LostFocus Handler anstatt es im GotFocus in eine member variable zu schreiben?
Hi,
ich habe gerade mal dein Programm ausprobiert. Folgende Dinge sind mir spontan aufgefallen:
************** Ausnahmetext **************
System.ArgumentOutOfRangeException: Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: index
bei System.Collections.ArrayList.get_Item(Int32 index)
bei MKayReminder.MainForm.DayTermineListView_SelectedIndexChanged(Object sender, EventArgs e)
bei System.Windows.Forms.ListView.OnSelectedIndexChanged(EventArgs e)
bei System.Windows.Forms.ListView.WmReflectNotify(Message& m)
bei System.Windows.Forms.ListView.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Zu bedenken ist aber auch, dass viele Firmen jeweils zur übernächsten Version von Windows wechseln. Der nächste Wechsel wäre dann demnach von Win2000 auf Vista.
Vista ist in vielen Bereichen reizvoll, M.E. ist vor allem das weiterentwickelte Sicherheitskonzept ein ausschlaggebender Punkt.
Was uns WPF, WF und WCF dann tatsächlich an Vorteilen bringen ist natürlich noch mal einzeln zu diskutieren.
dafür gibt es etliche beispiele im netz in form von open source projekten.
siehe z.b. hier: http://www.codeproject.com/cs/samples/pdf2text.asp
vermutlich hast du tags bzw. das dokument nicht abgeschlossen. etwas code wäre hilfreich um dir helfen zu können.
zur lösung deines problems würde ich dir die verwendung eines memory profilers empfehlen, siehe z.b. http://memprofiler.com/
Hallo,
Original von Sara
Bisher hab ich nur die Lösung, das es mir zwar die Listen auflistet, aber unter dem Dateinamen (Bsp. Filme.xml, Musik.xml), das ist aber ein wenig unpassend für mich.
was wäre denn dann passend für dich? Ich verstehe Dein Problem grad nicht, wenn du doch sagst dass die Titel aufgelistet werden.
nimm die datei, verwende reguläre ausrücke wie <.*> um alle tags zu löschen. danach erhälst du nur noch den text des dokuments.
ich denke das problem an goto ist, dass du es überall verwenden kannst. daher schleicht sich bei vielen der berühmte spagetthi code ein. break und continue hingegen sind spezielle sprunganweisungen in schleifen. deren einsatz halte ich, solange sie überlegt eingesetzt werden, für enorm sinnvoll.
Indem du rekursiv durch die Unterverzeichnisse gehst und die Attribute per File.SetAttributes() entfernst.
Was Value beinhaltet, hängt vom Type der Node ab. Bei Nodes vom Type XmlElement ist Value immer null. Dein Ansatz, den Text per .InnerText zu lesen, ist der Richtige.
Siehe auch hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemXmlXmlNodeClassValueTopic.asp
Wenn ich mich nicht irre, ist der Namespace in Type.Fullname enthalten?
Fullname := <Namespace>.<Klasse>
Gruß
wenn diese dll ein .net assembly ist: ja. kannst sie an einen host-prozess anbinden und dann debuggen, falls debug-informationen enthalten sind. gruß
nein mach das nicht, weil ich schwachsinn geschrieben habe =)
da wir es ja hier mit einem neuen prozess zu tun haben, kann es ja logischerweise nicht funktionieren. um zwei instanzen zu verhindern, wäre das stichwort nachdem du suchen musst Mutex.
@WhiteLion,
damit wird aber die Form bei jedem start neu erstellt.
Warum hälst du dir nach dem ersten Start nicht einfach eine Referenz auf die Form:
..
static Form1 mainForm = null;
..
if (i != System.IntPtr.Zero)
{
// !!!! Hier brauche ich die Form1 Instanz um z.B. den Text
// !!!! von Form1.Text zu ändern...
mainForm.Text="foo";
ShowWindowAsync(i, 9); // Zeige Fenster
SetForegroundWindow(i); // Vordergrund
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
mainForm = new Form1();
Application.Run(mainForm);
}
ich denke, dann hast du etwas falsch gemacht. wie heissen deine resx dateien, wie hast du das resourcemanager objekt erstellt? ohne nähere angaben wird dir niemand helfen können.
ja, mir fällt grad ein, dass die x,y koordinate (links oben) bei ClientRectangle immer 0,0 ist. von daher überlappen sie sich logischerweise immer.
aber das prinzip ist ja klar. mach dir am besten 2 rectangle's mit den richtigen abmessungen der kontrollen und gehe dann per intersectswith rein.
Original von BAUHAUS
Allerdings muss man um an das "Parent" Attribute des momentanen Treenodes ranzukommen, den Treenode in der Treeview "selecten".
Warum denn das? TreeNode.Parent ??
Blöderweise kann ich nicht einfach
Treeview.SelectedNode = treenode;
machen.
Laut MSDN Doku sollte das wunderbar funktionieren.
Aber da es ja PictureBox Kontrollen sind, kannst du ja deren ClientRectangle nehmen.
Ungefähr so:
if (pictureBox1.ClientRectangle.IntersectsWith(pictureBox2.ClientRectangle))
{
//..boxen kollidieren
}
Aber wenn du ein Spiel schreiben willst, würde ich dir dringend raten Windows Forms komplett zu vergessen und statt dessen DirectX zu nehmen.
System.Drawing.Rectangle.IntersectsWith()
Die Variable strKitShare kann doch weiterverwendet werden oder?
Ja, du musst sie allerdings auch initialisieren.
string strKitShare = null;
hi,
nochmal nachgelesen:
die Permission ist eigentlich überflüßig, es sei denn der aktuelle Benutzer soll vom Code her in seinen Rechten eingeschränkt werden.
Security Angaben können im Constructor von RegistryKey übergeben werden.
Warum steht die Instanzierung deines Permission-Objekts unter den using Anweisungen? =)
Naja, probier es mal so:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Security.Permissions;
namespace UPDATE
{
public class App
{
[STAThread]
public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
public partial class Form1 : Form
{
Button button1 = new Button();
public Form1()
{
this.Controls.Add(button1);
button1.Click+= new EventHandler(button1_Click);
}
private void button1_Click(object sender, EventArgs e)
{
RegistryKey Handle = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion", RegistryKeyPermissionCheck.ReadWriteSubTree);
if (Handle == null)
{
MessageBox.Show("Der Key existiert nicht!");
return;
}
try
{
//Bei RegistryValueKind kann nur byte[] übergeben werden...
Handle.SetValue("UPDATE", new byte[]{1,2,3}, RegistryValueKind.Binary);
Handle.Close();
}
catch
{
MessageBox.Show("Wert konnte nicht erstellt werden!");
}
}
}
}
Hi,
du musst vorher eine entsprechende Permission anfordern (Code Access Security).
Siehe dazu die MSDN Doku zur Klasse RegistryPermission.
Das ganze geht dann ungefähr so:
RegistryPermission permission = new RegistryPermission (
RegistryPermissionAccess.AllAccess,
@""Software\\Microsoft\\Windows\\CurrentVersion");
permission.Demand ();
wenn du nur umlaute umwandeln willst ist das ganze ja ziemlich einfach.
entweder wandelst du die zeichen in ihren (hexa-)dezimalen unicode wert um wie bereits von Nordwald beschrieben, oder du baust dir eine kleine lookup table in form eines zweidimensionalen arrays, dass die Zeichen auf den Entity-String mappt, also etwa so
string[,] entityMap =
{
{"Ä", "Ä"},
{"Ü", "Ü},
...
}
Und wandelst damit entsprechend um.
Stichwort "Orcas"
http://www.microsoft.com/downloads/details.aspx?familyid=AD0CE56E-D7B6-44BC-910D-E91F3E370477&displaylang=en
Ist allerdings noch die CTP Version. Keine Ahnung ob es da jetzt auch schon einen RC von gibt?
dann poste doch mal bitte ausschnitte deines codes und sag wo es genau hakt...
Diese Art Bequemlichkeit, stinkt mir.
Das sehe ich auch so.
Der Beispielcode unten resultierte aus meiner eigenen Neugier für diese mir bisher unbekannte Klasse.
Eigentlich kann und darf es nicht sein, dass Leute nicht bereit sind, solche einfachen Dinge selbst zu recherchieren, vor allem wenn "die Klasse bekannt ist".