Laden...
Avatar #avatar-1931.jpg
Friedel myCSharp.de - Member
Nähe Kassel / Hessen Dabei seit 19.08.2005 830 Beiträge
Benutzerbeschreibung

Forenbeiträge von Friedel Ingesamt 830 Beiträge

21.08.2007 - 09:30 Uhr

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

21.08.2007 - 09:16 Uhr

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

16.08.2007 - 13:36 Uhr

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

16.08.2007 - 13:30 Uhr

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

16.08.2007 - 10:16 Uhr

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

16.08.2007 - 09:51 Uhr

Hallo ninos,

vielleicht hilft dir eine CSV-Datei weiter. Wie man die aus einer DataTable erstellt, findest du bspw. hier

Gruss
Friedel

16.08.2007 - 09:46 Uhr

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

15.08.2007 - 16:43 Uhr

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

15.08.2007 - 15:53 Uhr

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

15.08.2007 - 15:00 Uhr

Schritte, welche ich gemacht habe:

  • VGrid auf eine Form gelegt -> Einstellungen gelassen
  • Editor geöffnet -> entsprechend Rows angelegt -> alle Einstellungen so gelassen
  • deine Klassen kopiert
  • BindingList erstellt -> gefüllt -> an Grid als DataSource übergeben

und bei mir funzt das.

Demo im Anhang (funzt nur mit der DevExpress-Suite, Referenzen einfügen)

Gruss
Friedel

15.08.2007 - 13:22 Uhr

Jetzt wo ich es sehe:

  • Also die Methode setValues ist zumindest für die Benutzung des Grids irrelevant.
  • Wann soll die Methode Start_Calc() aufgerufen werden? Immer wenn sich ein Wert ändert? Dann ruf diese im Setter aller relevanten Eigenschaften auf.

Friedel

15.08.2007 - 13:18 Uhr

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

15.08.2007 - 11:54 Uhr

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

15.08.2007 - 11:25 Uhr

@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

15.08.2007 - 11:06 Uhr

Nein, in meinem ersten Post ist der Code komplett. In der Variablen i ist die Länge des übergebenen Arrays.

15.08.2007 - 10:57 Uhr

@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

15.08.2007 - 10:42 Uhr

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

15.08.2007 - 10:32 Uhr

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

15.08.2007 - 08:18 Uhr

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

15.08.2007 - 08:16 Uhr

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

14.08.2007 - 16:58 Uhr

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

14.08.2007 - 16:53 Uhr

Ups, hab das Forum überlesen, sorry...

Gruss
Friedel

14.08.2007 - 16:43 Uhr

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

14.08.2007 - 16:38 Uhr

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

14.08.2007 - 14:50 Uhr

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

14.08.2007 - 14:14 Uhr

Hallo SvenC,

es gibt ein Beispiel in der MSDN, allerdings mit zwei seperaten Grids.

Gewusst wie: Erstellen eines Master-/Detailformulars mit zwei DataGridView-Steuerelementen in Windows Forms

Northwind DB

Gruss
Friedel

14.08.2007 - 13:30 Uhr

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

14.08.2007 - 11:34 Uhr

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

14.08.2007 - 11:26 Uhr

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

14.08.2007 - 11:19 Uhr

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

14.08.2007 - 11:05 Uhr

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

14.08.2007 - 10:46 Uhr

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

10.08.2007 - 13:42 Uhr

Firefox, weil es dem guten alten Netscape am ähnlichsten ist. =)

Gruss
Friedel

10.08.2007 - 13:29 Uhr

Version 1.0 ganz weglassen, keinen Unterordner, keine DLL im Ausführungsverz., nirgends einfach löschen.

10.08.2007 - 13:24 Uhr

Dann sollten auch keine Probleme auftreten, wenn nur die neue Version geladen wird.

10.08.2007 - 13:20 Uhr

Hallo Vassili,

wieso überhaupt eine andere Version. Eine Erweiterung führt doch (eigentlich) nie zu einem Bruch der Kompatibilität.

Gruss
Friedel

10.08.2007 - 13:10 Uhr

@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

10.08.2007 - 12:59 Uhr

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

10.08.2007 - 12:16 Uhr

Hallo webstarg,

ich denke dir wird nichts anderes übrig bleiben, als einen CodeDomSerializer anzugeben.

Gruss
Friedel

10.08.2007 - 12:12 Uhr

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

10.08.2007 - 12:03 Uhr

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

10.08.2007 - 11:54 Uhr

Hallo phpkueken,


public static VOID...

Gruss
Friedel

10.08.2007 - 11:47 Uhr

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

10.08.2007 - 11:41 Uhr

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

10.08.2007 - 11:33 Uhr

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

10.08.2007 - 10:56 Uhr

Nicht:

Dateiname.ListViewItemSorter =
  new ListViewComparer(e.Column, SortOrder.Descending);

Sondern:

Dateiname.ListView.ListViewItemSorter =
  new ListViewComparer(e.Column, SortOrder.Descending);
10.08.2007 - 10:55 Uhr

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

10.08.2007 - 10:50 Uhr

Ist hier irgendwo eine Kamera ?

Siehe einen Thread über deinem...

Gruss
Friedel

PS: Ich werde mich jetzt hier sang und klanglos zurückziehen...

10.08.2007 - 10:43 Uhr

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.

10.08.2007 - 10:37 Uhr

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