Avatar billede 4u2x Nybegynder
18. august 2004 - 19:18 Der er 37 kommentarer og
1 løsning

Udskriv alle værdier i en Regedit mappe

En der ved hvordan man udskriver alle værdier fra en mappe i Regedit?

fx fra stien

\\SOFTWARE\MINSTI  <---
Avatar billede snepnet Nybegynder
18. august 2004 - 19:20 #1
denne her må være noget for dig ;o)
http://www.c-sharpcorner.com/1/newmanregistry.asp
Avatar billede 4u2x Nybegynder
18. august 2004 - 19:27 #2
ved du eventuelt hvordan man udskriver det i en DataGrid ?
Avatar billede snepnet Nybegynder
18. august 2004 - 19:38 #3
jeg tror det nemmeste for dig vil være at definere en DataTable med 3 kolonner (name, type og data), som du så fylder op med rækker når du fræser ned over nøglerne i en given mappe, og så databinde til tabellen.

Jeg vil gerne lave et eksempel hvis du har brug for det.

Mvh
Avatar billede arne_v Ekspert
18. august 2004 - 19:40 #4
Et simpelt eksempel:

using System;
using Microsoft.Win32;

class MainClass
{
    public static void Main(string[] args)
    {
        RegistryKey dir = Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("ASP.NET").OpenSubKey("1.1.4322.0");
        String[] vals = dir.GetValueNames();
        foreach(string v in vals)
        {
            string data = (string)dir.GetValue(v);
            Console.WriteLine(v + " = " + data);
        }
    }
}
Avatar billede arne_v Ekspert
18. august 2004 - 19:40 #5
Og jeg har ikke den fjerneste anelse hvordan man putter det i en DataGrid.
Avatar billede snepnet Nybegynder
18. august 2004 - 19:56 #6
Du kan gøre det sådan her :

private void ReadRegistry()
{
    RegistryTable table = new RegistryTable();

    RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
    string[] vals = regKey.GetValueNames();
   
    foreach(string key in vals)
    {
        DataRow dr = table.NewRow();
        dr["Key"] = key;
        dr["Value"] = regKey.GetValue(key);
        table.Rows.Add(dr);
    }

    Registry.CurrentUser.Close();

    DataGrid1.DataSource = table;
    DataGrid1.DataBind();
}

Og definere tabellen sådan her :

public class RegistryTable : DataTable
{
    public RegistryTable() : base("registry")
    {
        this.Columns.Add("Key", typeof(string));
        this.Columns.Add("Value", typeof(string));
    }
}
Avatar billede 4u2x Nybegynder
18. august 2004 - 20:57 #7
jeg havde allerede oprettet en datagrid som vises så snart programmet blev startet op... det hedder "dataGrid1" - hvordan kan jeg implementere 'snepnet' kode (den sidste)?

her er dens kode:

this.dataGrid1.DataMember = "";
this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid1.Location = new System.Drawing.Point(16, 24);
this.dataGrid1.Name = "dataGrid1";
this.dataGrid1.Size = new System.Drawing.Size(256, 136);
this.dataGrid1.TabIndex = 0;
Avatar billede arne_v Ekspert
18. august 2004 - 21:02 #8
Nu er jeg total GUI ignorant med hvis du erstatter:

DataGrid1.DataSource = table;
DataGrid1.DataBind();

med:

this.dataGrid1.DataSource = table;
this.dataGrid1.DataBind();

?
Avatar billede 4u2x Nybegynder
18. august 2004 - 21:12 #9
skal jeg putte

public class RegistryTable : DataTable
{
    public RegistryTable() : base("registry")
    {
        this.Columns.Add("Key", typeof(string));
        this.Columns.Add("Value", typeof(string));
    }
}


foran den anden kode ?  den siger nemlig at RegistryTable allerede er defineret...?
Avatar billede snepnet Nybegynder
18. august 2004 - 21:13 #10
Du kan bare lade din initialisering af griddet stå, og så tilføje:
this.dataGrid1.DataSource = table nederst i metoden.
du kan så kalde den fra hvor du har lyst.

private void FillGrid()
{
    RegistryTable table = new RegistryTable();

    RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
    string[] vals = regKey.GetValueNames();

    foreach(string key in vals)
    {
        DataRow dr = table.NewRow();
        dr["Key"] = key;
        dr["Value"] = regKey.GetValue(key);
        table.Rows.Add(dr);
    }

    Registry.CurrentUser.Close();

    // det her skulle være tilstrækkeligt
    dataGrid1.DataSource = table;
}

Mvh
Avatar billede snepnet Nybegynder
18. august 2004 - 21:15 #11
Du kan nærmest smide RegistryTable hvor det skal være, men det kan være du har noget der hedder det samme ?!?
Prøv med et andet navn :

public class SomeTable: DataTable
{
    public SomeTable() : base("registry")
    {
        this.Columns.Add("Key", typeof(string));
        this.Columns.Add("Value", typeof(string));
    }
}
Avatar billede snepnet Nybegynder
18. august 2004 - 21:16 #12
Du skal så lige huske at ændre det der hvor du bruger den også :

private void FillGrid()
{
    SomeTable table = new SomeTable();

    RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
    string[] vals = regKey.GetValueNames();

    foreach(string key in vals)
    {
        DataRow dr = table.NewRow();
        dr["Key"] = key;
        dr["Value"] = regKey.GetValue(key);
        table.Rows.Add(dr);
    }

    Registry.CurrentUser.Close();

    // det her skulle være tilstrækkeligt
    dataGrid1.DataSource = table;
}
Avatar billede 4u2x Nybegynder
18. august 2004 - 21:17 #13
snepnet > hvis jeg gør det der siger den følgende:

The name 'table' does not exist in the class or namespace

The type or namespace name 'RegistryTable' could not be found (are you missing a using directive or an assembly reference?)
Avatar billede snepnet Nybegynder
18. august 2004 - 21:20 #14
så virker det som om du har lavet RegistryTable uden for dit namespace måske...
kan du ikke vise den kode du har ?
Avatar billede 4u2x Nybegynder
18. august 2004 - 21:27 #15
har sat denne her kode lige efter de koder som skaber handlinger når jeg klikker på knapper:

private void FillGrid()
        {
            RegistryTable table = new RegistryTable();

            RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
            string[] vals = regKey.GetValueNames();

            foreach(string key in vals)
            {
                DataRow dr = table.NewRow();
                dr["Key"] = key;
                dr["Value"] = regKey.GetValue(key);
                table.Rows.Add(dr);
            }

            Registry.CurrentUser.Close();

            // det her skulle være tilstrækkeligt
            dataGrid1.DataSource = table;
        }


Men den skal jo aktiveres automatisk når min 'dataGrid1' er fremme. Så jeg skal vel skrive en kode inde der hvor den aktiverer/definerer min 'dataGrid1' ?

Mere har jeg ikke skrevet/tilføjet i mine koder til dette her.
Avatar billede snepnet Nybegynder
22. august 2004 - 00:33 #16
for hulen... har ikke set din besked før nu. det må du undskylde.

jeg forstår ikke helt hvad du mener med at du har sat "denne kode efter de koder som skaber handlinger"....
Mener du at du kalder FillGrid() efter hver handling ?

har du stadig problemer med at kompilere koden ?
Avatar billede 4u2x Nybegynder
22. august 2004 - 02:35 #17
jeg ved ikke om den aktiveres automatisk koden, jeg har íhvertfald ikke tilføjet en knap eller lign. til FillGrid()

hele FillGrid() koden har jeg lagt i samme liste som alle de funktioner som laver en handling hvis man trykker på noget.

Det store problem er pt:
The name 'table' does not exist in the class or namespace

The type or namespace name 'RegistryTable' could not be found (are you missing a using directive or an assembly reference?)

De 2 problemer skal løses først, bagefter må vi se om det hele så virker som det skal :)

Håber du/I har en ide til hvordan det her løses :)
Avatar billede arne_v Ekspert
22. august 2004 - 09:51 #18
"The name 'table' does not exist in the class or namespace"

table erklæres her:

  RegistryTable table = new RegistryTable();

du kan selvfølgelig ikke bruge table udenfor FillGrid metoden.

Men muligvis skyldes fejlen næste fejl:

"The type or namespace name 'RegistryTable' could not be found (are you missing a using directive or an assembly reference?)"

Du har en xxxxx.cs fil med et indhold som:

namespace Yyyyy
{
  public class Zzzzz : System.Windows.Forms.Form
  {
      ...
  }
}

den skal ædres til:

namespace Yyyyy
{
  public class RegistryTable: DataTable
  {
    public RegistryTable() : base("registry")
    {
        this.Columns.Add("Key", typeof(string));
        this.Columns.Add("Value", typeof(string));
    }
  }
  public class Zzzzz : System.Windows.Forms.Form
  {
    ...
  }
}
Avatar billede 4u2x Nybegynder
22. august 2004 - 13:44 #19
Den kompiler fint nu, men nu får jeg denne fejl når jeg vil starte programmet:


An unhandled exception of type 'System.Resources.MissingManifestResourceException' occurred in mscorlib.dll

Additional information: Could not find any resources appropriate for the specified culture (or the neutral culture) in the given assembly.  Make sure "Form1.resources" was correctly embedded or linked into assembly "Systemworker".
baseName: Form1  locationInfo: Systemworker.Form1  resource file name: Form1.resources  assembly: Systemworker, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null
Avatar billede snepnet Nybegynder
22. august 2004 - 13:46 #20
underligt.... bruger du din ressourcefil til noget ?
hvis du ikke selv har skrevet noget i den skulle du bare kunne slette den. vs opretter selv en ny hvis den får lyst ;o)
mvh
Avatar billede 4u2x Nybegynder
22. august 2004 - 14:05 #21
har brugt debugger programmet til at finde fejlen og den highlighter denne linje:

this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));


jeg har lavet en notifyicon og contextmenu så mit program kan ligge nede i system tray når den er minimeret så den ikke fylder plads på proceslinjen...
Avatar billede snepnet Nybegynder
22. august 2004 - 14:08 #22
det ser ud til at du bare skal sørge for at dine andre klasser skal flyttes ned under din formklasse i dit modul :
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q318603
Avatar billede 4u2x Nybegynder
22. august 2004 - 14:12 #23
glemte vist lige at sige, at jeg ikke er 100% færdig med notifyicon og contextmenu'en, men at det ikke gav nogen problemer når jeg skulle starte det op..

prøvede lige at fjerne linjen som den gav skylden, og nu starter programmet fint... men vil dog stadig gerne have mit notifyicon til at virke også :-/

Der ikke tilføjet i datagrid'en kan jeg se når jeg starter programmet op (har husket at ændre adressen til hvor den skal hente fra), nogen ideer til hvorfor der ikke bliver skrevet noget?
Avatar billede snepnet Nybegynder
22. august 2004 - 14:14 #24
Fik du ikke denne :
http://www.eksperten.dk/spm/530664#rid4868669
(det ser ud til at du bare skal sørge for at dine andre klasser skal flyttes ned under din formklasse i dit modul :
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q318603)
Avatar billede 4u2x Nybegynder
22. august 2004 - 14:15 #25
den som loader hele programmet starter kun den ene af de her


static void Main()
        {
            Application.Run(new Form1());
        }



Eksempel:


public class RegistryTable: DataTable
  {
    public RegistryTable() : base("registry")
    {
        this.Columns.Add("Key", typeof(string));
        this.Columns.Add("Value", typeof(string));
    }
  }
  public class Form1 : System.Windows.Forms.Form
  {
    ...
  }


og FillGrid() har jeg lagt i Form1
Avatar billede snepnet Nybegynder
22. august 2004 - 14:18 #26
jamen problemet er netop, at RegistryTable-klassen kommer før Form1-klassen.
du skal bare flytte den nedenunder.
Avatar billede snepnet Nybegynder
22. august 2004 - 14:19 #27
public class Form1 : System.Windows.Forms.Form
  {
    ...
  }
 
  public class RegistryTable: DataTable
  {
    public RegistryTable() : base("registry")
    {
        this.Columns.Add("Key", typeof(string));
        this.Columns.Add("Value", typeof(string));
    }
  }
Avatar billede 4u2x Nybegynder
22. august 2004 - 14:30 #28
har flyttet det nedenunder nu, men skal jeg ikke aktiverer den ligesom man gør her:

static void Main()
        {
            Application.Run(new Form1());
        }


så det ser sådan her ud?

static void Main()
        {
            Application.Run(new Form1());
Application.Run(new RegistryTable());
        }
Avatar billede snepnet Nybegynder
22. august 2004 - 14:33 #29
nej overhovedet ikke.

du skal bare oprette en instans af typen når du skal bruge den :


private void FillGrid()
{
  // her opretter du en instans af type RegistryTable
  RegistryTable table = new RegistryTable();
 
  ...
}

Og denne metode skulle så meget gerne ligge i din Form1-klasse.
Avatar billede 4u2x Nybegynder
22. august 2004 - 14:41 #30
det eneste som ligger af spor i Form1 er:

private void FillGrid()
        {
            RegistryTable table = new RegistryTable();

            RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
            string[] vals = regKey.GetValueNames();

            foreach(string key in vals)
            {
                DataRow dr = table.NewRow();
                dr["Key"] = key;
                dr["Value"] = regKey.GetValue(key);
                table.Rows.Add(dr);
            }

            Registry.LocalMachine.Close();

            // det her skulle være tilstrækkeligt
            dataGrid1.DataSource = table;
        }


mere har jeg ikke tilføjet i den.

Og det virker ikke :-/
Avatar billede snepnet Nybegynder
22. august 2004 - 14:43 #31
Hvor kalder du FillGrid-metoden fra ?
Avatar billede snepnet Nybegynder
22. august 2004 - 14:44 #32
Jeg tror måske det ville være en god idé hvis du kastede et blik på artikler som disse (bare googlet frem) :

http://www.developerfusion.com/show/3821/1/
http://www.c-sharpcorner.com/Code/2003/Dec/OOPS%20In%20CSharp%201.0.asp

Men der er oxilioner af den slags artikler på nettet tror jeg - så det er bare at søge :o)
Avatar billede 4u2x Nybegynder
22. august 2004 - 14:44 #33
min dataGrid1 ser således ud:

            // dataGrid1
            //
//            this.dataGrid1.DataMember = "";
            this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
            this.dataGrid1.Location = new System.Drawing.Point(16, 24);
            this.dataGrid1.Name = "dataGrid1";
            this.dataGrid1.Size = new System.Drawing.Size(256, 136);
            this.dataGrid1.TabIndex = 0;
Avatar billede snepnet Nybegynder
22. august 2004 - 14:47 #34
Du skal kalde FillGrid() et eller andet sted fra før der sker noget.
Lav eventuelt en knap på formen, og dobbeltklik på den.
så skulle du får oprettet en handler til det event, og du kan så i handlere skrive
FillGrid();

Så hele metoden kommer til at se ud på denne måde :

private void btnbutton1_Click(object sender, System.EventArgs e)
{
    FillGrid();
}
Avatar billede snepnet Nybegynder
22. august 2004 - 14:52 #35
Prøv med komplet kode her.

using System;
using Microsoft.Win32;
using System.Data;
using System.Windows;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace WinEXP
{
    public class GridForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.DataGrid dataGrid2;
        private System.Windows.Forms.Button btnbutton1;
        private System.ComponentModel.Container components = null;

        public GridForm()
        {
            InitializeComponent();
        }

        [STAThread]
        static void Main()
        {
            Application.Run(new GridForm());           
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        private void ReadRegistry()
        {
            RegistryTable table = new RegistryTable();

            RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
            string[] vals = regKey.GetValueNames();

            foreach(string key in vals)
            {
                DataRow dr = table.NewRow();
                dr["Key"] = key;
                dr["Value"] = regKey.GetValue(key);
                table.Rows.Add(dr);
            }

            Registry.CurrentUser.Close();   

            dataGrid2.DataMember = "";
            dataGrid2.DataSource = table;
        }

        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            this.dataGrid2 = new System.Windows.Forms.DataGrid();
            this.btnbutton1 = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.dataGrid2)).BeginInit();
            this.SuspendLayout();
            //
            // dataGrid2
            //
            this.dataGrid2.DataMember = "";
            this.dataGrid2.HeaderForeColor = System.Drawing.SystemColors.ControlText;
            this.dataGrid2.Location = new System.Drawing.Point(16, 64);
            this.dataGrid2.Name = "dataGrid2";
            this.dataGrid2.Size = new System.Drawing.Size(448, 344);
            this.dataGrid2.TabIndex = 0;
            //
            // btnbutton1
            //
            this.btnbutton1.Location = new System.Drawing.Point(16, 424);
            this.btnbutton1.Name = "btnbutton1";
            this.btnbutton1.TabIndex = 1;
            this.btnbutton1.Text = "button1";
            this.btnbutton1.Click += new System.EventHandler(this.btnbutton1_Click);
            //
            // GridForm
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(480, 469);
            this.Controls.Add(this.btnbutton1);
            this.Controls.Add(this.dataGrid2);
            this.KeyPreview = true;
            this.Name = "GridForm";
            this.Text = "GridForm";
            ((System.ComponentModel.ISupportInitialize)(this.dataGrid2)).EndInit();
            this.ResumeLayout(false);

        }
        #endregion

        private void btnbutton1_Click(object sender, System.EventArgs e)
        {
            ReadRegistry();
        }
    }

    public class RegistryTable : DataTable
    {
        public const string TblRegistry = "TblRegistry";

        public RegistryTable() : base(TblRegistry)
        {
            this.Columns.Add("Key", typeof(string));
            this.Columns.Add("Value", typeof(string));
        }
    }
}
Avatar billede 4u2x Nybegynder
22. august 2004 - 14:54 #36
nice :D

nu henter den værdierne :)

hvis jeg ligger en bunke mere point i puljen, ville du så have lyst til at vise mig hvordan man gemmer alle værdierne som er i dataGrid1, dvs at den erstatter de gamle værdier i stien hvor værdierne hentes fra, og indsætter de nye..?
Avatar billede snepnet Nybegynder
22. august 2004 - 15:02 #37
det bliver lige lidt senere... skal lige i byen.
Avatar billede snepnet Nybegynder
02. oktober 2004 - 03:17 #38
crap... denne her har jeg også glemt - undskyld.
jeg er lidt på oprydningsrunde (så den slags her ikke sker for tit :o), så du får et svar her, hvis jeg har været behjælpelig :o)
mvh
(og du spørger bare hvis du stadig har noget til det)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester