Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Registry - Windows Forms
Narya88
myCSharp.de - Member

Avatar #2CIBk4PrRqXCixyQys7R.png


Dabei seit:
Beiträge: 9

Themenstarter:

Registry - Windows Forms

beantworten | zitieren | melden

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
Ein Zauberer kommt nie zu spät, ebenso wenig zu früh. Er trifft genau dann ein, wenn er es beabsichtigt.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16224

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Urza
myCSharp.de - Member



Dabei seit:
Beiträge: 67

beantworten | zitieren | melden

Hilft dir vielleicht RegSchlüssel in drei Listboxen anzeigen RRS feed?
“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

- Patrick to Spongebob
private Nachricht | Beiträge des Benutzers
Narya88
myCSharp.de - Member

Avatar #2CIBk4PrRqXCixyQys7R.png


Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

Vielen Dank!
Das hat mir schon sehr weiter geholfen. Aktuell hakt es hier und da noch.

Eventuell melde ich mich unter diesem Thema nochmal...
Ein Zauberer kommt nie zu spät, ebenso wenig zu früh. Er trifft genau dann ein, wenn er es beabsichtigt.
private Nachricht | Beiträge des Benutzers
Narya88
myCSharp.de - Member

Avatar #2CIBk4PrRqXCixyQys7R.png


Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

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
Ein Zauberer kommt nie zu spät, ebenso wenig zu früh. Er trifft genau dann ein, wenn er es beabsichtigt.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16224

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Narya88
myCSharp.de - Member

Avatar #2CIBk4PrRqXCixyQys7R.png


Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

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.
Ein Zauberer kommt nie zu spät, ebenso wenig zu früh. Er trifft genau dann ein, wenn er es beabsichtigt.
private Nachricht | Beiträge des Benutzers
Urza
myCSharp.de - Member



Dabei seit:
Beiträge: 67

beantworten | zitieren | melden

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.”

- Patrick to Spongebob
private Nachricht | Beiträge des Benutzers
Narya88
myCSharp.de - Member

Avatar #2CIBk4PrRqXCixyQys7R.png


Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

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.
Ein Zauberer kommt nie zu spät, ebenso wenig zu früh. Er trifft genau dann ein, wenn er es beabsichtigt.
private Nachricht | Beiträge des Benutzers