Hi Jack30lena!
Danke für die Hilfe - nun klappts anscheinend.
Habe jetzt für die Library je eine Projektdatei für WP7 und eine für WPF (mit unterschiedlichen Referenzen auf die jeweiligen Standard-Assemblies) jedoch die CodeFiles nur einmalig (beim Hinzufügen eines File muss ich dann wohl das andere Projektfile entsprechend ergänzen).
Zumindest für die ObservableCollection kompiliert es fehlerfrei und läuft auch wie erwartet.
Danke nochmals!
lg
Hi zusammen!
Ich möchte eine Windows Phone 7 App schreiben und parallel dazu eine WPF-Anwendung.
Nach altbewährtem Vorgehen wollte ich hierzu eine Test.Lib-Library erstellen in dem die ViewModels bzw. BusinessModels drinstecken und dann diese Library in der WP7- sowie WPF-App einbinden und auf dieses Objekte Databinding machen - sollte im Prinzip ja kein Problem sein.
Nur ist es halt so, dass ich in der Test.Lib-Library eine ObservableCollection<T> verwenden möchte.
Und nun das Problem: die beiden Apps verwenden unterschiedliche Assemblies in denen diese Klasse definiert ist (WPF: WindowsBase / WP7: System.Windows) was beim Kompilieren zu einem Fehler führt (in der WPF-App):
The type 'System.Collections.ObjectModel.ObservableCollection`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'. <mypath>\WpfTestApp\MainWindow.xaml.cs 34 13 WpfTestApp
Wie kann ich nun die Library auf einen gemeinsamen Nenner bringen ohne für jedes der 2 Applikationen separate ViewModels (inklusive ObserableCollection) erstellen zu müssen?
LG
Edit:
Habe gerade gesehen, dass beim Kompilieren noch ein Warning kommt:
Warning 3 The project 'TestApp.Lib' cannot be referenced. The referenced project is targeted to a different framework family (Silverlight)
Also wird das was ich vorhabe wohl gar nichts funktionieren oder wie darf ich das verstehen? Wäre ja sehr schade und irgendwie unsinnig.
Wäre für Hilfe sehr dankbar 😃
Hi,
Habe mich gerade etwas damit auseinandergesetzt und bin zur Erkenntnis gelangt, dass es mit dem VirtualizingStackPanel (welches von der ListView standardmäßig verwendet wird) zu tun hat: Dabei werden die Container nämlich nicht sofort sondern erst bei Bedarf erzeugt und führt daher gelegentlich zu den Null-Referenzen bei GetContainerFrom...()-Aufrufen.
Du müsstest auf StatusChanged vom ContainerGenerator reagieren und wenn dieser fertig ist, kannst du die GetContainer-Methoden aufrufen sowie dann BringIntoView().
void _list_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
listview.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
}
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (listview.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
((ListViewItem)listview.ItemContainerGenerator.ContainerFromIndex(listview.Items.Count - 1)).BringIntoView();
listview.ItemContainerGenerator.StatusChanged -= new EventHandler(ItemContainerGenerator_StatusChanged);
}
}
So funktionierts bei mir.
lg
dafür hat das ListViewItem eine eingebaute Methode:
ListView.Items[Index].EnsureVisible();
//edit: hmm da war ich wohl etwas vorschnell, ich hab das so in einer formanwendung drin. warum gehts das denn bei WPF nicht???
ListView.Items[Index].BringIntoView();
Habs zwar nicht getestet, aber laut Doku scheints das zu sein.
mfg
Hi,
Hilft dir vielleicht ein MultiTrigger, der die beiden Properties enthält, weiter?
MultiTrigger-Klasse
lg
Hi,
Da ist ganz einfach: Eine Zuweisung hat als "Ergebnis" immer den Wert und Typ, welcher zugewiesen wurde.
SqlCeParameter[] param = new SqlCeParameter[] { new SqlCeParameter("@user_Name", SqlDbType.NVarChar).Value = stringArr[0] };
Hier machst du eine String-Zuweisung, was als "Ergebnis" eben einen String liefert. Und String is nicht konvertiertbar in SqlCeParameter.
Du solltest die Value-Zuweisung also bereits vorher machen.
lg
Hallo DeveloperX,
Platzhalter in SQL-Queries sind schlecht (Sql-Injection und so)
schon klar, aber so wie ich es verstanden habe, werden die Tabellen-Namen ja nicht vom Benutzer eingeben, sondern aus einer hardcodierten Werteliste entnommen. Von daher ist SQL Injection nicht das Problem.
Das mit dem Platzhalter vs. {0}, {1}:
Wäre eigentlich so gemeint, dass er ja ein Dictionary<string, string> für Programm-interne-Bezeichnung / wirklicher SQL-Tabellenname verwenden könnte. Da klappts halt dann doch nicht mit {0}. Aber ansonsten ist die {0}-Variante besser, da muss ich dir recht geben.
Hi,
Vielleicht hilft es dir ja schon, wenn du einen Platzhalter (z.B. "%%USER_T%%") in deinen SQL-Strings verwendest und diesen dann durch den richtigen Tabellennamen ersetzt:
string USERS_T = "Users";
...
string sql = "select a, b, c from %%USERS_T%% where a = ...";
sql = sql.Replace("%%USERS_T%%", USERS_T);
Das ganze noch in ein Dictionary verpackt und schon gehts für verschieden Tabellen.
lg
Hi,
Dass das Logo einem N ähnelt, stimmt schon, nur war es IIRC eine Aussage von MS, dass es eine Welle symbolisieren soll - und da frage ich mich halt schon, was .NET bitte mit einer Welle zu tun haben soll?
Zitat vom verlinkten Blog:
The result is a design we refer to as the “wave.” The design is strong, simple and distinctive. The suggestion of the letter ‘N’ in the design will become instantly recognizable over time as shorthand for the .NET brand name.
War also wohl beides beabsichtigt: Welle und 'n'.
lg
Hallo!
Ein Konstruktor von DirectoryEntry nimmt als Parameter Benutzername und Passwort. Vielleicht genügt es zu versuchen so ein DirectoryEntry-Objekt zu erstellen.
LG
Hallo!
Das liegt daran, dass der GradientBrush bei z.B. x=101, das Rechteck aber bei x=100 steht. Also einfach beim Erzeugen des GradientBrushes bei der x-Koordinate 1 dazuzählen.
mfg
Hallo Berian!
Ich würde nur eine Tabelle erstellen und eine Spalte "GültigAb" hinzufügen. Damit kannst du gezielt nach einer Version zu einem bestimmten Datum abfragen.
Natürlich muss du halt dann bei allen Select die "GültigAb"-Spalte berücksichtigen (gültig ist die, die am nähesten zum aktuellen Datum ist).
Die restlichen Datensätze kannst du dann auch unverändert lassen.
Zu deiner 2. Variante: Hier müsstest du jedesmal ein delete bzw. update der Tabelle mit den aktuellen Versionen machen und zusätzlich noch ein Insert in der Archiv-Tabelle. Würde ich nicht empfehlen, da du dann sehr aufpassen musst.
mfg
Hallo!
Doch, es gibt eine einzige Vorlesung/Übung in der mit C# gearbeitet wird: "Einführung in die Informatik" aus dem Elektrotechnik-Studium. Ein Bekannter von mir hat das gehabt ... aber selbst mach ich auch Softwareentwicklung Wirtschaft 😉
Hallo!
Du könntest die eigentliche Methode aus der Basis-Klasse implementieren und eine zusätzliche (protected) Methode anbieten, die überschrieben werden kann. Und diese rufst du halt dann aus der eigentlichen Methode auf.
public class FooClass
{
public FooClass()
{
}
public void TestMethod()
{
MessageBox.Show("FooClass");
InternalTestMethod();
}
virtual protected void InternalTestMethod() {};
}
public class DummyClass : FooClass
{
public FooClass() : base()
{
}
override protected void InternalTestMethod()
{
MessageBox.Show("DummyClass");
}
}
lg
Hallo!
Rechtsklick auf ein Propety: Show as Association
mfg
Wenn du willst, dass die aufgerufene Method dein Objekt nicht ändern kann, musst du entweder eine Kopie oder eine ReadOnly-Variante vom Objekt übergeben (siehe dazu: Durch Get-Accessor schreiben?).
Ein Schlüsselwort wirds kaum geben, da dies bei Objekten nicht so trivial ist wie bei Wertetypen.
mfg
Hallo!
Ich denke es geht serial eher darum, dass man das, durch das Get-Property erhaltene, Objekt verändern kann, auch wenn es nicht "ge-set-tet" werden kann.
@Serial: Durch ein Property ohne Set-Accessor ist lediglich der Verweis zum Objekt schreibgeschützt, nicht aber das (Ziel-)Objekt selbst (!).
mfg
Original von Seikilos
Wenn n kleiner der Sektor größe ist, sind das die 8 umliegenden Sektoren, ...
Nicht unbedingt: Wenn nämlich der Kreis-Mittelpunkt ziemlich weiter links unten in einem Quadrat ist, dann können es auch weniger sein (z.B. für n = 0.75*Sektorgröße).
Eine Lösung hab ich zwar leider nicht, aber vl. hilft dir ja folgende Überlegung weiter:
Kleines Bsp. zum besseren Verständis:
Vom Kreis-Mittelpunkt einfach bei der X-Koordinate 'n' dazuaddieren -> Somit weisst du, in welchem Segment mit sicherheit ein Kreis-Teil liegt (dazu brauchst du die Modulo-Operation). [Segment 16]
Jetzt prüfst du das linke Segment [15]mittels oberen beschriebenen Verfahren -> Keine Segmetn mit Kreis-Teil
Das rechte Segment [17] ist ebenfalls kein gesuchtes Segment
Das obere [10] ist eines. Also prüfst du ab dort weiter:
links [9] ist eines -> von dort aus weiterprüfen ...
rechts [11] ist keines
oben [3] st eines -> von dort ebenfalls weiterprüfen ...
unten [16]: ist bereits bekannt, dass es ein gesuchtes Segment ist -> dort nicht mehr weiterprüfen
usw.
mfg
Hallo!
Du suchst in etwa sowas:
http://www.codeproject.com/vb/net/math_expression_evaluator.asp
http://www.codeproject.com/cpp/MathieuMathParser.asp
mfg
Hallo zusammen!
Ich habe mehrere voneinander abhängige Klassen, die prinzpiell nur lesend verwendet werden können (internal Konstruktor, internal set-Accessoren, geben nur ReadOnly-Collections zurück). Dies muss zwinged so sein.
Nun entwickle ich gerade eine Art Editor dafür, der per Reflection das alles ändern kann. Im Editor kann man das ganze dann binär serialisieren (XML kann man ja nur serialisieren, wenn man public Set-Accessoren usw hat) und die serialsierte Datei in einem anderen Programm öffnen.
Soweit so gut. Aber nun fangen die Probleme an: Da die Klassen-Bibliothek bei weitem noch nicht fertig ist, kann ich natürlich keine Binär-Dateien aus vorhergehenden Versionen laden.
Wie umgeht man ein solches Problem? Einen Konverter für Version A nach Version B schreiben? Währe wohl ziemlich aufwändig bzw. beim momentanten Stand der Entwicklung mit mind. eben so hohem Aufwand verbunden wie das Implementieren der ganzen Klassen-Bibliothek mit Editor.
Für Hinweise und Anregungen wäre ich sehr dankbar!
mfg
DeveloperX
Original von Beauty
ändern zuif ((line[0].ToString() == "#") || (line[0].ToString() == ";")) continue;// Kommentar
und das widerrum ändern zu:
if ((line[0] == '#') || (line[0] == ';')) continue;// Kommentar
😉
mfg
Hallo!
Bei der ListBox fügt du einfach in die Items-Collection ein Objekt hinzu. Um an den Text zu gelangen, ruft die ListBox die ToString()-Methode des Objektes auf.
Du kannst also jedes beliebige Objekt in einer ListBox darstellen.
mfg
Hallo!
Das Tag-Property ist genau dafür da, dass man zu einem Control ein Objekt dazuspeichern kann, um z.B. später festzustellen, welches Objekt sicher ändern muss, wenn das Control sich geändert hat.
mfg
Du kannst aber die Abhängikeiten anzeigen lassen: Bei den Properties Rechtsklick "Show as Association".
Desweiteren werden noch Erberungshierarchien und Interface-Implementierungen angezeigt.
mfg
Hallo Golo!
Hier sind die Codes:
static void TestIf(int x)
{
int y;
if (x == 1)
{
y = 2;
}
else
{
y = 3;
}
}
static void TestTri(int x)
{
int y;
y = x == 1 ? 2 : 3;
}
MSIL:
.method private hidebysig static void TestIf(int32 x) cil managed
{
// Code size 23 (0x17)
.maxstack 2
.locals init ([0] int32 y,
[1] bool CS$4$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.1
IL_0003: ceq
IL_0005: ldc.i4.0
IL_0006: ceq
IL_0008: stloc.1
IL_0009: ldloc.1
IL_000a: brtrue.s IL_0012
IL_000c: nop
IL_000d: ldc.i4.2
IL_000e: stloc.0
IL_000f: nop
IL_0010: br.s IL_0016
IL_0012: nop
IL_0013: ldc.i4.3
IL_0014: stloc.0
IL_0015: nop
IL_0016: ret
} // end of method Program::TestIf
.method private hidebysig static void TestTri(int32 x) cil managed
{
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 y)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.1
IL_0003: beq.s IL_0008
IL_0005: ldc.i4.3
IL_0006: br.s IL_0009
IL_0008: ldc.i4.2
IL_0009: stloc.0
IL_000a: ret
} // end of method Program::TestTri
Hallo CongoFX!
Da muss ich herbivore rechtgeben.
Bei 10 Millionen Durchläufen ist die IF-Variante um nur 11 Millisekunden langsamer.
mfg
Hallo!
Das mit dem austauschen von "UserControl" mit "Panel" bringt gar nichts ...
Aber UserControls sind schon der richtige Weg. Mehr dazu siehe: Mit Forms eine art Frame einer Website nachbauen?
mfg
Hallo Herbivore!
Original von herbivore
Das spräche wiederum dafür die INode-Collection als ReadonlyCollection nach außen zu geben, was aber ebenfalls jedes mal einen Kopieren bedeuten wird. Nicht gerade effizient, wenn jemand nur per node.Children _ auf ein bestimmtes Child zugreifen will.
Jedes mal eine neue ReadOnlyCollection zu erzeugen ist nicht notwendig. Die ReadOnlyCollection kopiert die Werte nicht, sondern ist nur ein Wrapper auf die eigentliche Collection, die sie als Member gespeichert hat. Auch wenn du im nachhinein die ursprüngliche Collection änderst, sind die Änderungen in der ReadOnlyCollection sichtbar.
mfg
Hallo!
Wenn du sie als File exportieren willst: MailItem.SaveAs(..) --> http://msdn2.microsoft.com/en-us/library/bb175283.aspx
mfg
Hallo!
Ich finde, gerade beim Programmieren lohnt sich ein Widescreen, da der Platz für Code durch Toolbox, Propery-Fenster/Solution-Explorer reduziert wird. Ich hasse es, wenn eine Codezeile nicht komplett sichtbar ist (umbrechen tue ich auch nicht gerne, da es nicht schön aussieht).
Mein Notebook hat auch eine Widescreen. Ist sehr praktisch, da man besser oben drüberschauen kann. Außerdem ist da noch der genannte Vorteil bei Filmen; kleiner Nachteil: manche Spiele unterstützen (standardmäßig) kein Widescreen-Format.
Aber ich werde mir in Zukunft nur mehr Widescreens kaufen.
mfg
Hallo!
Du kannst einfach auf null prüfen:
if (webBrowser1.Tag == null)
{
// Tag nicht gesetzt
}
mfg
Hallo!
Wäre eine gute Idee.
Wobei mir aber nur die 1. Variante gefällt, da man bei den anderen ja wirklich gleich eine normale for-Schleife machen (also wenn man schon eine Lauf-Variable definieren muss und diese auch noch selber hochzählen muss ...)
Ausserdem sollte die Laufvariable meiner Meinung nach readonly sein, da man ja sonst den Sinn von foreach ("für jedes") verfehlen könnte. Und natürlich optional sollte sie sein.
Aber meiner Meinung nach hat foreach ohnehin einen kleinen, semantischen Fehler: Wenn ich "für jedes" TreeView-Control in einer Controls-Collection etwas machen will, würde die Schleife korrekterweise nur für alle TreeViews durchlaufen werden und nicht für jedes Control (was dann möglicherweise in einem InvalidClassCast-Exception endet).
mfg
Ja richtig, bei XP Home gibts diese Shared nicht (steht im übrigen auf dem verlinkten KB-Artikel).
Diese Shares gibt es im übrigen nicht nur unter XP sondern auch unter Server 2003 und Vista (und somit bei allen anderen Windows-Versionen wahrscheinlich auch).
Hallo!
Ich verwende Subversion. Es gibt da auch ein VS-Plugin dazu (Ankh: http://ankhsvn.tigris.org/), aber das soll nicht sehr stabil funktionieren, daher verwende ich den TortoiseSVN (also nur die Windows-Explorer-Integration).
mfg
Oder du verwendest einfach das NumericUpDown-Control
Hallo!
Das dürfte dir weiterhelfen: http://de.wikipedia.org/wiki/String-Matching-Algorithmus
Bzw. genauer das hier: http://de.wikipedia.org/wiki/Lewenstein-Distanz (sogar gleich mit C#-Implementierung 😉 )
mfg
Hallo!
Das kommt wahrscheinlich daher, dass auch die Uhrzeit mitgeprüft wird. Versuch mal einen Ausdruck der prüft ob das Geburtsdatum zwischen Heute|0:00 und Heute|23:55 ist.
mfg
Hallo Curel!
Das ist doch klar, dass du deine Werte immer wieder umschreibst, denn du hast ja nur ein Objekt. Um dies zu vermeiden, musst du in der Schleife jedes mal ein neues Objekt erzeugen.
Wenn du ein neues Objekt mit 'new' erzeugst und einer bestehenden Variable zuweist, wird ja nicht das alt Objekt mit dem neuen überschrieben, sondern die Referenz der Variable auf das neues Objekt gesetzt. Das alte Objekt bleibt somit am Leben und in der ArrayList.
MeinTyp meinObjekt;
for (int i = 0; i < 10; i++)
{
meinObjekt = new MeinTyp();
// Werte setzen
meineListe.Add(meinObjekt);
}
mfg
Hallo!
Keine Ahnung ob es wirklich so ist:
Ich denke mal, dass es sicherheitstechnisch besser ist, wenn du zuerst komprimiert und dann erst verschlüsselst.
Begründung: Wenn jemand versucht, die Daten zu bekommen, ist es wesentlich schwerer komprimierte Daten zu knacken als "normale" Daten, da diese einen Sinn ergeben (im Gegensatz zu komprimierten Daten). Und dekomprimieren kann die Daten jeder der will.
mfg
Bei mir erscheint ebenfalls die erwartete Ausgabe: WinXP SP2, .NET 2.0
Dein Code zeichnet das Image ja auch nicht skaliert, sondern verschoben (30px nach unten und 30px nach rechts).
siehe Doku: http://msdn2.microsoft.com/de-de/library/system.drawing.graphics.drawimage(VS.80).aspx
EDIT: Ich vermute mal das "Graphics h ..." in deinem Code heisst eigentlich "Graphics g ...". Wenn dies der Fall ist, macht dein Code keinen Sinn, da du das geladene Image ja über ein anderes Image zeichnen willst ...
mfg
Hallo!
Bei Graphics.DrawImage gibt es viele Überladungen ( :rtfm: ). Mit einigen davon kann man das zu zeichnenden Image skaliert zeichnen.
Zu "Größe von Image ändern": Da gibt es anscheinend nichts eingebautes. Du kannst aber eine neues Images in der richigen Größe erstellen und dort skaliert reinzeichnen.
mfg
Hallo!
Was du brauchst nennt sich "URL Rewriting"
mfg
Hallo!
In der MAPIFolder.Items-Collection gibt es entsprechende Events für verschieben und entfernen.
mfg