| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: PropertyGrid (1747 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 20. Okt. 2011 15:41 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, mal wieder eine Frage an die Spezialisten. Ich verwende in einer Form ein PropertyGrid. Was sehr komfortabel funktioniert. Dort kan der User eine Eigenschafft und auch einen Wert für diese Eigenschaft wählen und eingeben. Anschließend möchte ich den Wert für alle Objekte eines Auswahlsatzes einstellen. Jetzt mein Problem: Ich hab die Eigenschaft ja nur als String. Wie krieg ich aus diesem die richtige Eigenschaft des zu ändernden Objects heraus? Also z.B. der User hat als Eigenschaft "Layer" gewählt und hat als Wert "NeuerLayer" eingegeben, wie komme ich dann auf "Object.Layer = NeuerLayer"? Kann ich die Eigenschaft des Objects irgendwie über ihren Namen ansprechen? Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 21. Okt. 2011 11:36 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo Theo, du musst mit dem PropertyInfo-Object arbeiten. EDIT: PropertyInfo ist in System.Reflection; enthalten Das heißt du lässt dir alle Eigenschaften des Types auslesen (Code ist nur exemplarisch hier so herunter getippt) ->PropertyInfo[] _pis = obj.Gettype().Getproperties(); und gehst dann die Liste der EIgenschaften durch foreach (PropertyInfo _pi in _pis) { if (_pi.Name == %MEINEGESUCHTEEIGENSCHAFTNAME%) _pi.Setvalue(obj,val); } Das war's imgrunde. Bei Fragen ... Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! [Diese Nachricht wurde von Brischke am 21. Okt. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 24. Okt. 2011 13:32 <-- editieren / zitieren --> Unities abgeben:
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008 ACAD 2019 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 24. Okt. 2011 14:51 <-- editieren / zitieren --> Unities abgeben:
Hi, ist doch nicht so einfach wie ich dachte. ich hab mal was geschrieben: Sub Move(ByVal Eigname As String, ByVal Value As Double) Dim MyEnti As AcadEntity Dim Eigens() As System.Reflection.PropertyInfo Dim Eig As System.Reflection.PropertyInfo Dim Mytype As System.Type Mylayer() For Each MyEnti In ThisDrawing.ModelSpace Try Mytype = MyEnti.GetType Eigens = Mytype.GetProperties For Each Eig In Eigens If Eig.Name = Eigname Then MsgBox("Treffer") End If Next Catch ex As Exception End Try Next End Sub Aber die Zeile : "Eigens = Mytype.GetProperties" funktioniert leider nicht Eigens bleibt leer. was mach ich falsch? Danke Theo
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 25. Okt. 2011 16:24 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, neue Erkenntnisse von mir. Die Zeile : "Eigens = Mytype.GetProperties" funktioniert mit dem Managed Objekt "Entinity". Mit dem ist aber das PropertyGrid lange nicht so schön. Jetzt weiß ich nicht was ich machen soll. Wenn ich mische, also das Com-Objekt für das PropertyGrid verwende und danach das Managed-Objekt für das finden der Eigenschaft verwende, dann bin ich mir nicht sicher ob die Eigenschaften wirklich gleich heissen. Hat jemand nee Idee? Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 26. Okt. 2011 08:25 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo, schau dir doch erst einmal die Managed-Eigenschaften-Namen an. Layer heißt auch dort Layer, und Farbe = Color. Name = Name usw. ... . Was macht denn die Com-Eigensachaften schöner als die Managed-Eigenschaften? (Englisch sind sie doch alle) Im Zweifel arbeitest du mit einer Übersetzuungstabelle. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 26. Okt. 2011 08:52 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, mit "schöner" meinte ich das PropertyGrid, wenn ich dort das Com-Objekt einlese dann sieht das fast aus wie das Eigenschaften Fenster von AutoCad. Also für den Benutzer eine gewohnte Umgebung. Wenn ich dort das Managed-Objekt einlese, dann bekomme ich zwar auch die Eigenschaften wie Layer, Farbe... , aber auch sehr viele mit denen der normale User nicht viel anfangen kann. Das gefällt mir nicht so. Gut wäre es, wenn ich das PropertyGrid auf die A-CAD spezifischen Sachen beschränken könnte, also so die klassischen Eigenschaften wie Layer, Farbe, linienstärke, Linientyp, Plotstil, Linientypfaktor, Länge, Winkel..... Aber da weiß ich nicht wie das gehen könnte. Ich probiers jetzt einfach mal mit dem COM-Objekt und zum Bearbeiten der Eigenschaften nehme ich dann das Managed-Objekt. Notfalls, verwende ich ne Tabelle, aber das macht das Ganze ein bisschen unflexibel. Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008 ACAD 2019 WIN 7 64bit Intel Xenon CPU E5-1620 3.60GHz 16GB RAM
|
erstellt am: 28. Okt. 2011 14:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, jetzt bin ich so weit. ich mische lustig durcheinander und es funtioniert trotzdem. Kann ich in dem PropertyGrid auch einzelne Eigenschaften ausblenden? Kann ich das Bearbeiten der Eigenschaften verhindern? Also die Werte sollen nur angezeigt werden aber nicht verändert werden können. Danke, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 30. Okt. 2011 08:34 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 09. Nov. 2011 17:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, darf ich dich doch nochmal mit einer Frage belästigen? Wenn die Eigenschaft ein Double-array ist z. B. bei Endpoint, Startpoint oder Delta. Wie muß dann die "getValue" Zeile aussehen? Bisher steht da bei mir: MyValue = Eig.GetValue(NewObjekt, Index) Wobei MyValue ein leeres Object ist Eig ist die Eigenschaft wie etwa Delta NewObjekt ist eine Linie Index ist Object-Array mit einer Integer die 0 ist Das führt unweigerlich zu einer Fehlermeldung, die Anzahl der Parameter stimmen nicht. Kann ich ein Array nur als ganzes auslesen? Oder was muß ich als Index angeben? Kannst Du mir ein Beispiel geben? Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Nov. 2011 17:47 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo Theo, ich kann gerade nicht im Code nachschauen oder testen, aber ich denke man kann beim Index ein Null mitgeben, dann funktioniert das mit allen ObjectTypen. Ich hoffe, dass morgen mein Server wieder läuft, dann schaue ich aber noch einmal nach. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 11. Nov. 2011 10:05 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
Hallo Theo, ich habe eben mal nachgeshen .. es ist tatsächlich so, dass ich die Methode GetProperty mit dem Index-Parameter Null 'füttere'. ich habe mir eine eigene Klasse hierfür erstellt, in der die Variable _PropertyInfoObject als interne Eigenschaft gesetzt ist: private PropertyInfo _PropertyInfoObject; Code: public Object GetValue(Object _Object) { if (_CanRead) { try { return _PropertyInfoObject.GetValue(_Object, null); } catch { return null; } } else return null; }
Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 11. Nov. 2011 10:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, was ist NULL bei dir? Ich hab schon einiges ausprobiert. aber am besten funktioniert es wenn der Index ein leeres Object-Array ist. Also: Dim Index() as Object Bei dem Ergebniss-Object muß es sich anscheinend um den korrekten Typ handeln. Also es darf nicht einfach vom Typ Object sein sondern muß z.B. Geometry.Point3d sein. Könnte ich mal einen Codeschnipsel von dir haben, wo Du deine Variablen deklinierst? das würde mir am meisten helfen. Danke Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 11. Nov. 2011 11:17 <-- editieren / zitieren --> Unities abgeben: Nur für Theo37
private PropertyInfo _PropertyInfoObject; public Object GetValue(Object _Object) { if (_CanRead) { try { return _PropertyInfoObject.GetValue(_Object, null); } catch { return null; } } else return null; } ich habe die ObjectTypen mal FETT gemacht. Eigentlich siehst du alles. Wie du Null in VB.Net angibst ... keine Ahnung vbNull? Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
[Diese Nachricht wurde von Brischke am 11. Nov. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 11. Nov. 2011 11:26 <-- editieren / zitieren --> Unities abgeben:
OK, verstanden. Und damit kriegst Du alle Datentypen raus? Egal ob das Ergebniss ein String, Double oder Vector3d ist. Das probier ich am Montag aus. Bin heut ein bisschen im Stress. Danke und Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |