druide83
Goto Top

Problem mit Funktion und Combobox

Hallo,

habe mal wieder ein Powershellproblem bei dem ich nach mehreren Tests nicht mehr weiter weis.

Bisher habe ich noch keine funktionen in der PS geschrieben, somit bin ich da noch nicht so fit.

Folgendes Problem:

Ich möchte mehrere Access Abfragen mit verschiedenen Übergabeparametern durchführen. Die ergebnisse sollen in verschiedenen comboboxen einer Windowsform ausgegeben werden.

Hier mal der Code:

$tabelleGesellschaft = "tab_SET_Gesellschaft"  
$selectbefehl = "distinct Langname"  
$global:spaltenname = "Langname"  
$test = '$gesellschaftcombo'  

function get-ADBData($tabelle, $befehl, $spaltenname, [string]$combo)
{
	[string]$DBPath = "R:\AD-Daten.accdb"  
	
	$adOpenStatic = 3
	$adLockOptimistic = 3
	$cn = new-object -comobject ADODB.Connection
	$rs = new-object -comobject ADODB.Recordset
	
	$cn.Open("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=$DBPath")  
	$rs.Open("Select $selectbefehl From $tabelleGesellschaft", $cn, $adOpenStatic, $adLockOptimistic)  
	
	$rs.MoveFirst()
	
	do
	{
		
		$var = ""  
		$var = $rs.Fields.item($global:spaltenname).Value
		
		
		$test.items.add($var)
		
		
		if ($rs.EOF -eq $false) { $rs.MoveNext() }
	}
	until ($rs.EOF -eq $True)
	
	$rs.close()
	$cn.close()
	
}

get-ADBData($tabelleGesellschaft, $selectbefehl, $spaltenname, $test)

Leider weiß ich nicht, wie ich in der Funktion verschiedene Comboboxen ansprechen kann. Wenn ich den comboboxnamen direkt in der funktion angebe ($gesellschaftscombo)
dann funktioniert es. Da ich aber in den verschiedenen funktionsaufrufen verschiedene Boxen ansprechen muss, muss ich den Namen ja irgendwie über geben.

Habe es schon versucht, in der Variable $test den Namen der Combobox als String zu speichern. Wenn ich mir $test in der Funktion ausgebe, steht auch $gesellschaftcombo drin, aber die Ergebnisse
werden trotzdem nicht mit .Items.Add geadded.

Könnte mir hier jemand helfen?

Vielen Dank im voraus

Content-ID: 326845

Url: https://administrator.de/forum/problem-mit-funktion-und-combobox-326845.html

Ausgedruckt am: 23.12.2024 um 03:12 Uhr

131381
Lösung 131381 19.01.2017 aktualisiert um 14:01:36 Uhr
Goto Top
Moin,
das Objekt deiner Form kennt die Eigenschaft Controls der du den Namen deiner Combobox übergeben kannst um es anzusprechen:
$deineForm.Controls['ComboboxXYZ'].Items.Add($var')
Aber bitte den richtigen Namen angeben und nicht den Variablennamen!

Ich würde das zwar alles über DataSource und einer Datatable an die Controls binden aber soweit scheinst du dann doch noch nicht zu sein face-wink

Gruß mik
Druide83
Druide83 19.01.2017 aktualisiert um 14:54:13 Uhr
Goto Top
Weiß jetzt nicht so recht, wie ich das anwenden muss.

Die Form heißt Form1

Muss ich dann in der Funktion schreiben ?

$Form1.Controls['$gesellschaftcombo'].Items.Add($var')  

Dies funktioniert nicht

Wenn ich in der Funktion

$gesellschaftcombo.Items.add($var)

schreibe, funktioniert es, aber dann kann ich die Funktion ja nicht für andere Comboboxen verwenden.
131381
131381 19.01.2017 aktualisiert um 15:17:15 Uhr
Goto Top
Falsch, ich habe doch oben geschrieben das dort der wirkliche Name des Controls reinkommt nicht der Variablenname mit Dollar.

Also oben außerhalb der Funktion deine Variable $test auf den Namen festlegen den du beim erzeugen der Combobox festgelegt hast
$test = "Combobox1"  
und dann in der Funktion den Parameter der Funktion einsetzen
$Form1.Controls[$combo].Items.Add($var)

Geht 200% face-wink

Und war das jetz so schwierig?! Nee was face-smile

Einfach mal die Doku zu den Windows Forms lesen!
https://msdn.microsoft.com/de-de/library/system.windows.forms.control.co ...
Druide83
Druide83 19.01.2017 um 15:48:47 Uhr
Goto Top
Wahrscheinlich bin ich heute einfach nicht mehr aufnahmefähig und sollte das morgen nochmal angehen.

Habe jetzt folgenden code:

$tabelleGesellschaft = "tab_SET_Gesellschaft"  
$selectbefehl = "distinct Langname"  
$global:spaltenname = "Langname"  
$global:test= 'gesellschaftcombo'  
#[System.Windows.Forms.MessageBox]::Show($test)
function get-ADBData($tabelle, $befehl, $spaltenname, [string]$combo)
{
	[string]$DBPath = "R:\AD-Daten.accdb"  
	
	$adOpenStatic = 3
	$adLockOptimistic = 3
	$cn = new-object -comobject ADODB.Connection
	$rs = new-object -comobject ADODB.Recordset
	
	$cn.Open("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=$DBPath")  
	$rs.Open("Select $selectbefehl From $tabelleGesellschaft", $cn, $adOpenStatic, $adLockOptimistic)  
	[System.Windows.Forms.MessageBox]::Show($combo)
	$rs.MoveFirst()
	
	do
	{
		
		$var = ""  
		$var = $rs.Fields.item($global:spaltenname).Value
		$Form1.Controls[$combo].Items.Add($var)
		
		
		if ($rs.EOF -eq $false) { $rs.MoveNext() }
	}
	until ($rs.EOF -eq $True)
	
	$rs.close()
	$cn.close()
	
}

get-ADBData($tabelleGesellschaft, $selectbefehl, $spaltenname, $test)

Wenn ich mir in der Funktion die Variable $combo ausgeben lasse, ist sie leer.

Ich würde sagen reboot tut gut und mach es morgen. Sonst verzweifel ich heute noch.

Danke für deine Hilfe
131381
131381 19.01.2017 aktualisiert um 16:03:28 Uhr
Goto Top
Ja nee, du rufst die Funktion ja falsch auf!
So muss das:
get-ADBData $tabelleGesellschaft $selectbefehl $spaltenname $test
oder so
Get-ADBData -Tabelle $tabelleGesellschaft -Befehl $selectBefehl -Spaltenname $spaltenname -Combo $test

In Powershell werden bei Funktionen im Aufruf die Parameter nicht mit Komma getrennt sondern entweder per Leerzeichen oder mit zusätzlicher Angabe des benannten Parameters.

Ich würde sagen reboot tut gut
Der hilft dir hier nichts face-smile. Das Problem liegt zwischen Stuhl und Bildschirm face-wink

Wen du mal die Doku zu Powershell-Funktionen lesen würdest könntest du das alles auch schön nachlesen, und bräuchtest nicht stundenlang, nur mal so nebenbei...
Druide83
Druide83 19.01.2017 um 17:15:05 Uhr
Goto Top
Zitat von @131381:

Der hilft dir hier nichts face-smile. Das Problem liegt zwischen Stuhl und Bildschirm face-wink
Eine charmante Art und weiße mir meine Dummheit vor zu halten ;)

Habe auch mit deiner Änderung keinen Erfolg.
Egal, danke trotzdem
.
131381
131381 19.01.2017 aktualisiert um 17:39:28 Uhr
Goto Top
Au möhr du stehst echt auf dem Schlauch ... denn du hast hier diverse Flüchtigkeitsfehler in den Variablen drin... (du deklarierst $global:spaltenname und $global:test und unten nutzt du $spaltenname und $test)
Wenn das nicht geht musst du deinen gesamten Code posten ich weiß nämlich nicht ob du noch immer nicht verstanden hast was ich mit den internen Bezeichnern der Controls und der Form meine.
$tabelleGesellschaft = "tab_SET_Gesellschaft"  
$selectbefehl = "distinct Langname"  
$global:spaltenname = "Langname"  
$global:test= 'gesellschaftcombo'  

function get-ADBData($tabelle, $befehl, $spaltenname, [string]$combo)
{
	[string]$DBPath = "R:\AD-Daten.accdb"  
	$adOpenStatic = 3
	$adLockOptimistic = 3
	$cn = new-object -comobject ADODB.Connection
	$rs = new-object -comobject ADODB.Recordset
	
	$cn.Open("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=$DBPath")  
	$rs.Open("Select $selectbefehl From $tabelleGesellschaft", $cn, $adOpenStatic, $adLockOptimistic)  
	$rs.MoveFirst()
	
	while(!$rs.EOF){
		$var = $rs.Fields.item($global:spaltenname).Value
		$Form1.Controls[$combo].Items.Add($var)
                $rs.MoveNext()
	}
	$rs.close()
	$cn.close()
}

get-ADBData $tabelleGesellschaft $selectbefehl $global:spaltenname $global:test
Eine charmante Art und weiße mir meine Dummheit vor zu halten ;)
Naja, PEBCAC halt face-smile. Dumm ist wer dummes tut und die Doku nicht liest,sorry:
http://ss64.com/ps/syntax-functions.html

Ciao
mik