Hallo herbivore,
ich möchte eine Art Proxy, wie er in der AOP genutzt wird selber erstellen. Im Grunde geht es darum, zur Laufzeit beliebige Objekte (also möglichst ohne Einschränkung, wie z.B. "muss Interface blabla" implementieren) zu "überwachen". Im Grunde habe ich alles, was ich dafür brauche, eben nur dieses kleine Schlüsselwort fehlt mir.
In der "normalen" Programmierung" geb ich dir 100% Recht, sollte man new vermeiden. Aber in meinem Fall glaube ich, dass ich mir damit eine Menge arbeit sparen kann.
Gruss
Friedel
Hallo,
ich versuche mit den Klassen aus dem Namespace Emit eine 1-zu-1 Kopie einer Klasse zu erstellen, wie diese in VS ohne Probleme möglich ist. Allerdings scheiter ich an einer für mich wichtigen Hürde.
public class A {
public void BaseMethod() {
MessageBox.Show("Base");
}
}
public class B : A {
public new void BaseMethod() {
MessageBox.Show("Abgeleitet");
base.BaseMethod();
}
}
Dieses kleine Wort new ist das Problem. Wenn die BaseMethod als virtual gekennzeichnet ist, ist es kein Problem, diese zu überschreiben, wenn nicht, dann schon. In der IDE geht es doch auch. Nutzt Microsoft eine andere Möglichkeit, den Code zu erzeugen, oder gibt es einen anderen Grund, warum das new nicht funzt.
Gruss
Friedel
Hallo smichae,
über kaum eine Komponente wirst du so viele Hilfen und Beispiele finden wie zu diesem.
Als Einstieg der/ein Eintrag aus der MSDN.
Gruss
Friedel
Sorry, ich verstehe deine Frage glaube ich nicht ganz. Du kannst für den Text des ToolStrips angeben was du willst.
Ich glaub du wirst langsam zu meinem persönlichen Grid Berater 😉
Und damit das nicht so bleiben muss... 🙂Hier ist die Support-Seite von DevExpress. Sehr viele Fragen sind hier bereits beantwortet und sollte man wirklich nicht weiterkommen, kann man denen auch schreiben. Die Beantwortung der Frage ist meist recht schnell da.
Gruss
Friedel
Hallo,
das geht nur anders herum, was ja auch logisch ist. Wo sollen den die zusätzlichen Eigenschaften, Methoden, usw. her kommen von der "normalen" Button-Instanz.
PS: Fett schreiben gilt als schreien, und meines Erachtens nach als unhöflich.
Gruss
Friedel
Hallo ninos,
vielleicht hilft dir eine CSV-Datei weiter. Wie man die aus einer DataTable erstellt, findest du bspw. hier
Gruss
Friedel
Hallo,
ja...
ToolTipController auf die Form legen und dem VGrid zuweisen, das Event GetActiveObjectInfo des Controllers registrieren und in den Handler folgendes einfügen:
void toolTipController1_GetActiveObjectInfo(object sender,
DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e) {
VGridHitInfo info = this.vGridControl1.CalcHitInfo(e.ControlMousePosition);
if (info.HitInfoType == HitInfoTypeEnum.HeaderCell)
e.Info = new DevExpress.Utils.ToolTipControlInfo(info.Row, info.Row.Properties.Caption);
}
Der eigentliche Text des ToolTips ist hier info.Row.Properties.Caption...
Gruss
Friedel
Hallo dN!3L,
Original von dN!3L
Wäre an sich auch mit TopMost lösbar, aber das ist mir ZU weit vorn ;-D.
Dann nutz die form.Owner Eigenschaft (nur auf der anzugebenden Form "TopMost").
Gruss
Friedel
Hallo MarcusS,
ja kann man:
MethodInfo info = obj.GetType().GetMethod("privTestMeth", BindingFlags.Instance | BindingFlags.NonPublic");
Wenn du es knallhart siehst, sind modifier umsonst, aber dabei geht es ja mehr um die Kapsellung der Objekte, als die Sicherheit ein privates Feld nicht auslesen zu dürfen.
Bei Reflection sollte man schon wissen was man macht.
Gruss
Friedel
Schritte, welche ich gemacht habe:
und bei mir funzt das.
Demo im Anhang (funzt nur mit der DevExpress-Suite, Referenzen einfügen)
Gruss
Friedel
Jetzt wo ich es sehe:
Friedel
Hallo,
BindingList<World.india> list = new BindingList<World.india>();
for (int i = 0; i < 10; i++) {
list.Add(new World.india());
}
this.editorRow1.Properties.FieldName = "Im_value";
this.editorRow2.Properties.FieldName = "zeta_value";
this.vGridControl1.DataSource = list;
Somit hast du dem Grid schonmal eine Liste von Indias zugewiesen. Belegst du die Werte vor, z.B. im Konstruktor von India, oder initialisierst die Werte der India-Instanzen in der for-Schleife entsprechend, siehst du diese im Grid.
Wenn du jetzt im Grid etwas änderst, werden die Werte in die jeweilige India-Instanz geschrieben.
Gruss
Friedel
Hallo outi,
die Eigenschaften in der Basisklasse country und in der abgeleiteten Klasse india, welche im Grid editierbar sein sollen, müssen sowolh einen getter als auch einen setter haben.
public string CountryName{
get { return this.countryName; }
set { this.countryName = value; }
}
Gruss
Friedel
@herbivore
Letzter Beitrag dazu von mir:
(Habe deinen Beitrag "Reflection hat unbestreitbar sein..." erst jetzt gesehen)
Nichts anderes habe ich behauptet. Aber selbst talla sieht so in der Methode keinen Sinn, was für mich heißt das GIJOE etwas vor hat, was wir beide aus absolut anderen Blickwinkeln sehen. Das ist schließlich sinn von Foren (meine Meinung). Es ist nicht falsch jemanden auf Möglichkeiten hinzuweisen. Ob diese dann sinnvoll sind liegt weder in meinem Ermessen, noch in deinem.
Der Codeausschnitt ist absolut nicht aussagekräftigt. Auschliesslich der Titel hat mich dazu gebracht, GIJOE auf die Möglichkeit der Reflection hinzuweisen.
Deshalb kann hier eine Aussage "eindeutig falsch" nicht richtig sein...
Gruss
Friedel
Nein, in meinem ersten Post ist der Code komplett. In der Variablen i ist die Länge des übergebenen Arrays.
@herbivore
Wie du meinst...
Ich für meinen Fall finde Reflection eine tolle Sache. Keine falschen Rückschlüsse; ich nutze sie ebenfalls nur dort wo sie sinnvoll ist. Mit etwas mehr Info, was die eigentliche Methode macht, kann man mit Reflection wahrscheinlich einiges reißen. Allerdings muss man natürlich aufpassen, dass man keine eierlegende WollMilchSau schreibt / versucht zu schreiben.
edit: bleibe bei "eindeutig falsch" ist falsch
Friedel
Original von herbivore
Reflection (was hier aber eindeutig der verkehrte Weg ist)
Oh, entschuldigung (Ironie)...
Titel: "An Eigenschaften, Methoden von ... ran kommen"
Da ist Reflection nicht eindeutig falsch. Es läßt sich aber auch anders lösen.
Friedel
Hallo GIJOE,
das geht mit Reflection.
MethodInfo info = obj1.GetType().GetProperty("Length");
if(info != null)
//obj1 hat diese Eigenschaft und du kannst sie mit:
int l = info.GetValue(obj1, new object[] { });
edit1: new bei new object[]{} vergessen
edit2: edit1 vergessen
Gruss
Friedel
Hallo diana,
ich denke nicht, denn das ist der Sinn einer Hashtable. Der Zugriff erfolgt eben etwas anders wie bei einer Liste und kann deshalb schneller sein als eben solche.
Gruss
Friedel
Original von Sturmklinge
Internet Explorer, weil meine Lieblingsseite/Startseite sonst nicht richtig funktioniertgg
Habe gerade mal wieder mit der Seite seit "ewiger" Zeit den IE benutzt. Hat mich gleich drei mal aus meinem aktiven Programm geholt, dann noch wie wild in der Taskleiste geblinkt und trotzdem war er eingefroren.
Danke Bill, für diesen tollen neuen Browser.
Gruss
Friedel
BindingList<T> ist eine generische Klasse, welche es ab .Net 2.0 gibt. Sie wird dazu verwendet, einfache Datenbindung an ein Control (Grid) zu ermöglichen. Geht aber auch mit einer "normalen" List<T>.
System.ComponentModel.BindingList<DeineKlasse> dataSource = new System.ComponentModel.BindingList<DeineKlasse>();
//Beispiel
for(int i = 0; i<100; i++){
dataSource.Add(new DeineKlasse("Name_" + i.ToString(), i));
}
this.vGrid.DataSource = dataSource;
this.editorRow1.Properties.FieldName = "NameDeinerEigenschaft";
...
Gruss
Friedel
Ups, hab das Forum überlesen, sorry...
Gruss
Friedel
Hallo Desastermaster,
meinst du die Spaltenüberschriften, also die ColumnHeader?
Wenn ja, die bleiben default-mäßig beim hoch/runter-Scrollen stehen. Nach links und rechts machts ja keinen Sinn.
Gruss
Friedel
Hallo outi,
ich denke, du hast da ein Verständnisproblem. Das VGrid ist kein Control, in welches man Daten eingibt. Ein Grid zeigt Daten an.
Du müsstest dir also eine Klasse schreiben, welche deine Daten für eine Row hält, also fünf Eigenschaften mit Getter und Setter hat, wie sie deinen Rows entsprechen. Dann legst du eine Liste (BindingList<T> z.B.) an, und legst diese als Datenquelle (DataSource) für dein Grid fest. Für deine angelegten Rows musst du unter row.Properties.FieldName den Namen der Property aus deinem neuen Objekt angeben. Wenn du jetzt im Grid etwas änderst, wird das Objekt in der Liste entsprechend verändert.
Gruss
Friedel
Wenn es was kosten darf, DevExpress bietet so ein Control an. Kann ich nur empfehlen, kostet aber eben.
Oder du suchst mal bei CodeProject.
Gruss
Friedel
Hallo SvenC,
es gibt ein Beispiel in der MSDN, allerdings mit zwei seperaten Grids.
Gruss
Friedel
Original von Xinaloca
Aber sonst ist echt schwer, hier weiter zu kommen, vor allem da man ja auch das Anlegen nicht debuggen kann ..
Doch, kann man 🙂
Wie, siehst du bspw. in diesem Thread.
Gruss
Friedel
Ich glaube dafür sind die PostBuildEvents nicht gedacht, denn es kann ja sein, dass noch Dateien, oder sonstwas kopiert werden müssten, bevor die Anwendung startet. Das muss halt beendet sein.
Du kannst eventl. mit Debug arbeiten
#if Debug
startProc();
#endif
Unter [Project]->Properties->Build->Conditional...->Debug eintragen.
Bei einem ReleaseBuild wird der Code übersprungen, bzw. erst gar nicht in das Prog integriert.
Gruss
Friedel
Original von DrGonzo27
Allerdings liefert das Tool immer einen Fehler zurück. Kann es mit dem WaitForExit zusammenhängen - das es eventuell ein Problem damit hat, wenn ein Prozess zu lange dauert, denn mit kurzen Prozessen hat alles einwandfrei funktioniert?
Eventuell auch mit dem Wetter, kommt auf die Fehlermeldung an 😁
Wie poste ich richtig? Punkt 5
Gruss
Friedel
Hallo Paul_C.,
du kannst dein Programm, welches du in der .bat-Datei startest auch direkt im Code starten. Dafür kannst du die Klasse Process verwenden ( :rtfm: ).
Gruss
Friedel
Hallo,
würde das aber, wie herbivore bereits gesagt hat, nicht so machen. Nimm vielleicht zwei Konstruktoren mit entsprechenden Parametern. Den so kann der Nutzer deiner Klasse alle Typen übergeben, bekommt aber bei 99% eine Fehlermeldung, oder was machst du wenn ein nicht unterstützter Typ als generischer Parameter übergeben wird.
Gruss
Friedel
Hallo Xinaloca,
kann dir leider keine driekte Lösung für dein Problem anbieten, aber wenn ich mir dein Prog mal so ansehe, hätte ich zu, mindest einen Vorschlag, welcher dein Problem lösen könnte.
Der Navigator sollte aus meiner Sicht eine feste Componente im DataContainer sein, also immer da (Property mit getter). Willst du die Items dann anlegen, sprichst du direkt mit diesem Navigator. Das hat den Vorteil, dass der Navigator überall verfügbar ist. Dann kannst du mit einem CodeDomSerializer selbst die benötigten Codezeilen anlegen. Ausserdem wird es dadurch möglich (allerdings mit zusätzlichem Aufwand), dass dein Control zur Designzeit bedienbar ist.
Gruss
Friedel
Firefox, weil es dem guten alten Netscape am ähnlichsten ist. =)
Gruss
Friedel
Version 1.0 ganz weglassen, keinen Unterordner, keine DLL im Ausführungsverz., nirgends einfach löschen.
Dann sollten auch keine Probleme auftreten, wenn nur die neue Version geladen wird.
Hallo Vassili,
wieso überhaupt eine andere Version. Eine Erweiterung führt doch (eigentlich) nie zu einem Bruch der Kompatibilität.
Gruss
Friedel
@Reverent
Stimmt.
Und eigentlich lässt man sich auch keinen Reader zurück geben, sondern lieber ein gefülltes DataSet, eine DataTable, oder ähnliches. Dann hat man in der Methode alles im Griff und bekommt keine unerwünschten Nebeneffekte.
Gruss
Friedel
Hallo
schau dir mal diese Form an. So in der Art kannst du auch vorgehen. Dann allerdings mit einer WaitForm anstatt mit einem WaitControl.
Gruss
Friedel
Hallo webstarg,
ich denke dir wird nichts anderes übrig bleiben, als einen CodeDomSerializer anzugeben.
Gruss
Friedel
Immer von dem Typ, den du zurück geben willst, also in deinem Fall SqlDataReader.
Aber wie Talla bereits angemerkt hast, wirst du noch einen Fehler enthalten, den egal welchen "Weg" das Programm auch einschlägt, die Methode muss was zurückgeben.
public static SqlDataReader SQLExecute(string sqlstate)
{
string myQuerySQL = sqlstate;
SqlDataReader reader = null;
try
{
SqlCommand command = new SqlCommand(myQuerySQL, Connection);
reader = command.ExecuteReader();
reader.Close();
}
catch (SqlException ex)
{
MessageBox.Show(ex.ToString());
}
return reader;
}
Gruss
Friedel
Mir am liebsten Heidi Klum, eine Kiste Bier und Frankfurt - Hertha 5:0 😉
Im Ernst:
ListBox lb = new ListBox();
foreach(object item in lb.Items){
...
}
Allerdings sollte man Controls nicht als Datenhalter verwenden. Irgendwo müssen die Daten für die Einträge ja herkommen, oder.
Nimm also lieber eine Collection (Liste), o.ä. und iteriere durch die.
Gruss
Friedel
Hallo phpkueken,
public static VOID...
Gruss
Friedel
Hallo FI/AW,
Original von FI/AW
Mit einer For-Schleife funktioniert das irgendwie nicht, mit einer foreach genauso wenig.
Wie poste ich richtig? Punkt 5
Gruss
Friedel
Hallo Basti_dm3,
du schliesst den FileStream nicht.
Nutze Streams besser so:
using(FileStream stream = ...){
using(StreamWriter writer = ....){
writer.Close(); //Nicht zwingend nötig
}
stream.Close(); //Nicht zwingend nötig
}
Dann werden am Ende der jeweiligen using-Blocks der Stream und der Writer Disposed.
Gruss
Friedel
Hallo FragDieb,
mit Try-And-Error geht es z.B. so:
System.Net.WebRequest req = System.Net.WebRequest.Create("http://google.de");
try{
req.GetResponse();
}
catch{
//Nicht erreichbar
}
Gibt aber sicher noch bessere Lösungen.
Gruss
Friedel
Nicht:
Dateiname.ListViewItemSorter =
new ListViewComparer(e.Column, SortOrder.Descending);
Sondern:
Dateiname.ListView.ListViewItemSorter =
new ListViewComparer(e.Column, SortOrder.Descending);
Na das 🛈 Icon gefällt mir, Danke.
Also wenn ich ehrlich bin nutze ich auschliesslich die Online Hilfe und nicht die Installierte. Grund: Die installierte Version muss ich immer aktuell halten, die Online-Version nicht. Ausserdem (ok kein wirklicher Vorteil) habe ich so das Gefühl schneller an meine gewünschte Information zu kommen, da ich einfach wild neue Tabs mit evtl. relevanten Infos "nebenher" öffnen kann.
Belassen wir es dabei. Ich verlinke die Online MSDN dann halt bei Bedarf per Hand.
Danke trotzdem (gerade für das OB-Icon)
Gruss
Friedel
Ist hier irgendwo eine Kamera ?
Siehe einen Thread über deinem...
Gruss
Friedel
PS: Ich werde mich jetzt hier sang und klanglos zurückziehen...
Oh Mann, das haben wir doch oben schon geklärt.....
Nicht Dateiname (System.Windows.Forms.ColumnHeader) hat diese Eigenschaft, sondern Dateiname.ListView (System.Windows.Forms.ColumnHeader.ListView)................
Friedel
PS: Ohne Schei... lerne erstmal die Grundlagen der Objektorientierten Programmierung (OOP) und mache dann solche Tutorials.
Du interpretierst das falsch. Die Eigenschaft ist bereits vorhanden und zwar in Dateiname.ListView(.ListViewItemSorter). Du musst dieser Eigenschaft ein Objekt einer Klasse, welche IComparer implementiert zuweisen. In deinem Fall ist das die Klasse ListViewComparer. Das machst du ja auch.
Die Eigenschaft musst du nicht in erneut in deiner Form-Klasse anlegen und schon gar nicht so.
Wenn ein Tutorial so eine Zeile:
public IComparer ListViewItemSorter {get; set;}
angibt, bedeutet das, dass die Eigenschaft sowohl gelesen als auch geschrieben werden kann.
Gruss
Friedel