VBA: ZOrder wird nicht gefunden

Hallo Xperts!

Um in einem DataGrid eine Combobox anzuzeigen, will ich beim Klicken auf die Zelle eine Combobox einblenden. Dazu wollte ich eine unsichtbare Combo sichtbar machen, Zorder 0 (für ganz nach vorne) und den Fokus setzen.

Leider sagt mir VBA immer, dass die Methode ZOrder nicht gefunden werden kann. Warum könnte das so sein?!

Ich nutze VBA unter Access2000 bzw. 2002!

Vielen Dank!
:wink: Flo

Hallo Flo ,

also mit VBA hab ich net viel am Hut aber unter VB kenne ich mich ein wenig aus. Der Unterschied darin sollte ja nicht gross sein :smile:

Also eine Combobox hat keine Eigenschaft ZOrder, somit geht dein vorhaben nicht.
Ein Datagrid zeigt dir Datensaetze an. In eine Combobox kannst du verschiedene Eintraege anzeigen.
Was ich nicht verstehe wozu du eine Combobox auf dem Datagrid benötigst?
Dort würde dann eh nur maximal ein wert stehen.
Sichtbar machen kannst du eine Combobox / Datagrid mit der Visible Eigenschaft:smile:

Setzt du nun eine Combobox und darueber ein Datagrid, beide sichtbar so siehst du aber nur das datagrid, weil dieses ja die combobox verdeckt .

Aber desto trotz. Auf die schnelle fallen mir 2 Wege ein.

Variante 1:
Wenn du die Combobox sichtbar machen willst, dann setze einfach die Eigenschaft visible vom Datagrid auf Fals. Dann siehst du die Combobox aber halt das Datagrid nicht mehr.

Variante 2:
Ich weiss nicht ob das klappt, aber du kannst gewisse steuerelemente in ein anderes Steuerelement einsetzen. Zum Bsp. eine Progressbar in eine Statuszeile. Ob das mit der Combobox und dem Datagrid geht weiss ich nicht. Ein Versuch waere es aber wert :smile:

Der Code dazu lautet unter VB:

Private Declare Function SetParent Lib "user32" ( \_
 ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
SetParent(combo1.hwnd,Dbgrid1.hwnd)

MFG Alex

Hey Alex,

Also eine Combobox hat keine Eigenschaft ZOrder, somit geht
dein vorhaben nicht.

Das habe ich befürchtet! Allerdings gibt es diverse Postings in Newsgroups wo das so beschrieben wird.

Was ich nicht verstehe wozu du eine Combobox auf dem Datagrid
benötigst?

Ich will als Inhalt einer Zelle nur bestimmte Werte zu lassen!

Variante 1:
Wenn du die Combobox sichtbar machen willst, dann setze
einfach die Eigenschaft visible vom Datagrid auf Fals. Dann
siehst du die Combobox aber halt das Datagrid nicht mehr.

Ja, das ist dann a bisserl blöd, weil ich ja den Anschein erwecken will, dass die Zelle eine Combobox ist. Scheidet leider aus!

Variante 2:
Ich weiss nicht ob das klappt, aber du kannst gewisse
steuerelemente in ein anderes Steuerelement einsetzen. Zum
Bsp. eine Progressbar in eine Statuszeile. Ob das mit der
Combobox und dem Datagrid geht weiss ich nicht. Ein Versuch
waere es aber wert :smile:

Scheidet wohl auch aus, weil ich nicht an die HWNDs ran komme! Ohnehin hätte ich dann das Problem, wie ich die Combo genau auf die richtige Zelle platzieren soll.

Trotzdem vielen Dank!
:wink: Flo

Hey Alex,

Hallo Flo,

Also eine Combobox hat keine Eigenschaft ZOrder, somit geht
dein vorhaben nicht.

Das habe ich befürchtet! Allerdings gibt es diverse Postings
in Newsgroups wo das so beschrieben wird.

Hmm, wie gesagt unter VBA kenne ich mich net aus, nur unter VB und da ist mir so etwas nicht bekannt. Ehrlich gesagt brauchte ich sowas aber bisher noch nicht!

Was ich nicht verstehe wozu du eine Combobox auf dem Datagrid
benötigst?

Ich will als Inhalt einer Zelle nur bestimmte Werte zu lassen!

Ok, sehe ich das richtig … Du hast das Datagrid, diese fuellst du mit daten aus einer Datenbank?
Ich rede nun mal von VB, aber unter VBA sollte des auch gehen.
Wenn du dein recordeset öffnest, via eine SQL Abfrage, kannst du doch angeben was du alles für Spalten einbeziehen möchtest.

Select \* From .... 
somit kannst du schon mal bestimmen welche Spalten du alle im Datagrid sichtbar machen willst!
Solltest du aber alle Spalten benötigen und nur vereinzelte anzeigen lassen, so lade den Recordset mit allen Spalten, dann kannst du ueber


    
     datagrid1.columns("Spaltenname").visible=false
    oder
     datagrid.columns("Spaltenname").Width=0



gewissen Spalten ausblenden \*zwinker\*

So wie ich mir nun denke, möchtest du aber alle Spalten angezeigt bekommen und nur anzeigen lassen wenn die spalte den oder den wert hat.

Das zu realisieren kannst du mittels SQL bei der Abfrage machen!
Ein Bsp. waere



    
     Select \* From Tabelle Where Feldname Like 'gewünschterWert' and Feldname like 'gewünschterWert'




Ich hoffe ich habe die Thematik richtig verstanden, wenn nicht einfach nochmal posten :wink: am besten mit ein bsp. der daten und wie sie angezeigt werden sollen :smile:



> > Variante 1:  
> > Wenn du die Combobox sichtbar machen willst, dann setze  
> > einfach die Eigenschaft visible vom Datagrid auf Fals. Dann  
> > siehst du die Combobox aber halt das Datagrid nicht mehr.
> 
>   
> Ja, das ist dann a bisserl blöd, weil ich ja den Anschein  
> erwecken will, dass die Zelle eine Combobox ist. Scheidet  
> leider aus!  
>   
>   
> 
> > Variante 2:  
> > Ich weiss nicht ob das klappt, aber du kannst gewisse  
> > steuerelemente in ein anderes Steuerelement einsetzen. Zum  
> > Bsp. eine Progressbar in eine Statuszeile. Ob das mit der  
> > Combobox und dem Datagrid geht weiss ich nicht. Ein Versuch  
> > waere es aber wert :smile:
> 
>   
> Scheidet wohl auch aus, weil ich nicht an die HWNDs ran komme!  
> Ohnehin hätte ich dann das Problem, wie ich die Combo genau  
> auf die richtige Zelle platzieren soll.

Das Handle eines Steuerelementes kannst du auch mittels anderen API Aufrufen ermitteln :wink: Aber bei VB gibt es fürs Datagrid und für die Combobox die Eigenschaft HWND. Gibt es die bei VBA nicht?
Positionieren kannst du dann die Combobox mit mit den eigenschaften Left und Top :smile:



> Trotzdem vielen Dank!  
> :wink: Flo


MFG Alex

Hallo, Flo!

Also eine Combobox hat keine Eigenschaft ZOrder, somit geht
dein vorhaben nicht.

Das habe ich befürchtet! Allerdings gibt es diverse Postings
in Newsgroups wo das so beschrieben wird.

Im Entwurf des Formulars kannst Du die Combobox nach vorne setzen. Da sie i. d. R. nicht sichtbar ist, sollte sie nur durch das Setzen von .Visible=TRUE in den Vordergrund geholt werden können.

Was ich nicht verstehe wozu du eine Combobox auf dem Datagrid
benötigst?

Ich will als Inhalt einer Zelle nur bestimmte Werte zu lassen!

Wenn Du schon ein bisschen Eingabeluxus herstellen willst, würde ich statt des DataGrids gleich ein sauber designtes Formular nehmen. Da kannst Du mit solchen Steuerelementen alles abbilden, was Du willst, und eine gewisse Datenplausibilität überprüfen/erzwingen.

Ja, das ist dann a bisserl blöd, weil ich ja den Anschein
erwecken will, dass die Zelle eine Combobox ist. Scheidet
leider aus!

Wie gesagt: Nimm ein komplettes Formular statt DataGrid.

Scheidet wohl auch aus, weil ich nicht an die HWNDs ran komme!
Ohnehin hätte ich dann das Problem, wie ich die Combo genau
auf die richtige Zelle platzieren soll.

Und genau das wäre in jedem Fall ein kleines Problem. Ich weiß jetzt nicht, ob die einzelnen Zellen des DataGrid ein eigenes Handle haben, über das Du die Position auf dem Bildschirm auslesen könntest, um die Combobox sauber zu platzieren.

Aber die Variante „Combobox über DataGrid“ sieht mir irgendwie aus wie ein Jahrgangsketchup zu fettigen, kalten Pommes…

Gruß, Manfred

Hallo!

Was ich nicht verstehe wozu du eine Combobox auf dem Datagrid
benötigst?

Ich will als Inhalt einer Zelle nur bestimmte Werte zu lassen!

Ok, sehe ich das richtig … Du hast das Datagrid, diese
fuellst du mit daten aus einer Datenbank?

Das ist soweit richtig!

Wenn du dein recordeset öffnest, via eine SQL Abfrage, kannst
du doch angeben was du alles für Spalten einbeziehen möchtest.

Select * From …
somit kannst du schon mal bestimmen welche Spalten du alle im
Datagrid sichtbar machen willst!

OK, das ist schon klar! Aber es geht weniger um die Anzeige einzelner Spalten und deren Werte, als die zugelassenen Werte beim Editieren.

Im einfachsten Fall zeige ich alle Zeilen und alle Spalten an. Unter den Spalten befindet sich eine Spalte „Stadt“. Hier möchte ich aber keine freie Eingabe erlauben, sondern eben nur eine bestimme Liste, zum Beispiel „München“, „Berlin“ und „Frankfurt“. Diese drei Städte sollen eben in einer Combo stehen, so dass der Benutzer die Werte dieser einen Spalte nur über die Auswahlliste vorgeben kann.

servus,
:wink: Flo

Hallo Flo,

ok das ist einleuchtend. Aber da faellt mir spontan eine andere Variante ein. Was ist wenn du die Spalte ‚Stadt‘ fürs editieren im Datagrid sperrst. Geht sicher irgendwie. Zur not Spalte ausblenden.
unter dem Datagrid machst du deine Combobox. Diese weisst du dem Recordset zu und der Nutzer muss dort die daten auswaehlen.
Was spricht dagegen?
Ansonsten schaue dir mal das MSHFELXGRID an ob man damit was machen kann. Wenn die Variante , Vererben von Steuerelementen in ein anderes Steuerelement nichz geht, bin ich mit meinem Latein am Ende. Sorry

Aber was mir gerade einfaellt.Gesetz dem Falle du bekommst die Combobox da rein. Dann kannst du sie nur einblenden wenn er auf die gewisse Spalte klickt, ansonsten musst du sie wieder ausblenden.( Sonst haettest du bei bsp. 5000 Recordset’s = 5000 Comboboxen und da steigt VB aus. Ich weiss net wie hoch die Grenze ist, aber ich tippe mal so auf die 255)
Das bedeutet das du jederzeit die Position der Combobox ermitteln und Positionieren musst, was sehr aufwendig ist.
Wenn ich mal Zeit finde koennte ich das mal unter VB probieren.

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Servus Alex,

das alles wird einfach zu kompliziert. Ich werde das jetzt einfach so lösen, dass man durch einen Doppelklick auf die Zeile eine neues Formular zu sehen bekommt, wo man den einzelnen Datensatz bearbeiten kann.
Hat den Nachteil, dass man jeden Datensatz separat nochmals „öffnen“ muß (da diese Daten relativ statisch sind, eher kein Problem), hat aber den Vorteil, dass es einfach zu realisieren ist.

Trotzdem Danke für Deine Vorschläge.

ciao,
:wink: Flo