Listbox von Dialog durch Selektion anderer Listbox befüllen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Listbox von Dialog durch Selektion anderer Listbox befüllen

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von komma4 » Do, 31.07.2008 14:07

ja, da finden auf der Listbox auch actions statt....

ich meinte


Dim LB1_Listener

am Anfang des Moduls (vor erstem SUB)

Code: Alles auswählen

LB1_Listener = _
 createUnoListener( "LB1_", "com.sun.star.awt.XItemListener" ) 
oListBox.addItemListener( LB1_Listener ) 
nach dem Erstellen der Listbox

dann zusätzlicher Code zum Auswerten des Klicks:

Code: Alles auswählen

Sub LB1_itemStateChanged( oEvent ) 
print "Index des Listeneintrags, der nun gewählt ist:" & oEvent.Selected
End Sub

Damit reagierst Du nur auf die Auswahl-Änderung, nicht auf anderes - wie Grössenänderung, Scrollen, minimieren, .... (was alles so als action ausgewertet werden kann)

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von sg1985 » Do, 31.07.2008 13:36

Ich habs jetzt einfach mit einem ActionListener probiert, so wie beim Button, nur dieses mal auf die Listbox und siehe da - es funktioniert :D

Code: Alles auswählen

oListener1 = CreateUnoListener("ListBoxFuellen_", "com.sun.star.awt.XActionListener")
oControl = oDialogControl.getControl("ListBox1")
oControl.addActionListener(oListener1)

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von komma4 » Do, 31.07.2008 13:24

Mit Xray sehe ich, dass eine Listbox die Methode addItemListenerkennt: is invoked when an item changes its state.

Beispiele hier und hier

Viel Erfolg!

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von sg1985 » Do, 31.07.2008 12:57

ok, klingt logisch...
und wie gehe ich da am besten an die Sache ran bzw. wie schaut ein Listener für eine Listbox aus?

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von komma4 » Do, 31.07.2008 11:15

Du erzeugst einen Dialog zur Laufzeit, füllst alle Listboxen und zeigst den Dialog an.
Nun soll der Nutzer in LB1 einen anderen Eintrag wählen können, auf dessen Auswahl hin die LB3 neu gefüllt werden soll.

Wo (oder besser: wie) wird das zuständige Codestück nun gestartet.

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von sg1985 » Do, 31.07.2008 11:05

was meinst du mit "Selektion Listbox1 auslesen" starten?

Das "Selektion Listbox1 auslesen" erfolgt ja im Makro mit folgenden Codezeilen:

Code: Alles auswählen

oListCtr1 = oDialogControl.getControl("ListBox1")
oTextCtr1 = oListCtr1.SelectedItem
...bevor die Listbox3 gefüllt wird.

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von komma4 » Do, 31.07.2008 10:33

nunja, irgendwie muss "Selektion Listbox1 auslesen" ja gestartet werden ... und, da Dein Dialog dynamisch erzeugt wird kannst Du das passende Makro nicht über das "Ereignis"-Tab des Dialogdesigners eintragen.

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von sg1985 » Do, 31.07.2008 10:23

hm, guter Einwand :D

also mal rein theoretisch wenn der Programmcode folgende Abfolge hat: Listbox1 füllen, Selektion Listbox1 auslesen, Listbox3 damit befüllen...

das geht also nicht? Bzw. brauche ich dazu einen Listener?

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von komma4 » Do, 31.07.2008 10:20

...weiss nicht:

Du hast einen listener programmiert - und der geht nicht?

Oder: wie soll Dein Programm mitbekommen, dass in Liste1 etwas (anderes) geklickt wurde....?

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von sg1985 » Do, 31.07.2008 08:10

Damit könnte ich die Listbox sozusagen vorbelegen (also so dass gleich ein Eintrag aus der Liste selektiert ist) oder?

Jedoch muss der User zur Laufzeit des Dialogs ja selber den gewünschten Eintrag in Listbox1 selektieren und anhand dieses soll dann der Inhalt der Listbox3 generiert werden (durch eine select Anweisung), wo der User dann wieder etwas auswählt. Erst dann kann der Dialog geschlossen werden. Kurz gesagt: sobald ich in der Listbox1 etwas selektiere, soll sich der Inhalt der Listbox3 entsprechend anpassen.

Rufe ich das Makro, das den Dialog erzeugt, nun auf und wähle etwas in der Listbox1 aus, wird die Listbox3 trotzdem nicht gefüllt.

Verstehst du mein Problem?

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von komma4 » Mi, 30.07.2008 15:54

SelectedItem gibt Dir den ausgewählten Eintrag zurück. Wenn nichts ausgewählt ist, dann eben nichts. Das Füllen der Listbox selektiert noch nicht.

Willst Du schon einen Eintrag der Liste1 selektieren, damit Du vor der Anzeige des Dialogs auch Liste3 füllen kannst:

Code: Alles auswählen

' Funktion aus TOOLS
' SelectListboxItem(oListbox, iSelIndex)
' 1. Eintrag der Liste selektieren
call SelectListboxItem( oListbox1 , 0 )
Hilft das?

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von sg1985 » Mi, 30.07.2008 12:37

da hab ich schon rein geschaut, ist aber leider nichts brauchbares drinnen für mein Problem.

Hat sonst jemand einen Tipp für mich was bei meinem Makro falsch ist oder wieso das nicht geht?

Re: Listbox von Dialog durch Selektion anderer Listbox befüllen

von komma4 » Mi, 30.07.2008 12:32

...ohne nun auf Dein konkretes Problem direkt einzugehen:


hast Du mal in der Bibliothek: Tools, im Modul: Listbox geschaut. Dort finden sich einige Beispiele für die Bearbeitung von Listboxen, die ich auch immer mal wieder verwende (in TOOS finden sich auch andere, wiederverwendungsfähige Codestücke!)

Zum besseren Lesen der Basic-Texte habe ich die Extension BTL2 - BasicTextListe verfasst

Viel Erfolg!

Listbox von Dialog durch Selektion anderer Listbox befüllen

von sg1985 » Mi, 30.07.2008 11:44

Hallo,

ich habe einen Dialog mit 3 Listboxen, wobei die 3. Listbox abhängig von der Auswahl der 1. Listbox gefüllt werden soll.
Leider funktioniert es nicht und ich drehe mich im Kreis...

Hier ist mein Code (der Dialog wurde im selben Makro gezeichnet, ich habe nur nicht den ganzen Code gepostet weils sonst zu lange wär):

Code: Alles auswählen

'Listbox befüllen

oListBox1 = oDialogControl.getControl("ListBox1")
While oResultSet1.Next()
   b = oResultSet1.getString(1) '1. Spalte in Tabelle
   aListe1 = oListBox1.getModel().StringItemList
   n = UBound(aListe1())
   redim preserve aListe1(n + 1)
   aListe1 (n+1) = b
   oListBox1.getModel().StringItemList = aListe1
Wend

oListBox2 = oDialogControl.getControl("ListBox2")
While oResultSet2.Next()
   b = oResultSet2.getString(1) '1. Spalte in Tabelle
   aListe2 = oListBox2.getModel().StringItemList
   n = UBound(aListe2())
   redim preserve aListe2(n + 1)
   aListe2 (n+1) = b
   oListBox2.getModel().StringItemList = aListe2
Wend

oListCtr1 = oDialogControl.getControl("ListBox1")
oTextCtr1 = oListCtr1.SelectedItem

sSQL3 = "SELECT distinct s_lname || ' ' || s_fname as Name from staff, project, task, allocations where p_name='"+oTextCtr1+"' and s_id=a_s_id and a_t_id=t_id and t_p_id=p_id order by Name;"
oStatement3 = oVerbindung.createStatement
oResultSet3 = oStatement3.executeQuery( sSQL3 )

oListBox3 = oDialogControl.getControl("ListBox3")
While oResultSet3.Next()
   b = oResultSet3.getString(1) '1. Spalte in Tabelle
   aListe3 = oListBox3.getModel().StringItemList
   n = UBound(aListe3())
   redim preserve aListe3(n + 1)
   aListe3 (n+1) = b
   oListBox3.getModel().StringItemList = aListe3
   'msgbox b
Wend

'Dialog sichtbar machen
oDialogControl.setVisible( True )
oDialogControl.execute
'msgbox "oDialogControl.endExecute"
oDialogControl.endExecute

msgbox oTextCtr1

end sub
Der Select Befehl liefert das richtige Ergebnis und wird auch an dieser Stelle ausgeführt. Das Problem dürfte an der Zeile oTextCtr1 = oListCtr1.SelectedItem liegen.
Mache ich diese Zeile nach Beendigung des Dialog, so erhalte ich das richtige Ergebnis (Selektion der Listbox1), mache ich diese Anweisung jedoch an der Stelle, an der sie im obigen Code ist, so wird sie nicht ausgeführt und in oTextCtr1 steht nichts drinnen.

Kann man SelectedItem nicht zur Laufzeit des Dialogs bzw vor Beendigung des Dialogs ausführen?

Ich sehe nämlich keine andere Möglichkeit die 3. Listbox zu befüllen, da ich einfach die Auswahl der 1. Listbox dazu brauche. Also die Reihenfolge des Ablaufs lässt sich nicht ändern (ich muss zuerst die Listbox 1 befüllen, die Selektion dann auslesen, auf Grund der Selektion den Select Befehl ausführen und dann die Listbox 3 damit befüllen).

Bitte um Hilfe :(

Nach oben