Hallo!
Kann mir jemand helfen?
Aufgabe:
Ändern Sie die Listenanzeige für die Registrierung aus dem Studienheft (Kapitel 1.5) so, dass der Anwender selbst auswählen kann, welche Schlüssel beziehungsweise Einträge im zweiten und dritten Listenfeld angezeigt werden.
Im ersten Listenfeld sollen immer fest die Einträge aus dem Schlüssel HKEY_CURRENT_USER angezeigt werden.
Achten Sie bitte darauf, dass die Einträge im zweiten beziehungsweise dritten Listenfeld nur dann angezeigt werden sollen, wenn im ersten beziehungsweise zweiten Listenfeld ein Eintrag markiert ist.
Damit die Lösung nicht zu aufwendig wird, sollen im zweiten Listenfeld immer nur die untergeordneten Schlüssel angezeigt werden. Im dritten Listenfeld dagegen sollen sowohl eventuell vorhandene Unterschlüssel als auch die Einträge angezeigt werden.
Bitte beachten Sie:
Für einige Unterschlüssel im Schlüssel HKEY_CURRENT_USER – wie zum Beispiel Console – gibt es nicht in jedem Fall weitere untergeordnete Schlüssel. Hier befinden sich auf der zweiten Ebene bereits Einträge. Es kann also durchaus sein, dass bei dem einen oder anderen Schlüssel das zweite Listenfeld leer bleibt.
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CSHP12D_1._5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ButtonEinlesen_Click(object sender, EventArgs e)
{
//ein Array mit Zeichenketten für die Schlüssel
string[] regSchluesselListe;
//ein Array mit Zeichenketten für die Einträge
string[] regEintragListe;
//den Inhalt der drei Listenfelder löschen
listBox1.Items.Clear();
listBox2.Items.Clear();
listBox3.Items.Clear();
//die Schlüssel aus HKEY_CURRENT_USER holen
regSchluesselListe = Registry.CurrentUser.GetSubKeyNames();
//und in das erste Listenfeld eintragen
foreach (string eintrag in regSchluesselListe)
listBox1.Items.Add(eintrag);
//den Schlüssel Software öffnen
using (RegistryKey regSchluessel = Registry.CurrentUser.OpenSubKey("Software"))
{
//und jetzt alle Unterschlüssel für Software lesen
regSchluesselListe = regSchluessel.GetSubKeyNames();
}
//in das zweite Listenfeld eintragen
foreach (string eintrag in regSchluesselListe)
listBox2.Items.Add(eintrag);
//den Schlüssel \Software\Registrierungsdemo öffnen
using (RegistryKey regSchluessel = Registry.CurrentUser.OpenSubKey("Software\\RegistryDemo"))
{
//die Einträge lesen
regEintragListe = regSchluessel.GetValueNames();
//die Namen und die Werte in das dritte Listenfeld schreiben
foreach (string eintrag in regEintragListe)
listBox3.Items.Add(eintrag + " = " + Convert.ToString(regSchluessel.GetValue(eintrag)));
}
}
}
}
Ich weiß nicht, welche Schlüssel genau gemeint sind, die der Anwender selbst auswählen soll.. Hat jemand eine Idee was da umgesetzt werden soll?
Würde mir wahnsinnig weiter helfen. Ich hab die Einheit gut abgeschlossen, habe einen Notenschnitt insgesamt von 1,3, hänge aber leider immer wieder an den Fragstellungen.
Danke
Schlüssel (Keys) sind die Bezeichner von Registry Einträgen.
Ich verstehe das so, dass Du die Keys nicht hart in den Code schreiben sollst, um deren Inhalt abzufragen, sondern dynamisch durch eine User Eingabe umsetzen sollst.
Quasi ein Registry Key Explorer.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hilft dir vielleicht RegSchlüssel in drei Listboxen anzeigen RRS feed?
“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”
Vielen Dank! 👍
Das hat mir schon sehr weiter geholfen. Aktuell hakt es hier und da noch.
Eventuell melde ich mich unter diesem Thema nochmal...
Hallo nochmal.
string Schluessel = listBox1.SelectedItem.ToString() + "\\" + listBox2.SelectedItem.ToString();
regSchluessel = Registry.CurrentUser.OpenSubKey(Schluessel);
Mit dieser Formulierung werden die SubKeys nicht geholt.
Es müsste bestehen aus dem Key in Textfeld 1 plus Textfeld 2, was dann mit \ den Pfad ergibt, aus dem die Subkeys geholt werden. Oder doch nicht?
Ich weiß nicht weiter.
vollständige Methode:
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
listBox3.Items.Clear();
string Schluessel = listBox1.SelectedItem.ToString() + "\\" + listBox2.SelectedItem.ToString();
regSchluessel = Registry.CurrentUser.OpenSubKey(Schluessel);
if (regSchluessel == null)
{
MessageBox.Show("Keine weiteren Schlüssel");
}
else
{
regEintragListe = regSchluessel.GetValueNames();
foreach (string eintrag in regEintragListe)
if (regEintragListe == null)
{
MessageBox.Show("Keine weiteren Schlüssel");
}
else
listBox3.Items.Add(eintrag + " = " + Convert.ToString(regSchluessel.GetValueKind(eintrag)));
}
}
Danke, bin am Verzweifeln
Selbst mal den Debugger ([Artikel] Debugger: Wie verwende ich den von Visual Studio?) angeschmissen um zu schauen, ob der Schlüssel das ist, was Du denkst und hast den Schlüssel mal mit der Registry verglichen?
So ein Fall lässt sich eigentlich immer selbst mit dem Debugger lösen.
Wenn der Key so existiert, dann sollte das zumindest funktional gehen.
OpenSubKey() unterstützt auch volle Pfade, wenn sie stimmen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Vielen Dank,
ja, hab geschaut und verglichen. Ich benutze den Debugger. Habe einen wirklich groben Fehler geschnitzt und jetzt läuft zumindest die Ausgabe in Feld 3.
Allerdings entspricht das immer noch nicht vollständig meiner Aufgabenstellung.
"Damit die Lösung nicht zu aufwendig wird, sollen im zweiten Listenfeld immer nur die untergeordneten Schlüssel angezeigt werden. Im dritten Listenfeld dagegen sollen sowohl eventuell vorhandene Unterschlüssel als auch die Einträge angezeigt werden.
Bitte beachten Sie:
Für einige Unterschlüssel im Schlüssel HKEY_CURRENT_USER – wie zum Beispiel Console – gibt es nicht in jedem Fall weitere untergeordnete Schlüssel. Hier befinden sich auf der zweiten Ebene bereits Einträge. Es kann also durchaus sein, dass bei dem einen oder anderen Schlüssel das zweite Listenfeld leer bleibt."
Ich habe den Lehrer dazu gefragt:
"das sieht schon sehr gut aus. Es fehlen nur Details.
In der Methode listBox2_SelectedIndexChanged() beschaffen Sie sich die Schlüssel, wie Sie es für die listBox1 auch gemacht haben und fügen Sie als Items der dritten ListBox hinzu. Da gibt es noch keine Besonderheiten.
Die eigentlichen Einträge beschaffen Sie sich anschließend mit der Methode GetValueNames() als Array. Dieses durchlaufen Sie ebenfalls mit einer foreach-Schleife. Und fügen in jedem Schleifendurchlauf einen Eintrag und den Wert für diesen Eintrag, den Ihnen die Methode GetValue(eintrag) des RegistryKey-Objekts liefert, als Item in die ListBox3 ein.
Das ist schon alles. In der dritten Listbox stehen also zunächst die Schlüssel und darunter die Einträge in der Form "Eintrag = Wert"."
Hab ich nicht genau das gemacht?
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
listBox3.Items.Clear();
string Schluessel = listBox1.SelectedItem.ToString() + "\\" + listBox2.SelectedItem.ToString();
regSchluessel = Registry.CurrentUser.OpenSubKey(Schluessel);
if (regSchluessel == null)
{
MessageBox.Show("Keine weiteren Schlüssel");
}
else
{
regEintragListe = regSchluessel.GetValueNames();
foreach (string eintrag in regEintragListe)
if (regEintragListe == null)
{
MessageBox.Show("Keine weiteren Schlüssel");
}
else
listBox3.Items.Add(eintrag + " = " + Convert.ToString(regSchluessel.GetValueKind(eintrag)));
}
}
Sorry, aber irgendwas verstehe ich nicht.
In Feld 3 werden aktuell nur die direkten SubKeys angezeigt und nicht alles.
Ich würde mal behaupten, du musst zusätzlich zu den Einträgen (regSchluessel.GetValueNames();
) noch über die Schlüssel (regSchluessel.GetSubKeyNames();
) iterieren und diese der ListBox
hinzufügen.
“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”
Ich hab´s jetzt!
Es gab im Aufgabentext eine fehlerhafte Formulierung.
Außerdem wusste ich nicht genau was mit den Werten gemeint war.
Danke, danke ihr habt mir sehr geholfen. 🙂